<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <atom:link href="http://evantravers.com/feed.xml" rel="self" type="application/rss+xml" />
  <title>trv.rs</title>
  <link>http://evantravers.com</link>
  <description>All blog posts by Evan Travers</description>
  <language>en-us</language>
  <generator>Tableau v0.30.0</generator>
    <item>
       <title>Using Kanata for Homerow Mods</title>
       <link>http://evantravers.com/articles/2026/08/11/using-kanata-for-homerow-mods</link>
       <pubDate>Tue, 11 Aug 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/08/11/using-kanata-for-homerow-mods</guid>
       <description><![CDATA[ <p>I like my <a href="https://evantravers.com/articles/2023/05/27/5x3-3-keyboard-layout/#homerow-mods">homerow mods</a>. I really wanted a way to have that ergonomic advantage in the (admittedly rare) times that I'm at my laptop but don't have one of my external keyboards out<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>.</p>
<p>For years Karabiner has been the tool I've used for remapping keys and modifying input on OSX. The past few months I've been playing with <a href="https://github.com/jtroo/kanata">kanata</a>. Karabiner is still the simplest and best way to handle simple modifications, but if you want to track the configuration in git or do something more complex like homerow mods, <code>kanata</code> is better.</p>
<p>My <a href="https://github.com/evantravers/dotfiles/blob/5d3fe79a63652142393ac66074fb45b7cbe4463b/users/evantravers/kanata.nix">kanata config is a nix module</a>. It mostly installs kanata and <em>just</em> the karabiner-driver so that it can do input monitoring on OSX. It also adds a convenience script for switching layouts (so I can disable homerow mods if I wanted to play Factorio, for instance.)</p>
<p>I used AI quite a bit to build my layout. I pointed it at my <a href="https://github.com/evantravers/zmk-config/">zmk-config</a> folder, and told it I wanted the <a href="https://github.com/evantravers/dotfiles/blob/5d3fe79a63652142393ac66074fb45b7cbe4463b/users/evantravers/.config/kanata/macbook.kbd">homerow mods as a kanata layout</a>, and after a little fixing, it was pretty much done. (I'm still flirting with an entire 5x3_2 layout on a macbook pro, using <code>r</code> and <code>u</code> has home keys. Wild!)</p>
<p>All of this has been working very well for a while, and I'm very pleased.</p>
<p>When there's an update to nix, it all breaks. The running <code>kanata</code> executable is no longer symlinked to the exact same location in the Nix store. I then just have to:</p>
<ol>
<li>In the terminal: <code>open /run/current-system/sw/bin/</code>, select <code>kanata</code> and <code>⌘-C</code>.</li>
<li>go to <code>Settings → Input Monitoring</code> and remove Kanata, click the plus for Add, and <code>⌘-V</code> to paste the correct new link. Do the same for <code>Settings → Accessibility</code>.</li>
<li>In the terminal: <code>sudo launchctl kickstart -k system/org.kanata</code></li>
</ol>
<p>You are fine till the next time it breaks. 🤷</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Mostly this is while I'm using my <a href="https://evantravers.com/articles/2025/03/20/portable-standing-desk/">portable standing desk</a> while working out, or at a small table at a coffeeshop. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Sunday Drop Biscuits</title>
       <link>http://evantravers.com/articles/2026/07/26/sunday-drop-biscuits</link>
       <pubDate>Sun, 26 Jul 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/07/26/sunday-drop-biscuits</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2026/07/biscuit-14.jpg"></p><div itemscope itemtype="https://schema.org/Recipe">
<p itemprop="name" style="display:none">Sunday Drop Biscuits</p>
<p>The past few months I've been trying to set apart the sabbath. It's hard for my little kids to look forward to the day of rest so I'm trying to hoard some special things for them: games we play on the afternoon, nerf battles that are reserved for Sunday afternoon… and every morning there are biscuits. This morning my 1YO clapped her hands with joy as soon as she saw them, so I'll probably keep this up as long as she approves.</p>
<p>This recipe started with a <a href="https://bakerbettie.com/5-ingredient-basic-drop-biscuits/">bakerbettie recipe</a>, but I have tweaked it for weekly efficiency. You should be able to wrap up the prep before your oven starts pre-heating and have plenty of time to make coffee or grits while they bake. (These days, I've been making a smoothie for the kids while it bakes.)</p>
<h2><a href="#ingredients" aria-hidden="true" class="anchor" id="ingredients"></a>Ingredients</h2>
<ul itemprop="recipeIngredient">
<li itemprop="recipeIngredient">2 cups all-purpose flour</li>
<li itemprop="recipeIngredient">1 tablespoon baking powder</li>
<li itemprop="recipeIngredient">½ tablespoon of rough cut salt</li>
<li itemprop="recipeIngredient">1 stick unsalted butter, very cold and cut into small pieces</li>
<li itemprop="recipeIngredient">1 cup milk or buttermilk</li>
</ul>
<h2><a href="#instructions" aria-hidden="true" class="anchor" id="instructions"></a>Instructions</h2>
<ol itemprop="recipeInstructions">
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Preheat the oven to 450°F/230°C.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">In a large bowl, whisk together flour (2 cups), baking powder (1 tablespoon), and salt (½ tablespoon) together.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Add the pieces of cold butter and cut into the dry ingredients with a pastry cutter or fork until the consistency of coarse meal.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Add 1 cup of milk and stir just until combined. If the batter is very dry, add a tiny splash of milk until the clumps barely sticks together. Do not over-mix.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Drop large mounds into the buttered cast iron skillet. The mounds can be touching on the sides.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Bake for 16-20 minutes until golden brown.</span></li>
<li itemprop="recipeInstructions" itemscope itemtype="https://schema.org/HowToStep"><span itemprop="text">Sprinkle with flaky salt.</span></li>
</ol>
<h2><a href="#every-part-of-the-biscuit-buffalo" aria-hidden="true" class="anchor" id="every-part-of-the-biscuit-buffalo"></a>Every Part of the Biscuit Buffalo</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2026/07/biscuit-2.jpg">
    <figcaption>Minus a dough-cutter I forgot to <a href="https://knolling.org/what-is-knolling">knoll</a> out here, this is all the "hardware" you need.</figcaption>
</figure>
<p>Here's a few things I've learned to make this a little easier to repeat week upon week:</p>
<p>As soon as you wake up, throw the stick of unsalted butter in the freezer since you don't remember to do that Saturday night.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2026/07/biscuit-4.jpg">
    <img src="https://images.evantravers.com/articles/2026/07/biscuit-7.jpg">
</figure>
<p>Use a coarse cheese grater to swiftly cut down the cold unsalted butter onto a plate or ingredient scraper. Get all the butter out with a butter knife.</p>
<img src="https://images.evantravers.com/articles/2026/07/biscuit-6.jpg">
<p>Save the butter paper to schmear the butter on your cast iron pan.</p>
<img src="https://images.evantravers.com/articles/2026/07/biscuit-9.jpg">
<p>I use a small wooden spoon that works perfectly with the TB spoon measure to dispense the lumpy dough.</p>
<img src="https://images.evantravers.com/articles/2026/07/biscuit-12.jpg">
<p>When you are done, put all the bits into the mixing bowl, squirt soap inside, and fill with water to make cleaning easy.</p>
<img src="https://images.evantravers.com/articles/2026/07/biscuit-13.jpg">
<p>It often works out that I'm done cleaning up and starting my coffee so that the last four minutes of the biscuit timer becomes the aeropress steep timer.</p>
</div> ]]></description>
    </item>
    <item>
       <title>NetNewsWire</title>
       <link>http://evantravers.com/articles/2026/06/25/netnewswire</link>
       <pubDate>Thu, 25 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/25/netnewswire</guid>
       <description><![CDATA[ <p>I've been using Reeder… for a long time. Maybe the longest running app on my phone… records say 2009. I admire Silvio so much, and Mela is now one of my most used apps.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2026/06/reeder.png">
    <figcaption>100% the most used app on any mobile device… for almost a decade!</figcaption>
</figure>
<p>After Reeder was pushed to Reeder Classic and he's focused on the new app, I've felt a little abandoned. Nothing has scratched that itch…</p>
<p>But I recently tried NetNewsWire, and I'm <em>loving</em> it. I was drawn by <a href="https://inessential.com/2026/06/15/netnewswire-status.html">that retirement post</a> that many of you read, but what has kept me is the sheer speed of the sync. I also really love the simple UI, and on mobile the &quot;next unread article&quot; button is 🧑‍🍳👌.</p>
<p>I do miss some things: I wish that I could watch the youtube subscriptions in app, I miss a quick shortcut share to Instapaper… and my fingers miss the keyboard shortcuts I've been using for nearly two decades. I also really wish that the list of RSS feeds had a search filter. I have 1000+ feeds and treat some of them as bookmarks.</p>
<p>NetNewsWire just works and answers my particular use case <em>so well</em>, I think it's just going to stick.</p> ]]></description>
    </item>
    <item>
       <title>How do I go back to the library?</title>
       <link>http://evantravers.com/articles/2026/06/21/how-do-i-go-back-to-the-library</link>
       <pubDate>Sun, 21 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/21/how-do-i-go-back-to-the-library</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I'm tired of my &quot;open a tab to the 'front page of the internet'&quot; behavior. When I first used the internet, I had a rich set of bookmarks that turned into RSS feeds. I used the internet like a library, not a tabloid. Now I just open up the &quot;front page&quot; and scarf down whatever tripe I'm served and I'm grateful for it. 🤮</p>
<p>So I've gone back to redirecting reddit and twitter to localhost.</p>
<p>Have any of you successfully dismantled your &quot;one stop shop of slop&quot; habits? How did you go about it?</p> ]]></description>
    </item>
    <item>
       <title>Can&#39;t Force Wisdom</title>
       <link>http://evantravers.com/articles/2026/06/15/cant-force-wisdom</link>
       <pubDate>Mon, 15 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/15/cant-force-wisdom</guid>
       <description><![CDATA[ <p>In <a href="https://www.esv.org/verses/Proverbs4:4">Proverbs 4:4</a> a father implores with his son to take hold of wisdom. The past three chapters assert that both parents have been providing a banquet of wisdom and highlight the advantages and dangers of living as a fool. What we don't see is these wise parents attempting a parenting technique or discipline strategy to force that wisdom into the son. They don't try, because it won't work. He implores the child to seize hold of the wisdom, to make it his own.</p>
<p>I have toddlers. This resonates with me.</p>
<p>It's also freeing. The patient, wise, &quot;example parent&quot; of Proverbs is resting in God's promises for his children, and patiently repeating and providing instruction in the hope of it taking hold. Even better, it's a generational story. At this moment the father in this story is recounting his own story, reminding his son that he too was once young man needing instructed. There's humility there.</p>
<p>I could use that attitude today.</p> ]]></description>
    </item>
    <item>
       <title>But Our Devenv Is In Another Repo</title>
       <link>http://evantravers.com/articles/2026/06/10/but-our-devenv-is-in-another-repo</link>
       <pubDate>Wed, 10 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/10/but-our-devenv-is-in-another-repo</guid>
       <description><![CDATA[ <p>For the past year of software consulting I've been using nix to define the development environments. I had been using flakes, but recently I've been using <a href="https://devenv.sh/">devenv.sh</a>. Devenv is a system on top of nix that makes creating common dev environment recipes a lot easier. Setting up a language, some dependencies, services… even <a href="https://devenv.sh/services/postgres/#servicespostgresinitialdatabases">setting up postgres and ensuring some databases are created</a> is a breeze.</p>
<p>There are several other similar nix-based dev-ex systems, but (so far that I can see) <code>devenv</code> is the only one that insists on using nix to configure it. So many others try to give you nix without making you write nix… which is a nice idea but in my limited experience is a handicap.</p>
<p>When you just <code>devenv init</code> and check in the resulting files, <code>devenv</code> works great. What I've been working through is &quot;what if you don't want to impose <code>devenv</code> on your whole team?&quot; As a contractor I don't really want to foist my development preferences on everyone else.</p>
<p>I <em>can</em> <code>.git/info/exclude</code> the <code>devenv</code> files. However last few projects I've been working are complex. Four or more repositories, env variables shared between two or three but not all, separate languages, constant motion… not tracking the dev environment in git loses a large part of why to use a tool like <code>devenv</code> in the first place.</p>
<p>Here's what I'm currently doing: I'm working a contract with a team that isn't using nix or devenv. Because I want to track the configuration in git and not just <code>.git/info/exclude</code> the important devenv files, I've been:</p>
<ol>
<li>Make a git repo to store the configurations in a sibling folder. I'll call this the Configuration Repo.
<ol>
<li><code>devenv init</code> in a sibling folder and tracking with git.</li>
<li>Defining all the repos/projects for my contract as <a href="https://devenv.sh/profiles/#referencing-config-in-profiles">profiles</a>…</li>
</ol>
</li>
</ol>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lib</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">  ...
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>:
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">packages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">acli</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">env</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CLAUDE_CONFIG_DIR</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;../.claude&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AWS_CONFIG_FILE</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;../.aws/config&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AWS_SHARED_CREDENTIALS_FILE</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;../.aws/credentials&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ENABLE_LSP_TOOL</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="19">
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">profiles</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">frontend</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="22">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">languages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="23">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">javascript</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="24">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="25">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="26">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="27">
</div><div class="line" data-line="28">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hosts</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="29">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;local.fake-company-name.com&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;127.0.0.1&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="30">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="31">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backend</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="34">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">languages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="35">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">javascript</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="36">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="37">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">package</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nodejs_24</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="38">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">npm</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="39">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="40">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="41">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="42">
</div><div class="line" data-line="43">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">packages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="44">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vscode-js-debug</span>
</div><div class="line" data-line="45">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="46">
</div><div class="line" data-line="47">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">certificates</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;local.fake-company-name.com&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="48">
</div><div class="line" data-line="49">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws-vault</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="50">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="51">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">profile</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;fake-company-name&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="52">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="53">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="54"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="55">
</div></code></pre>
<ol start="2">
<li>In the &quot;real&quot; Project Repo folder:
<ol>
<li><code>devenv init</code> and git excluding all files.</li>
<li>Deleting everything out of <code>devenv.nix</code> so that it's a &quot;bare&quot; file.</li>
<li>Then I setup the inputs and imports in <code>devenv.yaml</code>:</li>
</ol>
</li>
</ol>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># yaml-language-server: $schema=https://devenv.sh/devenv.schema.json</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span>:
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span>:
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">github:cachix/devenv-nixpkgs/rolling</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fake-company-name</span>:
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path:../fake-company-name-devenv/</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">profile</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">frontend</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowUnfree</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imports</span>:
</div><div class="line" data-line="11">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fake-company-name</span>
</div></code></pre>
<p>I used to trigger this using <code>direnv</code> with an <code>.envrc</code>, I'm currently playing with using <a href="https://devenv.sh/auto-activation/"><code>devenv</code>'s shell hook</a> and <code>devenv allow</code>. This makes it clearer where the ENV variables should live… now they all are forced into a devenv.nix. If they need to be secret I can still use my <code>.envrc</code> or I can use <code>devenv</code>'s new secrets system.</p>
<p>This works… but I've noticed a couple problems: I think that devenv treats the <code>.devenv</code> cache in the Project Repo as a source of truth, so when I update the Configuration Repo I often don't see changes until I <code>rm -rf .devenv</code> in the Configuration Repo.</p>
<p>I'm currently chatting in the discord to see if there's a better way to achieve what I want. So far… it's the best way… but it leaves something to be desired. While it stands up reliably and just works, it's resistant to change because of that local Project Repo cache. If I find something better I'll post it.</p> ]]></description>
    </item>
    <item>
       <title>Quick Look: Obsidian Notebook Navigator</title>
       <link>http://evantravers.com/articles/2026/06/08/quick-look-obsidian-notebook-navigator</link>
       <pubDate>Mon, 08 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/08/quick-look-obsidian-notebook-navigator</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2026/06/nn-desktop.png"></p><p>In my <a href="/articles/2026/06/01/using-obsidian-as-an-inbox">last post on Obsidian</a> I talked about the problem of getting an inbox to obsidian on mobile. What I haven't covered is processing and writing those captures.</p>
<p>While the reason to use Drafts.app is the quick capture, an underappreciated aspect is to have one location for all my &quot;in progress&quot; thoughts. So often in the years that Drafts was in my iOS dock a half-baked shower thought would progress into a blog post over the following weeks.</p>
<p>As I shifted to using Obsidian for all my mobile writing/note-taking I used the folder of time-stamped drafts for holding the thoughts, but getting to them and processing them wasn't very easy. I had a simple dataviewjs thing for viewing the folder in a <code>Inbox.md</code>:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">files</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vault</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getFiles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">startsWith</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;inbox/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stat</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ctime</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stat</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ctime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">items</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">await</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Promise</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">all</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">files</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">async</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">await</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vault</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">read</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preview</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\s</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\S</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">120</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preview</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dl</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">el</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;dl&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preview</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">items</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createEl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;dt&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createEl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cls</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;internal-link&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createEl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;dd&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preview</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;…&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>I'd just open the links in new tabs, review them, and had some shortcuts for deleting/moving them. Not great.</p>
<p>This past week, <a href="https://notebooknavigator.com/">Notebook Navigator</a> has replaced this dataview hack and made my Obsidian inbox a comfy place that is very Drafts.app-esque.</p>
<p><img src="https://images.evantravers.com/articles/2026/06/nn-inbox.png" alt="" /></p>
<p>Notebook Navigator is a rather extensive plugin and does way more than what I'm using it for… but for me just enabling it and disabling the built in Obsidian Files plugin has made a world of difference.</p>
<p>Now on mobile when I swipe over to the left sidebar, I typically see a list of recent documents. That's 95% usually one touch to the thing I'm looking for, but if not I can view the inbox folder as a list with previews.</p>
<p><img src="https://images.evantravers.com/articles/2026/06/nn-recent.png" alt="" /></p>
<p>Notebook Navigator (with some configuration) can support my journaling structure.</p>
<p><img src="https://images.evantravers.com/articles/2026/06/nn-settings.png" alt="" /></p>
<p>The Notebook Navigator Calendar feature is a <em>really</em> nice interface on mobile with quick access to my incrementally abstract journaling notes.</p>
<figure>
<img src="https://images.evantravers.com/articles/2026/06/nn-journal.png">
  <figcaption>Each of those UI elements links to the right thing!</figcaption>
</figure>
<p>The author of Notebook Navigator updates it frequently, with recent updates focusing on helping folks write long form work like Scrivener. If you've been wrestling with navigating your wiki, especially on mobile, give it a try.</p> ]]></description>
    </item>
    <item>
       <title>My OBS Setup</title>
       <link>http://evantravers.com/articles/2026/06/07/my-obs-setup</link>
       <pubDate>Sun, 07 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/07/my-obs-setup</guid>
       <description><![CDATA[ <p>Since I'm too cheap to pay for <a href="https://loom.com">loom.com</a> (which is a <em>great</em> product!) I have been using OBS to record videos to throw into Slack or YouTube for friends.</p>
<p>I know that OBS saves it's settings to <code>~/Library/Application Support/obs-studio</code> and I could backup my settings, but I have not yet done that, and so I have had to re-set up my settings lots of times.</p>
<p>Here is how I typically set up my OBS for simple screen shares:</p>
<ol>
<li>Add sources:
<ol>
<li><code>Video Capture Device</code> for iPhone Continuity Camera</li>
<li>Desktop Share (separate <code>MacOS Screen Capture</code> sources for laptop monitor than desk monitor!)
<ol>
<li>Settings for Desktop Share: <code>Hide OBS from Capture</code> ☑️</li>
</ol>
</li>
</ol>
</li>
<li>Adjust gain to match either AirPods or my <a href="https://evantravers.com/articles/2025/10/06/hollyland-lark-m2s-lavalier/">lavalier</a>.</li>
<li>Set canvas to size of biggest monitor: <code>Settings</code> → <code>Video</code> → <code>Base (Canvas) Resolution</code> → <code>3480x2160</code></li>
<li>Duplicate the default scene to create two scenes.
<ul>
<li>Share: Full screen screen share with small camera in bottom right</li>
<li>Talk: Full screen camera view</li>
</ul>
</li>
<li>Set Talk be full-screen camera by reordering sources and adjusting size.</li>
<li>Set auto switch: <code>Tools</code> → <code>Automatic Scene Switcher</code>:
<ul>
<li>When no window matches: Switch to Share</li>
<li>When OBS: Talk</li>
</ul>
</li>
<li><code>Settings</code> → <code>Output</code> → <code>Recording</code> → <code>Recording Quality</code>: <code>Indistingushable, Large File Size</code></li>
</ol>
<p>I think that’s it! I'll adjust this as I find the other settings. 😂</p> ]]></description>
    </item>
    <item>
       <title>Using Obsidian as an Inbox</title>
       <link>http://evantravers.com/articles/2026/06/01/using-obsidian-as-an-inbox</link>
       <pubDate>Mon, 01 Jun 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/06/01/using-obsidian-as-an-inbox</guid>
       <description><![CDATA[ <p>It's been about a year since I opened Drafts.</p>
<p>I've always been a huge of Drafts. It is <strong>the best</strong> Apple ecosystem note taking tool. However I have two problems: I want to not be 100% beholden to the apple ecosystem, and I want to work in Obsidian. While I used Drafts as my inbox to Obsidian, I pretty much ended up doing all my writing in Drafts because it was so convenient, and therefore missed out on links and research.</p>
<p>I've tried a number of quick capture options:</p>
<ul>
<li>Widgets for Obsidian</li>
<li>Obsidian Quick Capture</li>
<li>Shortcuts</li>
</ul>
<p>In the end, the two paths available are:</p>
<ul>
<li>use a obsidian URL-scheme (requires the app to boot, ensures that the note syncs)</li>
<li>save to a file (fast, but won't sync until the next app launch)</li>
</ul>
<p>I've used all three of the above apps, the are all decent, but none of them are Drafts. I usually choose to use those apps to save individual notes to an <code>inbox</code> folder named by a timestamp, and use other workflows/tools to merge/move the notes to a place. I was just appending to Daily note, but I often found that if sync didn't catch it, I'd lose notes in a merge.</p>
<p>Honestly, if I could guarantee that every Draft was synced to a folder in iCloud, and that folder was the <code>inbox</code> folder in my wiki, I'd probably do that.</p>
<p>For now, the lack of decent digital capture means that I have spent more time capturing in my bullet journal, and honestly that's not a bad thing at all. All roads may rotate back to the hipster PDA at the end.</p> ]]></description>
    </item>
    <item>
       <title>Ferris Sweep Review</title>
       <link>http://evantravers.com/articles/2026/05/29/ferris-sweep-review</link>
       <pubDate>Fri, 29 May 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/05/29/ferris-sweep-review</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2026/05/ferris.jpg"></p><div class="admonition tldr">
<p>I've been using a Crab Broom (Ferris Sweep) 3x5_2 keyboard for almost a year as my daily driver. I really like the exaggerated finger arch and dropped fifth column placement for comfortable typing.</p>
</div>
<p>After writing about <a href="https://evantravers.com/articles/2024/03/22/alternatives-to-the-corne-ish-zen/">the alternatives to the Zen</a>, I kept looking at the Ferris Sweep. Having spent a lot of time using the Kyria and Atreus keyboards, the finger arch on the Corne felt kinda shallow. I fight to find a comfy angle: either my thumb or my pinky always feels a little stretched. Tenting helps a lot, but it's not quite right.</p>
<p>Prior to the purchase I experimented with dropping a thumb key on the zen to match the 3x5_2 that the Ferris uses, mostly using combos to handle the roles the outer thumb keys had managed. I found it pretty natural, so I pulled the trigger and waited to build the kit.</p>
<p><img src="https://raw.githubusercontent.com/evantravers/zmk-config/f81d9e63f80913ccc146ac6ff17baf7d408ac362/keymap-drawer/cradio.svg" alt="layout diagram" /></p>
<p>It wasn't a particulary difficult build now that I've built a few of these, but it was the first time I'd dealt with the LiPo batteries.</p>
<p><img src="https://images.evantravers.com/articles/2026/05/battery.jpg" alt="battery" /></p>
<p>I of course <a href="https://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/">slapped some of my magsafe stickers</a> on it, and I've been enjoying ever since.</p>
<p>I started with <a href="https://lowprokb.ca/collections/keycaps/products/ldsa-low-profile-blank-keycaps">Darryl's LDSA caps</a> which were very nice.</p>
<p><img src="https://images.evantravers.com/articles/2026/05/ldsa.jpg" alt="ldsa" /></p>
<p>I recently added the <a href="https://3dkeycap.com/products/klp-choc-keycap-set-low-profile-ergonomic-sculpted-keycaps">KLP Lame profile switches from 3dkeycap</a>, and it does give a great &quot;dish&quot; feel that makes the keys seem even closer together and very comfortable.</p>
<p><img src="https://images.evantravers.com/articles/2026/05/lame.jpg" alt="lame" /></p>
<p>While the Zen is very solid and feels more premium, I really love the finger curve and placement of the Ferris. I don't feel like I need to adjust the angle throughout the day, it's lovely.</p> ]]></description>
    </item>
    <item>
       <title>Rebuilding My Blog In Elixir</title>
       <link>http://evantravers.com/articles/2026/05/24/rebuilding-my-blog-in-elixir</link>
       <pubDate>Sun, 24 May 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/05/24/rebuilding-my-blog-in-elixir</guid>
       <description><![CDATA[ <p>A recent bout of a hacking cough gave me plenty of late nights to hack… and as a result this blog has a new architecture. 🎉</p>
<h2><a href="#the-problems" aria-hidden="true" class="anchor" id="the-problems"></a>The Problems</h2>
<p>I had accumulated several problems that I wanted to solve:</p>
<ul>
<li>My blog repo had ballooned to 2GB, which meant checking it out on my phone to edit was tedious.</li>
<li>I wanted to compose/think/write in my plaintext wiki, which means I can use nvim on desktop and Obsidian on mobile.</li>
<li>I write in a networked wiki, but publish isolated posts.</li>
<li>I just like Elixir. 🤷</li>
</ul>
<p>I started thinking about this a long time ago. Some of y'all <a href="https://evantravers.com/articles/2024/12/20/merging-my-creativity-system-and-blog/">helped me write a script to export my blog posts (and their git history) and merge it into my wiki repo</a>.</p>
<p>But I just didn't have all the solutions yet.</p>
<h2><a href="#finding-tableau" aria-hidden="true" class="anchor" id="finding-tableau"></a>Finding Tableau</h2>
<p>For <em>years</em>, I considered writing my own static site generator. I wanted something that used the <a href="https://hexdocs.pm/libgraph/0.16.0/Graph.html#new/1">libgraph</a> module, and had a similar system to Phoenix's plugs. Then I found <a href="https://hexdocs.pm/tableau/Tableau.html">Tableau</a>. 😍</p>
<p>With all the pieces ready…</p>
<ol>
<li>I made a quick images repo and deployed to cloudflare R2. Lots of space savings: it doesn't need <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">the history</a>.</li>
<li>I ported over the layout from .erb to .eex. I spent some time trying .heex <a href="https://github.com/elixir-tools/tableau/discussions/176">but got stuck</a>.</li>
<li>I modified the merge script I had written earlier, tested it against a folder in <code>wiki</code>, and started fixing bugs.</li>
</ol>
<p>But now I had a <em>huge</em> list of custom features that I've accumulated over the years, and Tableau has the answer.</p>
<h2><a href="#tableau-extensions" aria-hidden="true" class="anchor" id="tableau-extensions"></a>Tableau Extensions</h2>
<p>Every single feature in Tableau is actually an Extension. Pages, Posts, RSS… all using the same <a href="https://hexdocs.pm/tableau/Tableau.Extension.html">Extensions API</a>.</p>
<p>Here's an example of an Extension that waits for <code>Tableau.PostExtension</code> to push a <code>posts</code> object into the graph, then generates my Series pages:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">defmodule</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers.SeriesExtension</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moduledoc</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;&quot;
</div><div class="line" data-line="3">  Creates an list pages for series
</div><div class="line" data-line="4">  &quot;&quot;&quot;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">use</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Tableau.Extension</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">priority: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">300</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers.Article</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># token = the &quot;graph&quot; object</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># get every post out of the graph, find the series</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># save them back as a new entry in that %&lbrace;Map&rbrace;</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">impl </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Tableau.Extension</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pre_build</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">posts</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">has_key?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">post</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">post</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># returns &lbrace; :series_key, [list_of_matching_posts ]&rbrace;</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="24">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="25">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="27">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="28">
</div><div class="line" data-line="29">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># For every series, make a %Tableau.Page and insert it into the graph</span>
</div><div class="line" data-line="30">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">impl </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Tableau.Extension</span>
</div><div class="line" data-line="31">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pre_render</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="32">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pages</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="33">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span>
</div><div class="line" data-line="34">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">posts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="35">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Tableau.Page</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="36">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parent: </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers.PageLayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="37">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">permalink: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/articles/series/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Slug</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slugify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="38">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template: </span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">assigns</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="39">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~</span>H&quot;&quot;&quot;
</div><div class="line" data-line="40">            <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers.Article</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series_header</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">page</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;</span>
</div><div class="line" data-line="41">            <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article__list  h-feed</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="42">              <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">post</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;-</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">page</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">posts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:desc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="43">                <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="44">                  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h-entry</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="45">                    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers.Article</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">header</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">post</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;</span>
</div><div class="line" data-line="46">                  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="47">                <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="48">              <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;</span>
</div><div class="line" data-line="49">            <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="50">            &quot;&quot;&quot;
</div><div class="line" data-line="51">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="52">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts:
</div><div class="line" data-line="53"></span>            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="54">              <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="55">              <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">posts: </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Travers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">public_posts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">posts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="56">              <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">permalink: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/articles/series/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Slug</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slugify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="57">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="58">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="59">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="60">
</div><div class="line" data-line="61">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Tableau.Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="62">
</div><div class="line" data-line="63">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="64">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="65"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Working with Opencode and Claude<sup class="footnote-ref"><a href="#fn-claude" id="fnref-claude" data-footnote-ref>1</a></sup>, I implemented:</p>
<ul>
<li>Calendar pages for Years and Months of articles.</li>
<li>RSS Enrichment Extension to decorate certain articles.</li>
<li>Series for grouping sequences of articles</li>
<li>Git changelog for getting the history of changes to an article (preserved across repos thanks to y'all!)</li>
<li>Wiki (more on this in a moment.)</li>
</ul>
<p>I also made a couple custom plugins to <a href="https://hexdocs.pm/mdex/plugins.html">MDEx</a> for my youtube and admonition shortcodes<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup>.</p>
<h2><a href="#publishing-the-graph" aria-hidden="true" class="anchor" id="publishing-the-graph"></a>Publishing the Graph</h2>
<p>Every blog post is actually a small network of notes and thoughts. We draw a circle around the scope of what we want to discuss, and try to arrange the thoughts into something readable.</p>
<p>For years I've composed in one note, and included related notes as footnotes, or sometimes rearranged notes as series of posts, but it never works <em>quite</em> right. Worse yet, I now have a duplicate note in the blog and wiki. As an ugly solution, I've just &quot;deprecated&quot; the wiki note and it's now an empty note with a bare link to the published post.</p>
<p>Not anymore!</p>
<p>I wrote a Tableau.Extension and MDEx plugin to together create my dream publishing system. The Wiki extension crawls my wiki for files marked <code>post: true</code> or with an arbitrary <code>permalink: </code> frontmatter. Then it follows those rules! The MDEx plugin &quot;cleans&quot; the document of broken links, and if there's a published page, it replaces the <code>[[wikilink]]</code> with the real link.</p>
<p>Under this design I have so much freedom. I can post an individual idea as a blog post, that auto updates and changelogs as I think. I can publish a subgraph of thoughts together to any permalink I want. I eventually want something like <a href="https://maggieappleton.com/garden/">Maggie Appleton's amazing garden</a>, but one step at a time.</p>
<p>For now I am content to re-absorb my published notes into my wiki and dreaming of what I can do.</p>
<h2><a href="#writing" aria-hidden="true" class="anchor" id="writing"></a>Writing</h2>
<p>All this means I can pick up writing where I left off from a phone or a computer at any point. (Something I've enjoyed while writing this post!) Previously I had <a href="https://evantravers.com/articles/2023/04/08/drafts-bookmarks-and-file-actions#blog">kept post drafts on Drafts.app</a> for this same &quot;easy pick up,&quot; and now I can use Obsidian for the same. This is wonderful… before I would constantly be app-switching between my thinking/research in Obsidian and my writing in Drafts… now it's all one space. 🙌</p>
<h2><a href="#deployment" aria-hidden="true" class="anchor" id="deployment"></a>Deployment</h2>
<p>Even with all those new features (and with parsing my <code>wiki</code> repo's insane 6800+ files!) Tableau is still a speed-up:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1">❯ <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scripts</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">compare_builds</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sh</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">html</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">only</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> Building Tableau <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Users</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">github</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">com</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">travers</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">OK</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> Tableau <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">build</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">completed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12.79</span>s
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> Building Middleman <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Users</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">github</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">com</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">com</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">OK</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> Middleman <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">build</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">completed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">34.06</span>s
</div></code></pre>
<p>I am using nix in GitHub CI, and that's pretty fast too. The slowest thing right now is standing up the devenv shell, it takes 70% of the total pipeline. I'll likely rewrite it as a simple flake and cache it.</p>
<h2><a href="#next" aria-hidden="true" class="anchor" id="next"></a>Next</h2>
<p>I'm pretty excited about what this unlocks. I've wanted to make a bookshelf for book reviews, and I can do that easily. There's a few things I want to do: I need to make the Github CI action a lot faster. I might try to contribute a faster dev server for Tableau. I also need to implement a cross-repo message so that changing my wiki pushes to the blog. Lots of fun things to do!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-claude">
<p>Claude seems pretty good at elixir. It still does some overly clever things, and there are moments I really hate its naming strategy. <a href="#fnref-claude" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>Previous implementation details at <a href="https://evantravers.com/articles/2022/06/17/extending-redcarpet-for-admonition-blocks/">this blog post</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Rewrote in Tableau</title>
       <link>http://evantravers.com/articles/2026/05/19/rewrote-in-tableau</link>
       <pubDate>Tue, 19 May 2026 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/05/19/rewrote-in-tableau</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Last night amidst a hacking-cough hackathon… I pushed a version of this blog running on a completely new <a href="https://github.com/elixir-tools/tableau">Tableau</a>-based repo and a new architecture. I'm still writing up the whole rewrite and why, but if you loyal RSS-friends notice anything odd, please <a href="/contact">contact me</a>? 🙏</p> ]]></description>
    </item>
    <item>
       <title>Jujutsu Megamerges for Fun and Profit</title>
       <link>http://evantravers.com/articles/2026/04/22/jujutsu-megamerges-for-fun-and-profit/</link>
       <pubDate>Wed, 22 Apr 2026 17:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/04/22/jujutsu-megamerges-for-fun-and-profit/</guid>
       <description><![CDATA[ <blockquote>
<p>The absorb command will do a lot of this for you by identifying which downstream mutable commit each line or hunk of your current commit belong in and automatically squashing them down for you.</p>
</blockquote>
<p>I. Did. Not. Know. This.</p>
<p>I have been using this today because I have a Claude Skill I'm building and a feature upon which I'm testing it. Using the <code>jj new &lt;feature-change&gt; &lt;skill-change&gt;</code> I can make this &quot;megamerge&quot; commit, and all day I've been working on that change and <code>jj absorb</code> has magically pushed all the changes to the skill to the right tree and all the changes to the feature to it's tree.</p>
<p>Another example!</p>
<p>I'm working on a blog rewrite, and I'm keeping the &quot;posts&quot; from the old blog out of it for a bit, but I have a change where I've imported them all. Before, I'd work like this: I'd keep a change with all the posts, develop on top, use <code>jj arrange</code> to place it behind the to-be-abandoned post change, and then advance the bookmark.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">❯ jj
</div><div class="line" data-line="2">@  ykrxvkkm evantravers@gmail.com 2026-04-22 09:08:32 1ded0f62
</div><div class="line" data-line="3">│  (empty) (no description set)
</div><div class="line" data-line="4">○  umpkkzsz evantravers@gmail.com 2026-04-22 09:08:21 758024da
</div><div class="line" data-line="5">│  ABANDON posts
</div><div class="line" data-line="6">○  wvvpwtmo evantravers@gmail.com 2026-04-22 09:08:21 0b2f1caa
</div><div class="line" data-line="7">│  Cleaning up and moving pages
</div><div class="line" data-line="8">◆  pzvsmozt evantravers@gmail.com 2026-04-21 17:09:58 main 252dc606
</div><div class="line" data-line="9">│  Move over pages from our proposal day
</div><div class="line" data-line="10">~
</div></code></pre>
<p>Now I can use the merge strat, and never have to do that little <code>jj arrange</code> dance!</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">❯ jj
</div><div class="line" data-line="2">@    nzywloxl evantravers@gmail.com 2026-04-22 17:50:41 0281b2e6
</div><div class="line" data-line="3">├─╮  (empty) (no description set)
</div><div class="line" data-line="4">│ ○  umpkkzsz evantravers@gmail.com 2026-04-22 17:50:35 bbca7bfc
</div><div class="line" data-line="5">│ │  ABANDON posts
</div><div class="line" data-line="6">○ │  wvvpwtmo evantravers@gmail.com 2026-04-22 09:08:21 0b2f1caa
</div><div class="line" data-line="7">├─╯  Cleaning up and moving pages
</div><div class="line" data-line="8">◆  pzvsmozt evantravers@gmail.com 2026-04-21 17:09:58 main 252dc606
</div><div class="line" data-line="9">│  Move over pages from our proposal day
</div><div class="line" data-line="10">~
</div></code></pre>
<p>Any time I make a change, I can <code>jj</code> absorb it down, or do it manually with a <code>jj split</code> followed by a new &quot;megamerge.&quot; Mega cool.</p><p><a href="https://isaaccorbrey.com/notes/jujutsu-megamerges-for-fun-and-profit" class="u-in-reply-to  is-reply">Jujutsu Megamerges for Fun and Profit - isaaccorbrey.com</a></p> ]]></description>
    </item>
    <item>
       <title>Committing with the last command as the description</title>
       <link>http://evantravers.com/articles/2026/03/26/committing-with-the-last-command-as-the-description/</link>
       <pubDate>Thu, 26 Mar 2026 08:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/03/26/committing-with-the-last-command-as-the-description/</guid>
       <description><![CDATA[ <p>I realized recently that I <a href="https://github.com/search?q=repo%3Aevantravers%2Fdotfiles+nix+flake+update&amp;type=commits"><em>really</em> often</a> end up committing a simple <code>jj desc</code> to reflect that I've just run a linter, updated a package… things like:</p>
<ul>
<li><code>bundle update</code></li>
<li><code>nix flake update</code></li>
<li><code>npm format</code></li>
</ul>
<p>You get the idea.</p>
<p>I had opencode <a href="https://github.com/evantravers/dotfiles/commit/cc4e2f1c31f5ab1a6d1e19ebaa09b1c62fc9a4e7">whip up a simple fish command</a> that mimicks what <code>⌥-p</code> already does: takes the current prompt line and wraps it in <code>&lt;prompt&gt; %| less -R</code>. If the current prompt is empty, it uses the previous command. This is exactly what I wanted!</p>
<pre class="lumis"><code class="language-fish" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jj_desc_wrap</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--description=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Wrap previous token or history command in jj desc -m &quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-l</span> tokens <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-pc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-l</span> token <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tokens</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">test</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-z</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> token <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">history</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--max=1</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">head</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">test</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-z</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-i</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;jj desc -m </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> &quot;</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-C</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-r</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;jj desc -m </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">token</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-C</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commandline</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-f</span> repaint
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>I have this bound to <code>⌥-o</code> for now, because I think there's no conflicts.</p>
<p>Already this has been such a pleasant little UX change to my daily work.</p> ]]></description>
    </item>
    <item>
       <title>AI in the City of God</title>
       <link>http://evantravers.com/articles/2026/03/09/a-theological-understanding-of-technology/</link>
       <pubDate>Mon, 09 Mar 2026 20:11:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2026/03/09/a-theological-understanding-of-technology/</guid>
       <description><![CDATA[ <blockquote>
<p>Theological evaluation begins and ends with the sovereignty of God. A technology is more than a tool, more than a technique, more than a telos. It is all three, and all three must be asked together. The maker is an image-bearer under a mandate. The method is stewardship under a standard. The end is the glory of God and the flourishing of all He made.</p>
</blockquote>
<p>Starting from Augustine's twin cities serving two masters, Randy starts to build a framework for technology.</p>
<blockquote>
<p>Every tool serves a calling, every technique serves a standard, and every telos either honors God or rivals Him.</p>
</blockquote>
<p>I <em>really</em> like this framing, and I'm very excited to see what Mr. Caldejon writes next. (Bonus points for the Bavinck reference!)</p><p><a href="https://www.decalogue.ai/p/a-theological-understanding-of-technology" class="u-in-reply-to  is-reply">A Theological Understanding of Technology - Tool, Technique, and Telos - www.decalogue.ai</a></p> ]]></description>
    </item>
    <item>
       <title>2025</title>
       <link>http://evantravers.com/articles/2025/12/30/2025/</link>
       <pubDate>Tue, 30 Dec 2025 12:08:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/12/30/2025/</guid>
       <description><![CDATA[ <p>This was a pretty wild year all 'round. Birth of a child, caught in a layoff, freelancing, working in a startup.</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>I've been keeping track of prayer requests this year. As of this writing I have recorded sixty-one specific answers to prayer this year. Praise the Lord for his provision!</p>
<p>I added kneeling prayer once a day to my habits… targeting the time I'm usually most tired and prone to irritability. I think that's helped. My personal quiet time has been very fractured and infrequent. I've been a little more consistent at having family worship at the table.</p>
<p>That being said, I have felt the Lord's hand and protection through the big waves. In so many ways this year has been a dark mirror of 2020: political unrest, job change, pregnancy, much discussion and stress… but rather than being pulled away from the Lord and pulled apart in marriage, we have been strengthened and upheld.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>Because of chaos and baby, we didn't take too many trips this year… just three wild trips to the beach.</p>
<p>We've had a lot of folks in our home for board games and dinner, and that's been a big joy that we want to do more of next year.</p>
<p>Another big answer to prayer is that we are both enjoying our kids more than ever. They haven't been easier to deal with, I have just been granted more grace to enjoy them.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p>Equal victories and defeats here.</p>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2025/12/fitbod.png">
  <figcaption>FitBod continues to be my workout buddy.</figcaption>
</figure>
<p>After a short weight loss before baby arrived, I've shot up to 180lb and stayed there since June. Some of that was post-birth weight gain, but some of that has been some re-building of new muscle. I bought my first t-shirt in size L this year, and it's because of my shoulders not because of my gut. 💪</p>
<p>I tapered off Zyrtec, and have been six months or so without my daily dose. Doesn't seem to have affected my sinuses at all.</p>
<p>My skin stuff and gut owing to stress has continued to be a problem, but not as bad as previous years. I think that the smartwatch's input on my sleep has been a good lag metric to help me stay healthy.</p>
<p>My Morton's Neuroma hasn't really improved in a year of PT. I'd say I'm about 70% faithful to do the physical therapy, but I hoped to be farther along. I am starting to consider surgery… mobility is a <em>big deal</em>. I was really sad that for the first time in five years I was unable to run the 8k race near my house. I really have to get that fixed.</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>I only published 20 blog posts, less than half of last year.</p>
<p>My writing habit got severely curtailed by both the birth of a child, loss of a job, and pursuit of a new one. I still have written a fair amount (I've created 1100+ files in my wiki!) it just hasn't made it's way out to the blog.</p>
<p>Scrolling through the list of wiki notes… there's a lot of thinking about work, about personal growth, about people that I'm praying for, and of course, AI.</p>
<p>(I have a couple larger essays stuck in my system again… maybe I'll get a chance to polish them up over the break, or at least find a format where I'm ok with publishing them imperfect.)</p>
<p>I did spend some time updating the blog itself… adding <a href="https://trv.rs/slashes">slashpages</a> and updating some old ones. The <a href="https://trv.rs/blogroll">/blogroll</a> and <a href="https://trv.rs/uses">/uses</a> get updated relatively often, and I usually update <a href="https://trv.rs/now">/now</a> when I switch books.</p>
<p>I've continued to double down on nix as a strategy and am loving it. It was a huge blessing to have that tool in my arsenal when I wound up consulting as a software engineer for ~6 months. The fact I could update my computer without fear of destroying a project's configuration… wonderful.</p>
<p>While I use AI a good bit for work, I still try to write my prose and code by hand. No good reason. Just sharpening a tool, and hopefully my mind.</p>
<h3><a href="#sketchnoting" aria-hidden="true" class="anchor" id="sketchnoting"></a>Sketchnoting</h3>
<p>I continue to sketchnote weekly sermon entries. I also did <a href="https://evantravers.com/articles/2025/06/27/sketchnotes-sloss-tech-2025/">sketchnotes for the dev track of a local tech conference</a>. Looking back at this year I realized that I've relied a bit too much on speechbubbles, and I'd like to do more diagrams and visual storytelling.</p>
<p>I've also started (very recently) a weekly sketching habit. I've not been utterly faithful to it, but it's been nice to sit and just <em>see</em> for thirty minutes. I'm super thrilled that my kids sit with me and show me their results.</p>
<h2><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h2>
<p>This year I changed my lead indicator of reading to &quot;books I have started&quot; to try and allow myself to drop a book that &quot;gets stuck.&quot; By this metric, I started 26 books, finishing 21.</p>
<p>Some highlights:</p>
<ul>
<li><em>Polostan</em> by Neal Stephenson: In a world of change, spies navigate the rising power of communism and the new science of the atomic age.</li>
<li><em>Teach Them Diligently</em> by Lou Priolo: A look at raising children through the light of 2 Timothy 4:2.</li>
<li><em>Consider The Lilies</em> by Jonny Ardavanis: Extinguishing anxiety by looking into the overwhelming goodness of our Father God.</li>
<li><em>Piranesi</em> by Susanna Clarke: Wandering a strange house, an optimistic journal ponders the most important questions.</li>
<li><em>How to Lead Your Family</em> by Joel Beeke: Exhorting men to pattern our lives after Christ in his roles as prophet, priest, and king in our homes.</li>
</ul>
<p>My <a href="https://evantravers.com/articles/2025/02/11/boox-palma-review/">new Boox Palma</a> has really helped… I really love <a href="https://koreader.rocks/">KOReader</a>.</p>
<p>I've listened to less podcasts over the year… in part because of <a href="https://evantravers.com/articles/2025/06/09/hearing-is-becoming/">realizing how vulnerable my mind is to words</a>. Some standouts from my subscriptions:</p>
<ul>
<li><a href="https://www.thegospelcoalition.org/podcasts/gospelbound/">Gospelbound</a> has been a great source of books for my queue.</li>
<li><a href="https://www.dwarkesh.com/">Dwarkesh</a> has kept me apprised of AI thought, although I find myself disagreeing with his positions more over the year. (I find his comparisons of baby's learning styles to LLM training sequences utterly ridiculous, and I fundamentally disagree with his concept of what is knowledge.) I do really admire his curiosity and tenacity.</li>
<li>I don't listen to every episode of <a href="https://presbycast.libsyn.com/">Presbycast</a>, but I do listen to every episode of their <a href="https://presbycast.libsyn.com/size/5/?search=fathers+%26+brothers">Fathers and Brothers collection</a>.</li>
</ul>
<p>I've been continuing to use <a href="https://apps.apple.com/us/app/refocus-block-apps-websites/id1645639057">Refocus</a> to block all social media, shopping, and distractions for much of the year. That has contributed to the growth of my <a href="https://trv.rs/blogroll">/blogroll</a>.</p>
<h2><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h2>
<p>Ironically, I had set this year's theme as &quot;Look for Work,&quot; and <em>boy</em> did that hit with a vengeance.</p>
<p>The original meaning for me was partly about finding my next job, but also about just avoiding laziness: to have a mindset that always looks for the next thing to do… but when the layoff struck it collapsed down to finding a paycheck.</p>
<p>Even before the layoff, I've been beset with the eternal question of &quot;what do I want to do when I grow up?&quot; UX or programming? Management or IC? How does AI change any of this?</p>
<p>I'm still working on that. 🤷</p>
<h2><a href="#2026" aria-hidden="true" class="anchor" id="2026"></a>2026</h2>
<p>I'm hoping to spend some time with my wife planning the next year… at the moment the time has been coming too fast and furious so I haven't set a good Theme for 2026.</p>
<p>One thing is for sure, I know that the Lord will display his infinite faithfulness and love even more fully in this year than the last. Happy new year!</p> ]]></description>
    </item>
    <item>
       <title>Finding Gene Cernan&#39;s Missing Moon Camera</title>
       <link>http://evantravers.com/articles/2025/12/06/finding-gene-cernan-s-missing-moon-camera-space-camera-co/</link>
       <pubDate>Sat, 06 Dec 2025 16:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/12/06/finding-gene-cernan-s-missing-moon-camera-space-camera-co/</guid>
       <description><![CDATA[ <blockquote>
<p>When you’re going to the moon, you’re assigned a camera with a 60mm lens that gets strapped to your chest to document samples, experiments, and the lunar terrain. Both astronauts get their own, clearly labeled with a sticker on the side: “CDR” for commander and “LMP” for lunar module pilot, but they weren’t mutually exclusive, often being swapped throughout the mission based on what film they were shooting with.</p>
</blockquote>
<p>I love websites dedicated to a single purpose… a lifetime of attention to detail. This is such a treasure hunt. Also the stickers from their store are awesome.</p><p><a href="https://www.spacecamera.co/articles/2020/3/3/gene-cernans-missing-lunar-surface-camera" class="u-in-reply-to  is-reply">Finding Gene Cernan's Missing Moon Camera — Space Camera Co. - www.spacecamera.co</a></p> ]]></description>
    </item>
    <item>
       <title>Hollyland Lark M2S Lavalier</title>
       <link>http://evantravers.com/articles/2025/10/06/hollyland-lark-m2s-lavalier/</link>
       <pubDate>Mon, 06 Oct 2025 13:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/10/06/hollyland-lark-m2s-lavalier/</guid>
       <description><![CDATA[ <p>I've been using a small USB-C lavalier microphone to enhance my daily audio calls. I'm a fan.</p>
<p>Since <a href="https://evantravers.com/articles/2024/08/30/iphone-continuity-camera-for-remote-meetings/">I deleted my microphone and light off my desk to just use an iPhone</a>, I've wondered if there was a small microphone system that could slightly upgrade my setup. I have seen the small fuzzy mics held by YouTube personalities, but they were just a <em>little</em> too expensive.</p>
<p>After seeing the tags on <a href="https://www.macsparky.com/blog/2025/04/sparkys-new-wireless-mic/">David's private post</a> I've been trialing the <a href="https://www.hollyland.com/product/lark-m2s">Hollyland Lark M2S</a> microphone. I've been using it pretty much daily since April.</p>
<p>The biggest advantage of doing this is higher incoming audio quality coming from my Airpods Pro. There are better audio-specific reviews out there on youtube, and the Hollyland Lark M2S does perform very well, but the sheer advantage of getting more bits when someone has a bad connection or a hard audio environment… I'm finding myself reaching to plug in the USB-C dongle for the Larks as soon as I've asked someone to repeat themselves.</p>
<p>My only complaint was that the USB-C dongle blocks one of my precious ports, but it at least sports a charging pass-thru, so I haven't suffered too much.</p>
<p>The small USB-C charging case also fits perfectly in <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">my office in a bag</a>, which is of course a requirement. 🙌</p> ]]></description>
    </item>
    <item>
       <title>Updated my blogroll</title>
       <link>http://evantravers.com/articles/2025/09/11/updated-my-blogroll/</link>
       <pubDate>Thu, 11 Sep 2025 07:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/09/11/updated-my-blogroll/</guid>
       <description><![CDATA[ <p>My friend Scott was asking me for some healthy links to help replace doomscrolling, and I've been sending him a curated list of joyful RSS-friendly links, and I realized I should just put that somewhere.</p>
<p>Previously I was <a href="https://evantravers.com/articles/2021/01/23/generating-a-blogroll-from-your-opml-file/">generating my blogroll semi-regularly from a tag in my Feeds.opml</a>, but I kind of missed the ability to introduce the source and point out some favorites, so now the <a href="/blogroll">/blogroll</a> is written by hand from a YML file and updated when I find stuff to send.</p>
<p>Just because a source is listed doesn't mean I agree with every jot and tiddle, just that I have either found joy or interesting thoughts from something there. Most of them are also independent creators who are living the indieweb life, and some are personal friends. I'll keep tweaking it.</p> ]]></description>
    </item>
    <item>
       <title>Jujutsu&#39;s Whole Deal</title>
       <link>http://evantravers.com/articles/2025/08/22/jujutsus-whole-deal/</link>
       <pubDate>Fri, 22 Aug 2025 07:18:38 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/08/22/jujutsus-whole-deal/</guid>
       <description><![CDATA[ <blockquote>
<p>Part of jj's whole deal is that it collapses many Git concepts (stashes, staging, fixups, in-progress rebases, conflicts) into a single unified model of working with history, which then lets you use the same tools to do all of those things.</p>
</blockquote>
<p>👏👏👏</p>
<p>Extremely good explanation. I've been programming for a living for the past few months and using jj anywhere that doesn't use git-lfs and just loving it.</p><p><a href="https://neugierig.org/software/blog/2025/08/jj-bookmarks.html" class="u-in-reply-to  is-reply">Tech Notes: Understanding Jujutsu bookmarks - neugierig.org</a></p> ]]></description>
    </item>
    <item>
       <title>Code is only half the System</title>
       <link>http://evantravers.com/articles/2025/07/30/seeing-like-a-programmer/</link>
       <pubDate>Wed, 30 Jul 2025 07:22:27 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/07/30/seeing-like-a-programmer/</guid>
       <description><![CDATA[ <p>Chris's talk has been out there for quite a bit, but I'm clearing out my Instapaper and rediscovered it.</p>
<p>He argues that our rigor and formal methods must extend beyond the code and into the human systems that the code models:</p>
<blockquote>
<p>Software is both the artifact that produces the program and the running program in the real world. If we miss either of those, we will end up in a really confused place. And by the same token, if we want to make our software good, we have to tackle both parts.</p>
</blockquote>
<p>He then discusses how wisdom and discernment (which he calls mētis) is critical when working in the complex systems we are often called upon to model and improve… and how in the pursuit of &quot;high engineering&quot; (my phrase) we flatten a messy complex world in our code, and therefore have overly simplistic and incorrect models of the real world and therefore… bad software.</p>
<p>Fantastic talk. It's still sinking into my brain.</p><p><a href="https://v5.chriskrycho.com/elsewhere/seeing-like-a-programmer/" class="u-in-reply-to  is-reply">Seeing Like a Programmer (LambdaConf 2024) — Sympolymathesy, by Chris Krycho - v5.chriskrycho.com</a></p> ]]></description>
    </item>
    <item>
       <title>Be There When They Look Up</title>
       <link>http://evantravers.com/articles/2025/07/19/be-there-when-they-look-up/</link>
       <pubDate>Sat, 19 Jul 2025 14:11:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/07/19/be-there-when-they-look-up/</guid>
       <description><![CDATA[ <p>I love listening to people talk passionately about their life's work, and I had such a treat listening to Tyler Cowen's interview with David Robertson.</p>
<p>The section that I found most interesting had David speaking on the non-verbal interactions between orchestra and conductor.</p>
<p>One such gem was this: be there waiting when your team looks up.</p>
<blockquote>
<p>The funny thing is, every single individual in an orchestra looks up at a different time. It’s totally personal.
[…]
One of the challenges for a conductor is, as quickly as possible with a group you don’t know, to try and actually memorize when everybody looks up…</p>
</blockquote>
<p>What a joyful and insightful thought. How often I assume all the other players &quot;look up&quot; when I would look up. This concept has really challenged me in parenting the past few weeks. As a parent if I get the desired behavior from my kids, my first thought is to turn from them to the next problem to solve. If I take the conductor's wisdom, then I want to be there waiting when they look up.</p>
<p>For those of us who aren't sure, David has a confident assurance as to at least one moment where we should be waiting to communicate: right after the action.</p>
<blockquote>
<p>But the thing that no one will tell you, and that the players themselves don’t often realize, is that instinctively, and I think subconsciously, almost every player looks up after they’ve finished playing something. I think it’s to just check in to see, “Am I in the right place?”</p>
<p>That is a personal moment, where the orchestra is thinking about what’s coming. They’re not thinking about what’s behind because you’re constantly in the present and the future, but that’s your moment to send a message to somebody which can be, “Oh wow, that was incredible.” That sense of “Maestro came to my house” is really one of the things that I think helps build this kind of communication and trust between the players.</p>
</blockquote>
<p>Even though I am relatively illiterate when it comes to modern classical music, David is full of useful insights on performance, teamwork, and leadership. Enjoy the whole engaging interview below.</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/nL90O8Cuaww"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div><p><a href="https://conversationswithtyler.com/episodes/david-robertson/" class="u-in-reply-to  is-reply">David Robertson on Conducting, Pierre Boulez, and Musical Interpretation (Ep.248) - conversationswithtyler.com</a></p> ]]></description>
    </item>
    <item>
       <title>Sketchnotes: Sloss Tech 2025</title>
       <link>http://evantravers.com/articles/2025/06/27/sketchnotes-sloss-tech-2025/</link>
       <pubDate>Fri, 27 Jun 2025 19:48:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/06/27/sketchnotes-sloss-tech-2025/</guid>
       <description><![CDATA[ <div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/37XXCqbre28"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>I just finished up two days of Sloss Tech, mostly attending the Developer and Engineer track at the McWane Center. The BASE crew did a fantastic job facilitating the event, and as someone who <a href="https://www.flickr.com/photos/mattsheets/3502066151/in/photosof-evantravers/">entered the tech industry at Barcamp events long ago</a>, I really enjoyed it.</p>
<p>There was a strong emphasis on (surprise!) generative AI. While my <a href="https://evantravers.com/articles/2024/09/03/positions-on-generative-ai/">previous opinions</a> have not changed greatly, I felt both excited to try new things and daunted by the organizational and cultural changes that will come with these new tools.</p>
<p>Here are the sketchnotes, along with a small takeaway that resonated with me.</p>
<style>
    figure { margin-bottom: 2em; }
</style>
<h2><a href="#thursday" aria-hidden="true" class="anchor" id="thursday"></a>Thursday</h2>
<figure class="dual">
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-1.jpg">
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-2.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=Mh1yQ0tYfz0">TypeScript: Mother Tongue of the AI Apocalypse</a></h3>
        <cite>David Lormor (<a href="https://x.com/davidlormor">x.com/davidlormor</a>)</cite>
        <p>If you want the AI to "speak" your favorite language, write good community docs and blogs.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-3.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=6IVobcDVK58">Debugging Our Vibe Code</a></h3>
        <cite>Mikhail Kozorovitskiy (<a href="https://x.com/MKOperator">x.com/MKOperator</a>)</cite>
        <p>If you don't own it, don't ship it.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-4.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=jIrS1g6Aw1o">Same Threats – New Vectors: OWASP Top 10 for LLMs</a></h3>
        <cite>David Hawthorne (<a href="http://davidhawthorne.com">davidhawthorne.com</a>)</cite>
        <p>OWASP principles apply to LLMs. Treat the LLM's output as untrustworthy as a junior-dev.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-5.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=ABnAOOBqllw">Build Yourself Like You Build Systems</a></h3>
Alandis Seals (<a href="https://www.linkedin.com/in/alandisseals/">linkedin.com/in/alandisseals</a>)
        <p>Be focused, and find healthy nos.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-6.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=1tflo-uBRQY">How AI is Changing Software Development Forever</a></h3>
        <cite>Will Blackburn (<a href="https://www.linkedin.com/in/willhblackburn/">linkedin.com/in/willblackburn</a>)</cite>
        <p>Working with AI will be many developers <em>first</em> experience with delegation.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-7.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=k8PvFyueEOQ">AI-Driven Engineering For Teams</a></h3>
        <cite>Bill Abel (<a href="https://www.linkedin.com/in/billabel/">linkedin.com/in/billabel</a>)</cite>
        <p>LLMs are sensitive to syntax and grammar nuances more than logic.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-8.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=HfiWhkKYlNw">Play to Win: Engineering Joyful Tools That Compound Over Time</a></h3>
        <cite>Praise Daramola (<a href="https://www.linkedin.com/in/praisedaramola/">linkedin.com/in/praisedamarola</a>)</cite>
        <p>In a talk near to <a href="/articles/tags/automation">my automation-loving heart</a>, be a <a href="/articles/2022/08/29/folk-interfaces-and-ux-black-markets/">toolmaker</a>!</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-9.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=PK8kFItK54c">Panel: New In Tech; The Struggle Is Real</a></h3>
        <cite>
            Moderator: Elizabeth Anderson (<a href="https://www.linkedin.com/in/elizabeth-anderson-76b77840/">linkedin.com</a>)<br />
            Panelists: Mary Hendon Yelverton, Wendy Porter, Elizabeth Okunbor
        </cite>
        <p>Find the helpers.</p>
    </figcaption>
</figure>
<h2><a href="#friday" aria-hidden="true" class="anchor" id="friday"></a>Friday</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-10.jpg">
    <figcaption>
        <h3>Societal Thresholds</h3>
        <cite>Zack Kass (<a href="https://www.zackkass.com/">zackkass.com</a>)</cite>
        <p>Societal thresholds have been moved historical by distraction and entertainment.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-11.jpg">
    <figcaption>
        <h3>Building Brand Loyalty, Customer Obsession & Memorable Experiences</h3>
        <cite>Johnny Cupcakes (<a href="https://johnnycupcakes.com/">johnnycupcakes.com</a>)</cite>
        <p>What are my sprinkles?</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-12.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=wlNeo8hJQvQ">Bridging the Distance: Leading Effective, Distributed Dev Teams</a></h3>
        <cite>Debra Hays (<a href="https://www.concertidc.com/leadership">concertidc.com</a>)</cite>
        <p>In sprinting to answer "how", we can forget to ask "why?"</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-13.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=czfY_3IPXWY">Good Testing is Bad News</a></h3>
        <cite>Sergei Gapanovich (<a href="https://www.linkedin.com/in/sgapanovich/">linkedin.com/in/sgapanovich</a>)</cite>
        <p>Love on your QA wizards. They are more than "uh, it's broken."</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-14.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=CcerA3HN8Cg">Back To The Future: What Year Is Your Software Org In?</a></h3>
        <cite>Steve Hallman (<a href="https://www.linkedin.com/in/stevehallman/">linkedin.com/in/stevehallman/</a>)</cite>
        <p>Sometimes it's good to just see a full menu.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-15.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=NYvnCXxjv-s">Network Automation at Scale with Kubernetes and Crossplane</a></h3>
        <cite>Jeremy Sanders (<a href="https://www.linkedin.com/in/jeremybhm/">linkedin.com/in/jeremybhm</a>)</cite>
        <p>Bespoke automation is tech debt.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-16.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=hVbErUC47RY">What I Learned About Cybersecurity From Auditing Data Centers</a></h3>
        <cite>Kim Cote (<a href="https://www.linkedin.com/in/kim-cote-5050529a/">linkedin</a>)</cite>
        <p>Maintain every layer as if it's your only protection.</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-17.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=6a9fbhlfp7w">From Microservice to Monolith and Back: How to Migrate React</a></h3>
        <cite>Jared O’Neal (<a href="https://www.linkedin.com/in/therealoneal/">linkedin.com/in/therealoneal</a>)</cite>
        <p>Do you have the org structure to maintain your architecture pattern?</p>
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2025/06/slosstech2025-18.jpg">
    <figcaption>
        <h3><a href="https://www.youtube.com/watch?v=sVwIaMCd0uU">Panel: Tech Roles in the Era of AI</a></h3>
        <cite>
            Moderator: Keyona Meeks (<a href="https://www.linkedin.com/in/keyona-meeks/">linkedin.com/in/keyona-meeks</a>)<br />
            Panelists: Paula Guevara, Raj Vedula, Ananya Thakur,
        </cite>
        <p>Nobody knows what's going to happen, but there will be humans. Soft skills matter.</p>
    </figcaption>
</figure>
<p>For those who want to keep a copy of my notes from their talk, you can <a href="https://images.evantravers.com/articles/2025/06/slosstech2025.pdf">download a PDF here</a>.</p>
<p>Thank you to <a href="https://www.nibuild.com/">Nibuild</a> who sent me, it was real treat. 🙏</p> ]]></description>
    </item>
    <item>
       <title>Achievement Unlocked</title>
       <link>http://evantravers.com/articles/2025/06/20/achievement-unlocked/</link>
       <pubDate>Fri, 20 Jun 2025 17:55:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/06/20/achievement-unlocked/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>While listening to <a href="https://www.relay.fm/focused/232">Derek Sivers on Focused</a> I was struck by two things: how much I owe to Sivers for some indieweb accomplishments and generally celebrating plaintext… and how <em>jealous</em> I am of his incredible <a href="https://sive.rs">sive.rs</a> domain name.</p>
<p>And now <a href="https://trave.rs">trave.rs</a> is mine!</p>
<p>I've wanted it for quite a long time, but up to this point there's been a high price. The Serbian TLD used to require a local business license, but sometime while I wasn't paying attention that changed.</p>
<p>I'm definitely going to setup some emails for myself and my family using that domain. What I'm wrestling with now is whether I should make it this website's main TLD. It's been evantravers.com for thirteen years. Is trave.rs rad enough to warrant a change? I'd certainly have redirects to prevent linkrot, but I dunno. I'll sleep on it. 🤷</p>
<p>What do y'all think, should I make the big change?!</p> ]]></description>
    </item>
    <item>
       <title>Hearing is Becoming</title>
       <link>http://evantravers.com/articles/2025/06/09/hearing-is-becoming/</link>
       <pubDate>Mon, 09 Jun 2025 11:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/06/09/hearing-is-becoming/</guid>
       <description><![CDATA[ <p>Whose voice speaks to you the most?</p>
<p>It should be the people closest to us, the ones we say we love the most.</p>
<p>But it's not.</p>
<p>Historically the voices that built our worldview, exposing us to new ideas and cementing patterns of thought, were the voices <strong>physically</strong> nearest to us.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<p>While this physical limitation has been slowly eroding since the printing press, the shift in influence has accelerated dramatically since we put iPods in our pockets.</p>
<p>For the first time in human history, two entire generations of people have grown to adulthood where voices outside our immediate community are the absolute primary force in forging our minds.</p>
<p>(The back half of my life is inside that window.)</p>
<p>I've taken a stab at mapping my life into seasons marked by the &quot;voice most heard.&quot; I'm not talking about emotional impact, I'm not talking about person who means the most to me, I'm talking about <strong>raw audio hours</strong>. It looks something like this:</p>
<p><img src="https://images.evantravers.com/articles/2025/06/hearing.png" alt="map of my most listened voices" /></p>
<p>I am ashamed of this.</p>
<p>It's not that these particular external voices are bad. I'm very grateful for what I've learned from them. I'm ashamed of the sheer hours, the sheer a-mused<sup class="footnote-ref"><a href="#fn-postman" id="fnref-postman" data-footnote-ref>2</a></sup> exposure that this (admittedly hasty and unscientific!) exercise reveals.</p>
<p>This simplistic map of my listening hours reveals far more about me than I care to admit.</p>
<p>When I look over the map, I see the ghosts of past selves. Versions of me with different goals, algorithmic filter bubbles<sup class="footnote-ref"><a href="#fn-algo" id="fnref-algo" data-footnote-ref>3</a></sup>, even different accents.</p>
<p>The first time I became aware of this force, my parents asked me why I was talking strangely. I realized that I had subconsciously acquired Merlin Mann's humor… and his vocal ticks… through endless hours of Macbreak Weekly and other podcasts.</p>
<p>Regardless of who I claim to be my hero, my influences, my preachers… what I've learned is that <em>whoever I allow to speak the most</em> has the most influence on my life.</p>
<p>In a Girardian sense… these voices mediate my desires and mold me into what I aspire to be. This can be a good thing, and this can be a bad thing. Terrifyingly, this is a very invisible thing. If the hours spent listening don't have a huge emotional impact, we can be quietly shaped without even feeling the water boil around us.</p>
<p>It’s said that we are the cross section of our five closest friends… I’d rephrase that to say our five most listened to humans. I challenge you to take a similar exercise: working backwards from today, whose voice have you heard the most in each year? Not the most &quot;impactful,&quot; we are looking for sheer count of hours.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>This natural hierarchy mirrors the catholic doctrine of Subsidiarity: parents, family, village, state, world. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-postman">
<p><em>Amusing Ourselves to Death</em> by Neil Postman reminds us that &quot;amuse&quot; literally means &quot;no think.&quot; <a href="#fnref-postman" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-algo">
<p>My definition, created after watching the Social Dilemma</p>
<blockquote>
<p>A system rewards you with more of the content you engage with will self-reinforce until it eliminates other perspectives.</p>
</blockquote>
<p>An Algorithmic Filter Bubble is incentivized to bring you content you engage with… not content that is morally good. The Algorithm doesn't care if the engagement is sadness, envy, jealousy, lust, or rage. Our fallen human nature triggers strongest on our basest emotional and instinctual desires. <a href="#fnref-algo" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Looking For New Opportunities</title>
       <link>http://evantravers.com/articles/2025/06/06/looking-for-new-opportunities/</link>
       <pubDate>Fri, 06 Jun 2025 09:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/06/06/looking-for-new-opportunities/</guid>
       <description><![CDATA[ <p>I've been affected by a layoff at my previous employer, and I'm looking for new opportunities.</p>
<p>I'm still processing the suddent deletion of half my brain, but I am confident that it's the right moment and I'm excited about what will come next. I'm contemplating what skillset in which I wish to invest in this new stage of my career: do I stay in UX/Product, or re-visit my software engineering roots?</p>
<p>At this point, I want to work on meaningful products with nice people. 🤷 If you've been reading this for any length of time, you probably have a good idea of what drives me… probably better than the portfolio and <a href="https://images.evantravers.com/articles/2025/06/resume.pdf">resume</a> that I ought to be updating right now.</p>
<p>If you have advice for handling this season, resume tips and tricks, or potential opportunities, I'd love to hear from you. Please <a href="/contact">shoot me an email</a>.</p> ]]></description>
    </item>
    <item>
       <title>Wrestling with Jujutsu</title>
       <link>http://evantravers.com/articles/2025/05/03/wrestling-with-jujutsu/</link>
       <pubDate>Sat, 03 May 2025 20:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/05/03/wrestling-with-jujutsu/</guid>
       <description><![CDATA[ <p>I've been using git for about fifteen years. It's ingrained in my muscle memory. Why would I try anything else?</p>
<p><a href="https://jj-vcs.github.io/jj/">Jujutsu</a> is a new VCS built on-top of git. It's worth looking into if you…</p>
<ul>
<li>craft careful commits to form a good story because you know <a href="https://evantravers.com/articles/2018/09/28/code-spelunking/">spelunking</a> is hard.</li>
<li>manage long-running dev branches, <code>-rerere</code> rebases, or octopus merges.</li>
<li>are curious about what might come after git.</li>
<li>just like neat things 🤷</li>
<li>are a rustacean. 🦀</li>
</ul>
<p>I'm not yet a rustacean, but all the others have been part of my life for more than a decade (except octopus merges. I've only had to do that once or twice!)</p>
<p>While I'm reeling from <a href="https://github.com/evantravers/dotfiles/commit/169c4839892442d394869d2bc0755e67f3c48fbf">deleting some of the aliases</a> that formed that git muscle memory (and <a href="https://evantravers.com/articles/2025/04/17/reorganizing-my-nix-dotfiles/#friendship-ended-with-git-reset-soft-now-git-commit-fixup-is-my-best-friend">learning new things</a> while I do!) I've been learning about <a href="https://jj-vcs.github.io/jj/latest/">Jujutsu</a>. Jujutsu first came to my attention when my git mentor <a href="https://x.com/tbmiller">Tom Miller</a> raved about it<sup class="footnote-ref"><a href="#fn-pijul" id="fnref-pijul" data-footnote-ref>1</a></sup>. It came back when Chris Krycho posted <a href="https://v5.chriskrycho.com/essays/jj-init/">his amazing writeup</a> and also emailed me that it could solve some of <a href="https://evantravers.com/articles/2024/12/20/merging-my-creativity-system-and-blog/">my stranger git problems</a>.</p>
<p>I played with it a year ago, and I immediately <em>hated</em> what it did to my local git repo:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">…avers.com ! via  v3.2.1 via  impure (nix-shell-env) 󱗆 wtno | Working on the article took 13s
</div><div class="line" data-line="2">❯ git log --all --graph --oneline
</div><div class="line" data-line="3">* 86395da2 Working on the article
</div><div class="line" data-line="4">| * 5f73e7af
</div><div class="line" data-line="5">|/
</div><div class="line" data-line="6">| * 46a1cdba
</div><div class="line" data-line="7">|/
</div><div class="line" data-line="8">| * 50a93636
</div><div class="line" data-line="9">|/
</div><div class="line" data-line="10">* 0e9cb805 (HEAD, origin/draft) Drafting Wrestling with Jujutsu
</div><div class="line" data-line="11">| * cb863a74
</div><div class="line" data-line="12">|/
</div><div class="line" data-line="13">| * 3dee836c
</div><div class="line" data-line="14">|/
</div><div class="line" data-line="15">| * 7544ddc8
</div><div class="line" data-line="16">|/
</div><div class="line" data-line="17">* c0d593aa (origin/master, origin/HEAD, master) Remove lfs from actions
</div><div class="line" data-line="18">* c87a0994 unlfs
</div><div class="line" data-line="19">| * 2da3e478
</div><div class="line" data-line="20">|/
</div><div class="line" data-line="21">| * 2c58fe5f
</div><div class="line" data-line="22">|/
</div><div class="line" data-line="23">* ba8fec6b Remove lfs
</div><div class="line" data-line="24">* f9beb3fc Disable watcher so I don&#39;t have to type that again
</div><div class="line" data-line="25">| * 27e3fab0
</div><div class="line" data-line="26">|/
</div><div class="line" data-line="27">| * 2488ea80
</div><div class="line" data-line="28">|/
</div><div class="line" data-line="29">* a100e216 Typos
</div></code></pre>
<p>The reason for all these anonymous commits is <code>jj</code>'s amazing <code>jj undo</code>. Every operation can be completely undone, and you can do even more with <code>jj op</code>.</p>
<p>Here's what <code>jj log</code> displays:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">@  wtnowmoz evantravers@gmail.com 2025-05-04 17:32:28 86395da2
</div><div class="line" data-line="2">│  Working on the article
</div><div class="line" data-line="3">◆  zorywspm evantravers@gmail.com 2025-05-04 13:11:22 draft@origin git_head() 0e9cb805
</div><div class="line" data-line="4">│  Drafting Wrestling with Jujutsu
</div><div class="line" data-line="5">◆  wzonpurk evantravers@gmail.com 2025-05-04 09:05:35 master c0d593aa
</div><div class="line" data-line="6">│  Remove lfs from actions
</div><div class="line" data-line="7">~
</div></code></pre>
<p><code>jj log</code>'s default behavior is to only show you currently mutable working trees… which are basically various heads you have available. Everything else is considered immutable. You <em>can</em> rewrite it easily, but it's hidden from you to prevent you causing conflicts with other remote branches.</p>
<p>After some prompting I've been easing back into it and am <em>really</em> enjoying it this time. Playing with jujutsu feels very similar to <a href="https://evantravers.com/articles/2024/09/05/using-helix-as-a-vim-user/">playing with Helix</a>:
the muscle memory changes make &quot;easy&quot; actions frustrating, but the new mental model makes &quot;impossible&quot; tasks super easy.</p>
<p>All that to say, I'm having a grand time.</p>
<p>There are <a href="#references">amazing resources</a> out there for anyone interested in learning more, but here's a few tips that helped me as a novice wrestler:</p>
<ul>
<li>as I said before, <code>jj log</code> by default only shows you &quot;mutable&quot; changes, which if you have no outstanding branches is basically just your current git staging<sup class="footnote-ref"><a href="#fn-log" id="fnref-log" data-footnote-ref>2</a></sup>. These changes are essentially your current &quot;workbench,&quot; so as you work with the tool it feels more natural and git's &quot;full history&quot; feels heavy-handed, but it's confusing at first.</li>
<li><code>jj describe</code> is available at point in your development workflow. You can <code>jj describe</code> your intention at the start of a change, or <code>jj describe</code> what you actually wrote at the end. Very forgiving, especially with <code>jj split</code> letting you take a patch and move it to a new change<sup class="footnote-ref"><a href="#fn-split" id="fnref-split" data-footnote-ref>3</a></sup>.</li>
</ul>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I'm enjoying the learning process and using it daily on my blog and dotfiles the past week or so. As an individual software craftsperson, I like the freedom to explore the problem and not feel the pressure &quot;oh I can't handle that in this commit, I'll need to handle it in another commit&quot; because I can just <code>jj split</code>.</p>
<p>If I was doing release management, I'd really like its revision/merge management for handling complex rebases. I think it'd be really nice for some of the problems I used to face running long development branches.</p>
<p>Check it out!</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://v5.chriskrycho.com/essays/jj-init/">jj init - Chris Krycho</a></li>
<li><a href="https://steveklabnik.github.io/jujutsu-tutorial/">Steve's Jujutsu Tutorial - Steve Klabnik</a></li>
<li><a href="https://zerowidth.com/2025/what-ive-learned-from-jj/">What I've Learned From Jujutsu - zerowidth</a></li>
<li><a href="https://zerowidth.com/2025/jj-tips-and-tricks">jj Tips and Tricks</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-pijul">
<p>Honestly, Tom raved first about mercurial, then pijul, and <em>then</em> brought jujutsu to my attention saying &quot;this has all the good things from those other ones you didn't try.&quot; <a href="#fnref-pijul" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-log">
<p>If you want to see all history you need to use <code>jj log -r '::'</code>, or <code>jj log -r 'all()'</code>. There's a very powerful <a href="https://github.com/jj-vcs/jj/blob/main/docs/revsets.md">revision selection syntax</a> that is very readable/scriptable but I haven't dived into that yet. <a href="#fnref-log" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-split">
<p>While working on this article, I finally realized while reading the middleman code that I could hardcode in the argument for <code>--watcher-disable</code> and never have to type that again. I used <code>jj split</code> to move that change to a different revision than the one where I'm working on this blog post, and bobs your uncle! <a href="#fnref-split" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Jumping to Projects in Tmux</title>
       <link>http://evantravers.com/articles/2025/04/30/jumping-to-projects-in-tmux/</link>
       <pubDate>Wed, 30 Apr 2025 11:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/04/30/jumping-to-projects-in-tmux/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2025/04/sesh.png"></p><div class="admonition tldr">
<p>It's nice to quickly set up your workspace. When coding, I am using <code>sesh</code> for this in tmux.</p>
</div>
<p>Years ago, I worked in advertising. In those days, it was common to have six to ten projects &quot;open&quot; at once—two in active development but others in a constant stream of small post-launch tweaks.</p>
<p>To keep things organized, I had a little bash script called <a href="https://github.com/evantravers/polka/blob/master/bin/tspace">tspace</a>. I'm fairly certain Tom wrote it, but it used <a href="https://github.com/clvv/fasd">fasd</a> to navigate to a directory, run tspace, and be set up.</p>
<p>In jobs following, I either worked on only one repo, or none at all. I haven't needed robust tmux session management for years, but the number of my personal repos has crept up to where I found myself frustrated at how often I ran the following commands:</p>
<ol>
<li>Make new session</li>
<li>Navigate to highly used folder</li>
<li>Name session after folder</li>
</ol>
<p>I had started using zoxide for &quot;smart cd&quot; (fasd is no longer in development) but I still wanted to close the gap.</p>
<p>I found two solutions: <a href="https://github.com/27medkamal/tmux-session-wizard">tmux-session-wizard</a> is a one-click solution that adds almost no bulk to your config. Dead simple.</p>
<p>I'm presently trying <a href="https://github.com/joshmedeski/sesh"><code>sesh</code></a>. Sesh is wildly configurable… but I'm using none of it. Sesh has the extra power of multiple interfaces (even a Raycast plugin!) and the ability to run commands on workspace launch… but I don't need that at the moment. <code>direnv</code> currently sets up the environment in the folder.</p>
<p>For many of you, this is old hat… but for anyone who hasn't set up a script like this: it's really pleasant.</p> ]]></description>
    </item>
    <item>
       <title>Reorganizing My Nix Dotfiles</title>
       <link>http://evantravers.com/articles/2025/04/17/reorganizing-my-nix-dotfiles/</link>
       <pubDate>Thu, 17 Apr 2025 15:54:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/04/17/reorganizing-my-nix-dotfiles/</guid>
       <description><![CDATA[ <p>I rewrote my dotfiles config again! 🤷</p>
<p>I had been feeling some friction: my folder/file organization smelled bad. There was a bunch of <code>../.././config…</code> style paths that felt gross. I had files in folders by themselves like <code>nvim/default.nix</code> that made it hard to file find and was weird. Most importantly, I didn't really feel like I understood how it actually worked.</p>
<h2><a href="#mitchellh-is-very-smart" aria-hidden="true" class="anchor" id="mitchellh-is-very-smart"></a>@mitchellh is very smart.</h2>
<p>I found <a href="https://github.com/mitchellh/nixos-config">github:mitchellh/nixos-config</a> I spent a fair amount of time reading through his config… pretty much assuming that the author of <code>ghostty</code> made all decisions intentionally and wisely. (It was a good assumption! He's been <a href="https://mitchellh.com/writing/nix-with-dockerfiles">writing nix for long time</a>.) His config is simple and clear. I did learn quite a bit, and accepted a lot of his decisions. I don't think I was using the home-manager settings for global and user packages before, I think that's speeding up builds.</p>
<h2><a href="#friendship-ended-with-git-reset---soft-now-git-commit---fixup-is-my-best-friend" aria-hidden="true" class="anchor" id="friendship-ended-with-git-reset---soft-now-git-commit---fixup-is-my-best-friend"></a>Friendship ended with <code>git reset --soft</code> Now <code>git commit --fixup</code> is my best friend</h2>
<p>While rewriting my WIP pile to be intelligent commits using my trusty <code>git reset &lt;sha&gt; --soft</code> I discovered a wonderful git tool I didn't know about: <code>git commit --fixup=&lt;sha&gt;</code> and <code>git rebase --autosquash &lt;sha&gt;^1</code> lets you take the current staged change and effectively <code>git commit --amend</code> <em>anywhere</em> back in history. Y'all. The number of times I've <code>git reset --soft HEAD^3</code> just to add something to previous commit #2? Oh my goodness. 🙌</p>
<h2><a href="#vibe-coding-worksinexplicably-until-it-doesnt" aria-hidden="true" class="anchor" id="vibe-coding-worksinexplicably-until-it-doesnt"></a>vibe-coding works… inexplicably... until it doesn't</h2>
<p>I tried a lot of vibe-coding via claude.ai. I used a snippet I found on stackoverflow of <code>tail -n +1 **/*.nix | pbcopy</code> to throw every nix file into a chat, and that produced <em>much</em> more effective results than my previous attempts of pasting isolated snippets. I got successfully running code… that was unreadable, not concise, and downright wrong in some places. I mostly used AI to get the code compiling, then while untangling the syntax jungle I would read the docs and find the right way to do it.</p>
<p>After vibing and copying from @mitchellh, I finally felt I can read and understand my nix config except for three dastardly lines. Originally, @mitchellh was using:</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">userHMConfig</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">isWSL</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">isWSL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>But that threw errors with my darwin-nix config… I imagine because I'm using more features in mine? Unsure.</p>
<p>Claude's vibe-coding suggested conflicting solutions.To fix nix-darwin not having inputs, claude suggested this.</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">extraSpecialArgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inherit</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>That worked for darwin, but broke nixos. Nixos's home-manager complained about not seeing <code>lib</code>, so Claude suggested this crazy thing:</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lib</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> ... <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">userHMConfig</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inherit</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lib</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">isWSL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>(I'm having a hard time reading that… a function that takes <code>pkgs</code>, <code>lib</code>, etc., and imports my home-manager file, passing an attribute set that inherits <code>pkgs</code>, <code>lib</code>, <code>inputs</code>, <code>isWSL</code> from the surrounding scope? Is that needed?)</p>
<p>We vibing. 🤷</p>
<p>Voltroning the two solutions together worked, but I don't know why. It smelled bad. Eventually I read home-manager's documentation, understood that it only wants parameters passed through <code>extraSpecialArgs</code> and wrote:</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">userHMConfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">extraSpecialArgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inherit</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Vibe coding works… yes? Was it mostest correct? No.</p>
<p>How about speed? I ran three runs on each commit, trying to make sure I filled any caching systems and minimized network costs.</p>
<p>Before (<code>git checkout c06716e</code>, changing <code>wsl.defaultUser</code> to avoid exploding my system again):</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dotfiles</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span>  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HEAD</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">c06716e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> ! <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">took</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">7</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span>
</div><div class="line" data-line="2">❯ <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sudo</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixos-rebuild</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">switch</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">warning</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tree</span> &#39;<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/home/evantravers/src/github.com/evantravers/dotfiles</span>&#39; <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dirty</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">building</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">configuration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">warning</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tree</span> &#39;<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/home/evantravers/src/github.com/evantravers/dotfiles</span>&#39; <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dirty</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activating</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">configuration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/run/booted-system...</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/etc...</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/bin...</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/bin/login...</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/sbin/init</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">shim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reloading</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">units</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">root</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reloading</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">units</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">restarting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sysinit-reactivation</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">target</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Done</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">The</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">configuration</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/nix/store/3rasc0zq4vbkhy5iajs150ihlbd4mlwh-nixos-system-nixos-25.05.20250403.2bfc080</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">________________________________________________________</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Executed</span> in    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">7.21</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secs</span>      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fish</span>           <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">external</span>
</div><div class="line" data-line="19">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">usr</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1.28</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">188.00</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">micros</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1.09</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>
</div><div class="line" data-line="20">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sys</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">6.80</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">188.00</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">micros</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">6.61</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>
</div></code></pre>
<p>After:</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dotfiles</span>
</div><div class="line" data-line="2">❯ <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sudo</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixos-rebuild</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">switch</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>/<span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#wsl</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">building</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">configuration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activating</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">configuration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/run/booted-system...</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/etc...</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/bin...</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/bin/login...</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">up</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/sbin/init</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">shim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reloading</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">units</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">root</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reloading</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">user</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">units</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evantravers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">restarting</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sysinit-reactivation</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">target</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">________________________________________________________</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Executed</span> in    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1.73</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secs</span>      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fish</span>           <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">external</span>
</div><div class="line" data-line="16">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">usr</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">4.30</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">149.00</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">micros</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">4.15</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>
</div><div class="line" data-line="17">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sys</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.02</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>   <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">19.00</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">micros</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.00</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">millis</span>
</div></code></pre>
<p>Not bad! I haven't done any A/B testing, but I'm willing to bet most of that is the <code>home-manager.useGlobalPkgs = true</code> and <code>home-manager.useUserPackages = true</code> settings my previous setup was ignoring. The speed is great, but the real win is learning more about the nix language and how it all fits together... if only by fixing vibed code.</p>
<p>I rather think much of my code career going forward is going to have &quot;improving vibecode&quot; as a theme.</p>
<p>Random Stuff:</p>
<ul>
<li>If you change your <code>wsl.defaultUser</code> on the system that you are developing on, and run that <code>nixos-rebuild switch</code>, you are going to have A Bad Time(TM). I had some flashbacks to trying Ubuntu for the first time when I was a kid. I wanted that compiz wobbly windows stuff so bad and jacked up my graphics settings so many times. Probably the reason that I'm willing to put up with Nix now.</li>
<li>I discovered that my wezterm -&gt; tmux setup on WSL was reliant on <a href="https://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/#macos-or-wsl">some .terminfo file I'd downloaded</a> long ago. While reading through the wezterm nix code, I discovered that wezterm helpfully <a href="https://github.com/NixOS/nixpkgs/blob/26d499fc9f1d567283d5d56fcf367edd815dba1d/pkgs/applications/terminal-emulators/wezterm/default.nix#L167-L175">passes it's terminfo as a <code>passthru</code></a> so you can just use <code>pkgs.wezterm.terminfo</code>. I'm <a href="https://github.com/evantravers/dotfiles/blob/a462c9ad25977919b24f1a3aed0dd521eed8aa4d/users/evantravers/tmux.nix#L9">using that on wsl</a> because ghostty isn't on windows yet. </li>
</ul> ]]></description>
    </item>
    <item>
       <title>The Lestrade Effect</title>
       <link>http://evantravers.com/articles/2025/04/14/the-lestrade-effect/</link>
       <pubDate>Mon, 14 Apr 2025 11:09:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/04/14/the-lestrade-effect/</guid>
       <description><![CDATA[ <p>Just as Sherlock concludes his insightful first analysis of the crime scene, the hapless Inspector Lestrade comes puffing up, right on schedule, but too late. Sherlock turns away disdainfully, moving on to the next problem. Lestrade now faces spending the next hours re-discovering what took Sherlock a few minutes to discern.<sup class="footnote-ref"><a href="#fn-lestrade" id="fnref-lestrade" data-footnote-ref>1</a></sup></p>
<p>This is all very funny and plays to Sherlock's vanity, but Lestrade has an actual job to do. Lestrade is not here for the joy of the sport… he actually has to collar the criminal in the conclusion.</p>
<p>I want to be Sherlock, but I often find myself playing the role of Lestrade. Like Lestrade I straddle the double diamond<sup class="footnote-ref"><a href="#fn-diamond" id="fnref-diamond" data-footnote-ref>2</a></sup> of problem definition (evaluating the crime scene) and execution (arresting the murderer.) If your work domain connects definition and execution you are liable to become a Lestrade.</p>
<div class="admonition tldr">
<p>The Lestrade Effect is when someone must re-investigate a situation because they were not present at the first experience.</p>
</div>
<p>Whether in the gaslit streets of Victorian London or in a remote office, <a href="https://jeffgothelf.com/blog/is-handing-off-to-a-tech-team-agile/">handoffs are costly</a>. I see the Lestrade Effect often in emergency or experimental product design: When UX is not in the room in for early customer conversations where user needs are discovered then stakeholders (often Product and Marketing) can hand off User Stories to the UX team. The UX practitioners now must play Lestrade: repeating the same questions, making the same discoveries: who is the customer, what is the value of this decision, why did we decide this, etc.</p>
<p>If your friendly neighborhood UX practitioner is asking you questions that you (frustratingly!) have already asked and answered… it is possible that you have inadvertently cast them as Lestrade and not included them in the first analysis.</p>
<p>Be insightful as Sherlock, but be considerate like Watson. Include everyone in the room when the problem is being discovered… or risk leaving colleagues trailing behind.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-lestrade">
<p>You can find Lestrades <em>all over</em> any fiction with a eccentric and brilliant problem solver: <em>House MD</em>, <em>Bones</em>, <em>Fringe</em>… pick your poison. Pretty much any media where one character has a <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/EurekaMoment">Eureka Moment</a> and runs off to save the day without enlightening their colleagues (thereby continuing the suspense for the audience) has potential for Lestrades. However… continuing suspense is not helpful for non-fictional collaborative work. Don't model that. <a href="#fnref-lestrade" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-diamond">
<p><img src="https://images.evantravers.com/articles/2023/10/double-diamond.png" alt="double-diamond-design.excalidraw" />, originally posted in <a href="https://evantravers.com/articles/2023/10/25/opportunity-solution-trees/">Opportunity Solution Trees</a> <a href="#fnref-diamond" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Portable Standing Desk</title>
       <link>http://evantravers.com/articles/2025/03/20/portable-standing-desk/</link>
       <pubDate>Thu, 20 Mar 2025 12:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/03/20/portable-standing-desk/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2025/03/standing.jpg"></p><p>I've wanted to <a href="https://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/">use my keyboards outside</a> for a little bit. The seed of the idea was struggling to work with <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">my mobile office</a> in a &quot;workspace&quot; at an airbnb with only a couple inches of countertop at a very uncomfy height.</p>
<p>What if I could just bring my desk with me?</p>
<p>I experimented with just buying a laptop/projector tray and sticking it on a lightstand I had lying around. <em>Very</em> wobbly.</p>
<p>I eventually found the <a href="https://www.intension-design.com/tripodtable">Intention Design Tripod Table</a>. While there are other options<sup class="footnote-ref"><a href="#fn-options" id="fnref-options" data-footnote-ref>1</a></sup>, the Intention Design offering is a pretty safe bet for those who want to stand outside and work on their computer.</p>
<p>I'm pretty sure that the tripod Intention Uses is 99% identical to <a href="https://www.amazon.com/SmallRig-Foldable-Detachable-Adjustable-Phone-3935/dp/B0B63VTW46/ref=sr_1_2_sspa?crid=273XVF8E113X3&amp;dib=eyJ2IjoiMSJ9.4eY9WtilJB1umkfMLGdxMlLOADPhyEXYFmOfpWmi19uRa1XBrjLRh2iuaFbU6UxiVUeuTcqAFH5mpEgUdS5l0d7cRkzu3Rd-EA7PnP6niLQtvBLACsNVVxawTEw4EUcCn5ELYKdnXXS1jFHh0f6SITo6-Y7wsYdO_TFHQmtNgVJCI9D_OookrJxeSXy_hllMJQ7kOPd751a1eYiQR672hyRZleba3LDW-ZIeRu8fFo0.jTl4vkCVepXFrdMk3M5loRXJAuqC-tDr9qRA-OdpjwU&amp;dib_tag=se&amp;keywords=photo+tripod&amp;qid=1735958984&amp;sprefix=photo+tripo%2Caps%2C121&amp;sr=8-2-spons&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;psc=1">this smallrig option on amazon</a>. If you are mechanically inclined, you could install a <a href="https://www.amazon.com/Foto-Tech-Convert-Adapter-Ballhead/dp/B00OKYWWMG/">tripod socket</a> in a butcher block or cutting board and build your own for about 50% the cost.</p>
<p>Intention offers a keyboard tray, but I opted to build a weird little arm thing using SmallRig parts:</p>
<p><img src="https://images.evantravers.com/articles/2025/03/front.jpg" alt="" /></p>
<ul>
<li><a href="https://www.amazon.com/dp/B0062U2M4E">SmallRig Super Clamp</a> to attach to the tripod body</li>
<li><a href="https://www.amazon.com/dp/B06XT1MJC3">NiceyRig 2.5&quot; rod</a> for a little bit of standoff</li>
<li>2x <a href="https://www.amazon.com/dp/B07K84X662">SmallRig Universal Magic Arms with Small Ballhead</a> creating articulation between 2.5&quot; rod and Cheeseplate, and articulation between Cheeseplate and Magsafe disks</li>
<li><a href="https://www.amazon.com/dp/B01NCK79G2">SmallRig Cheese Plate</a> mounting to space out the split keyboard sides</li>
<li><a href="https://www.amazon.com/dp/B007LTH1X2">SmallRig 1/4&quot; to 1/4&quot; adapters</a> for the rods</li>
<li><a href="https://www.amazon.com/dp/B0CNTK23NB">Minifocus Magsafe Adapter</a> to mount to my existing <a href="https://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/">Magsafe Enabled keyboards</a></li>
</ul>
<div class="admonition info">
<div class="admonition__title">Update from September 2026:</div>
<p>Adding red threadlocker to all the threads in the system has made this infinitely more usable. It was very usable before the threadlocker, but any torque in the &quot;lefty loosey&quot; direction would cause the threads to loosen, so you could only adjust the arms in the clockwise direction, which was very frustrating. Now it's very resistant to movement, and actually adjustable.</p>
</div>
<p><img src="https://images.evantravers.com/articles/2025/03/reverse.jpg" alt="" /></p>
<p>Mounting the keyboard at a tented neutral arm position does create a little bounce in the laptop, but not much more than a normal-ish desk. I've thought about putting some hanging weights to counter this motion, but haven't played with it yet.</p>
<p>I honestly haven't figured out a good pointing device solution here yet. I will likely buy a cheap trackpad and put a magsafe disk on the back. I'd like to tripod mount <a href="https://evantravers.com/articles/2023/03/06/hot-take-elecom-bitra-finger-trackball/">my Bitra Trackball</a>, but as they seem to have stopped making them, I don't want to risk destroying it. For now I'm using a combo of <a href="https://www.homerow.app/">Homerow.app</a> and <a href="https://zmk.dev/docs/keymaps/behaviors/mouse-emulation">ZMK's pointing devices</a>, I already have <a href="https://evantravers.com/articles/2023/05/31/keyboard-only-day/">a lot of practice just using the keyboard.</a>. I can't really design on it, but it's a great focus writing setup.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-options">
<p>Other things I found:</p>
<ul>
<li><a href="https://www.reddit.com/r/StandingDesk/comments/1dq9hev/portable_standing_desk_i_made/">homemade tripod table on reddit</a>.</li>
<li><a href="https://www.amazon.com/JOY-worker-Foldable-Pneumatic-Adjustable/dp/B09QHWVXJR/ref=sr_1_6?dib=eyJ2IjoiMSJ9.VIi1fCfj7pgNn8r9zc2-ln13SsHekwMIzdcRyOoJjB2h3-nMAm_wK6-U2Ay4LBYUK7N7S9B1ihuWub-Iitb1UjAm2CKj3Cf6E_OQfl8nCTAWJ_0wBOqyW0SsxDxIQgXWm8__BYxTSyO8fAtrLe3_emVEy5U8NX2llNgjAtiyH1R--lgQbVTwNI3btyqRW0bek1GefDakDZhaysUZHGr22y51IJxW8vCLbyhlIJl-gd8QWEF3iuRs0FrgWeQSszpJJ-hO7GND0978lQ9w29d8LEsEsbY-IEAo-aay4WwDFEY.Rxo6Vi0fZdMhCQ6mpiilKwN0feW-_zyXTzzv6KzHdyQ&amp;dib_tag=se&amp;keywords=collapsible%2Bstanding%2Bdesk&amp;qid=1733106146&amp;sr=8-6&amp;th=1">industrial option on amazon</a></li>
<li><a href="https://mgsloan.com/posts/supine-computing/">mgsloan's epic post on supine computing</a></li>
<li><a href="https://getdriftdesk.com/">the scissorlift-like Drift Desk</a></li>
</ul>
<a href="#fnref-options" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Formwork and Minimum Viable Artifact</title>
       <link>http://evantravers.com/articles/2025/02/25/formwork-and-minimum-viable-artifact/</link>
       <pubDate>Tue, 25 Feb 2025 10:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/02/25/formwork-and-minimum-viable-artifact/</guid>
       <description><![CDATA[ <p>The permanent foundations for a bridge are molded by impermanent forms. Plywood and other flexible <a href="https://en.wikipedia.org/wiki/Formwork">formwork</a> creates shapes in which the concrete hardens. No wise worker over-optimizes their forms: Formwork is created <em>for</em> the pour then discarded.</p>
<p>The formwork and the concrete pour both require skills and craft. Both are connected to the final bridge.</p>
<p><a href="https://therpf.com/">therpf.com</a><sup class="footnote-ref"><a href="#fn-rpf" id="fnref-rpf" data-footnote-ref>1</a></sup> is a community obsessed with the production design of objects inhabiting the worlds of film. Screen-used Lightsabers, Voight-Kampff tests, Tricorders and more are studied, screengrabbed, and discussed. Screen-used props are divided into two categories: incredibly detailed &quot;hero props&quot; for closeups, and rubberized stunt props for action sequences.</p>
<p>The hero prop sets up the world, the stunt version sells the story.</p>
<p><a href="https://bradfrost.com/">Brad Frost</a> <a href="https://overcast.fm/+WLc2zGxC4">has talked about</a> <a href="https://smashingconf.com/pdf/smashingConfNYC2019-designerVsDeveloper.pdf">Minimum Viable Artifact</a> for a while: Minimum Viable Artifacts are the least amount of work required to communicate.</p>
<p>The plywood formwork is a Minimum Viable Artifact. So is the stunt prop. The hero prop has far more detail, but just enough to tell the story. The lightsaber hilt, made of microphone mounts and greebles, can't actually cut through metal… but we believe that Luke is a jedi.</p>
<p>A Minimum Viable Artifact carries enough detail and craft to serve the outcome: a pour for a bridge, or a close-up of the hero's armament… and no more<sup class="footnote-ref"><a href="#fn-resistance" id="fnref-resistance" data-footnote-ref>2</a></sup>. While there is a joy to craft and skill, it should be in service of a <em>goal</em>.</p>
<p>Otherwise we spend our life on expensive artisanal plywood forms and build no bridges.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-rpf">
<p>TheRPF is one of my favorite places on the whole internet. I could spend hours learning from them. While I am not a maker, I have bought a few small replicas off the amazing folk on the forum. One of my favorite internet moments was when a forum-user discovered that <a href="https://www.therpf.com/forums/threads/anh-hero-dl-44-discussion-three-anh-greeblies-found.118186/page-284#post-5436672">the original hero prop for the DL-44 Han Solo Blaster was used in a movie from a decade before</a>, and that they all had to rebuild their exact replicas after discovering it was based on the flat-bottom barreled artillery Mauser. As a lover of detail and craft… there are <em>endless</em> incredible threads. <a href="#fnref-rpf" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-resistance">
<p>The desire to expend effort doing something we are good at rather than moving the needle on our goals is a form of The Resistance from <a href="https://evantravers.com/articles/2019/01/01/2018-year-in-review/#war-of-art-by-steven-pressfield">The War of Art by Steven Pressfield</a>. <a href="#fnref-resistance" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Raycast Focus</title>
       <link>http://evantravers.com/articles/2025/02/13/raycast-focus/</link>
       <pubDate>Thu, 13 Feb 2025 06:29:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/02/13/raycast-focus/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2025/02/focus.png"></p><p>Last month <a href="https://jesseleite.com/">Jesse</a> texted me:</p>
<div class="admonition chat_in">
<div class="admonition__title">Jesse</div>
<p>Have you tried Raycast Focus yet? Pretty neat.</p>
</div>
<div class="admonition chat_out">
<div class="admonition__title">Me</div>
<p>I have not yet</p>
</div>
<div class="admonition chat_out">
<p>Sheesh</p>
</div>
<div class="admonition chat_out">
<p>That's my headspace idea, only maybe better</p>
</div>
<p>After invoking the mode Raycast Focus provides a lovely little timer with your stated goal and uses Screentime to block apps and websites in every browser.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2025/02/timer.png">
  <figcaption>Look how elegant that is!</figcaption>
</figure>
<p>It's almost exactly what I built as <a href="https://evantravers.com/articles/series/hammerspoon-headspace">Hammerspoon Headspace</a>. only missing the Toggl timer integration and the ability to save preset &quot;focus&quot; presets. I had been working on my version of this, but their implementation is <em>so</em> good.</p>
<p>I <em>think</em> it's possible that with their <a href="https://developers.raycast.com/information/lifecycle/arguments">arguments</a> system you might be able to pass presets to the Focus system, and that would let me integrated it into my <a href="https://evantravers.com/articles/2023/02/20/raycast-shortcuts-headspace/">shortcut-based Headspaces</a>. I just haven't decoded their JSON yet.</p>
<p>As it is, if you are the kind of person who was interested in Headspace but really only wanted one focus mode for your deep work: this is an amazing free tool that you really should try.</p> ]]></description>
    </item>
    <item>
       <title>Boox Palma Review</title>
       <link>http://evantravers.com/articles/2025/02/11/boox-palma-review/</link>
       <pubDate>Tue, 11 Feb 2025 11:34:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/02/11/boox-palma-review/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2025/02/in-hand.JPG"></p><p>I wanted a calm device to reduce my screentime. A &quot;calm device&quot; for me means minimal notifications, no hyper stimulant applications, and even no browser. Simply reading and writing.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2025/02/youversion.JPG">
  <figcaption>
    While I prefer Olivetree for study, I have been using Youversion with my small group to do a read-through-in-a-year plan. Being able to scroll with the physical hardware buttons on a device with <em>no other notifications</em> has been helpful for keeping up.
  </figcaption>
</figure>
<p>There have been a wealth of new e-ink devices<sup class="footnote-ref"><a href="#fn-devices" id="fnref-devices" data-footnote-ref>1</a></sup> in the past year. While I would like to replace my distracting iPhone outright, I <a href="https://evantravers.com/articles/2024/08/30/iphone-continuity-camera-for-remote-meetings/">use my phone for my webcam</a>. As the new Boox Palma 2 has just released, I bought a used refurbished Palma on ebay for just over the price of a Kindle.</p>
<p>The Palma works <em>ok</em> out of the box but it only shines after nerding out on configuration. There is a whole custom subsystem just for handling how monochrome e-ink renders the underlying colors. Some apps display such that you can't see the scroll bar on Android 14, so they are very hard to configure. It is not an easy software package to love.</p>
<p>But I do.</p>
<p>Here's what I did to set up my Palma:</p>
<h3><a href="#niagara-launcher" aria-hidden="true" class="anchor" id="niagara-launcher"></a><a href="https://niagaralauncher.app/">Niagara Launcher</a></h3>
<p>For maximum minimalism: bigger sans-serif font, minimal icons, hiding status and notifications bar.</p>
<h3><a href="#gboard" aria-hidden="true" class="anchor" id="gboard"></a><a href="https://play.google.com/store/apps/details?id=com.google.android.inputmethod.latin&amp;pli=1">Gboard</a></h3>
<p>The default keyboard is good, Gboard is <strong>much</strong> better: swipe to type, great dictation support. I am really liking dictating notes while I read physical books.</p>
<h3><a href="#obsidian" aria-hidden="true" class="anchor" id="obsidian"></a><a href="https://obsidian.md/">Obsidian</a></h3>
<p>Let's be honest, I just wanted a kindle that ran Obsidian.</p>
<p>I've got the light mode theme of Minimal Theme set to their e-ink setting, and it works well. I do wish that I could set the theme or theme settings per device easily.</p>
<h3><a href="#kindle" aria-hidden="true" class="anchor" id="kindle"></a>Kindle</h3>
<p>The Kindle.app just works. The only wrinkle is that unlike <em>all</em> the other apps, you need to set the hardware buttons to be volume buttons, and use Kindle's settings to turn the page with the volume keys.</p>
<h3><a href="#olive-tree" aria-hidden="true" class="anchor" id="olive-tree"></a><a href="https://www.olivetree.com/">Olive Tree</a></h3>
<p>I have set Olive Tree to scroll the page using the physical buttons. There's an in-app setting to keep the device from sleeping while up front, which means I never have to do the &quot;stay awake&quot; tap during the whole sermon.</p>
<h3><a href="#bible-by-youversion" aria-hidden="true" class="anchor" id="bible-by-youversion"></a><a href="https://www.youversion.com/the-bible-app/">Bible by Youversion</a></h3>
<p>I don't love the social network aspects, but it's the best for reading plans, and I'm enjoying going through a reading plan with my small group.</p>
<h3><a href="#koreader" aria-hidden="true" class="anchor" id="koreader"></a><a href="https://koreader.rocks/">KOReader</a></h3>
<p>I don't have much content to read here, but there's a system that allows it to sync to a calibre library over wifi and that's nifty.</p>
<h3><a href="#instapaper" aria-hidden="true" class="anchor" id="instapaper"></a><a href="https://www.instapaper.com">Instapaper</a></h3>
<p>I switched back<sup class="footnote-ref"><a href="#fn-back" id="fnref-back" data-footnote-ref>2</a></sup> to the first read later app I ever loved, and it's <em>still</em> great. I abandoned it only because I believed I wanted unlimited API access.</p>
<p>The device is comfy to hold. Not too heavy. The screen is clear enough, I tend to run it 100% warm and with the lowest backlight. I get a couple days battery life out of it. Maybe a week.</p>
<p>The official folio case is not amazing. The magnetic clasp is <em>right</em> in the way of the volume buttons that I use for &quot;turn page,&quot; and once a day the cover jams the button and flips madly through the book like a runaway train. I actually like that it's too big for a pocket - this forces me to put it down. It certainly does not hurt that I can prop it up for writerdeck roles.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2025/02/writerdeck.JPG">
  <figcaption>
    Isn't that a cute little typewriter? In use here, the Bancouver40 by Sporewoh. I was hoping to have built an <a href="https://github.com/OldMan6955/TheEndgame2024">Endgame</a> by now, but it hasn't arrived yet.
  </figcaption>
</figure>
<p>Since buying the device, I've already finished two digital books and 70% of a physical book, so the experiment is a success. Turns out having a reading-specific device is increasing my reading, imagine that.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-devices">
<p>I have had my eye on:</p>
<ul>
<li><a href="https://daylightcomputer.com/">Daylight Computer</a>. The most interesting &quot;tablet as main computer&quot; device.</li>
<li><a href="https://minimalcompany.com/">Minimal Phone</a>. Android as E-ink, physical keyboard.</li>
<li><a href="https://www.indiegogo.com/projects/mudita-kompakt-more-offline-more-life#/">Mudita Kompakt</a>. Modified Android for Calmness.</li>
<li><a href="https://supernote.com/">Supernote</a>. Maybe the most interesting art-tablet option.</li>
</ul>
<a href="#fnref-devices" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
<li id="fn-back">
<p>Instapaper -&gt; Readwise -&gt; Reeder -&gt; Omnivore -&gt; Reeder -&gt; Instapaper. <a href="#fnref-back" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Automatic Webmentions</title>
       <link>http://evantravers.com/articles/2025/01/24/automatic-webmentions/</link>
       <pubDate>Fri, 24 Jan 2025 22:41:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/01/24/automatic-webmentions/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Thanks to Matt's post, I think I've finally got webmentions automated, which is lovely. Thanks Matt!</p><p><a href="https://steele.blue/webmentions/" class="u-in-reply-to  is-reply">This blog's comments are powered by Webmentions - steele.blue</a></p> ]]></description>
    </item>
    <item>
       <title>Beware and Be Encouraged</title>
       <link>http://evantravers.com/articles/2025/01/14/beware-and-be-encouraged/</link>
       <pubDate>Tue, 14 Jan 2025 10:07:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/01/14/beware-and-be-encouraged/</guid>
       <description><![CDATA[ <p>While researching a trip, I came across a devious strategy: Thieves sometimes put up a sign in english that reads &quot;Beware of Pickpockets,&quot; then they wait. English-speaking tourists read the sign and invariably place their hand on their most expensive possession. Having found the most valuable target, the thieves make the snatch.</p>
<p>When something precious to us is threatened we impulsively check on it. Some scriptures trigger that reflex on our most precious possession: our salvation.</p>
<p>Hebrews 6:4-8 triggers this reaction in me especially the words &quot;who [...] have tasted the heavenly gift, and have shared in the Holy Spirit, [...] and then have <em>fallen away</em>.&quot; (Hebrews 6:4-8, ESV, emphasis mine)</p>
<p>This passage summons disquieting emotions. However, that instinctual &quot;have I still got it?&quot; is but a <em>confirmation</em> of the preciousness of the salvation which we already have been given. The tourist pats his pocket because there is something precious within.</p>
<p>If we had nothing to treasure, if we were still dead in our sins… we would not have the instinct to check and protect. Be encouraged.</p> ]]></description>
    </item>
    <item>
       <title>Setting Up Obsidian Tasks as a Things.app User</title>
       <link>http://evantravers.com/articles/2025/01/06/setting-up-obsidian-tasks-as-a-things-app-user/</link>
       <pubDate>Mon, 06 Jan 2025 14:02:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/01/06/setting-up-obsidian-tasks-as-a-things-app-user/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2025/01/today.png"></p><p>For the past month, and through the last quarterly review and planning of 2025, I've been using Obsidian Tasks instead of my trusty Things.app, and I am very happy.</p>
<p>Obsidian Tasks lets me manage my tasks in the context of my work. It lets me fully customize how and where tasks are stored and presented, allowing for flexible and focused workflows.</p>
<p>It's also <em>very</em> nerdy.</p>
<p>I was hard pressed to choose a successor to Things. For me it came down to taskwarrior, Todoist, Bullet Journal, and Obsidian Tasks.</p>
<p>I chose Obsidian Tasks for a few reasons:</p>
<ul>
<li>I do all my writing and thinking, journaling and rituals in Obsidian. I found myself constantly linking back and forth from Things to Obsidian, or wrestling with where to store the notes and context.</li>
<li>I have become project-list focused during my workday. I wanted a kanban to manage lots of projects, and I can easily do that in Obsidian.</li>
</ul>
<p>There are downsides I'm willing to accept:</p>
<ul>
<li>Slower performance. It's honestly surprising how fast it is considering what it is doing, but sluggish compared to Things.app. I do notice it especially in search.</li>
<li>It's yet another task format, when there is already orgmode, todo.txt, and taskpaper. I believe I understand the Dataview-driven decision, but I do wish it used a known format for attributes.</li>
<li>I don't think I'll be able to easily put time blocked tasks on my calendar like I can with Reminders or Todoist. Since I tend to assign a project to a day, this is ok.</li>
<li>Push Notifications with Obsidian are hard or impossible. I don't rely on as many notifications and nudges<sup class="footnote-ref"><a href="#fn-nudges" id="fnref-nudges" data-footnote-ref>1</a></sup> for project work. For general scheduling, I have my Daily Note.</li>
</ul>
<p>A quick overview of what I've done since I began thinking about it a year ago:</p>
<ol>
<li>I investigated Obsidian Tasks, choosing plaintext over emoji, and seeing if it had the ability to do what I wanted.</li>
<li>I removed old instances of <code>- [ ]</code> from my markdown repo to &quot;clean it up&quot;.</li>
<li>Six months ago, I disabled the quick capture shortcut from my phone and started just using Drafts for all capture.</li>
<li>3 months ago I developed a Things -&gt; Obsidian Tasks export, first in Shortcuts and then thankfully in ruby.</li>
<li>I hacked on Obsidian Tasks queries to mirror the screens in Things.app that ran my life.</li>
<li>Two month ago, I <a href="https://evantravers.com/articles/2024/12/26/why-im-changing-my-task-manager/">moved the Nudges to Reminders</a>, and finally the Things and Obsidian experience converged.</li>
<li>One month ago, I ran the export for the last time, changed my keyboard shortcuts for capture to a new custom shortcut, and since then I've been 100% using Obsidian for tasks.</li>
<li>I've continued to write some new views, merge my ritual documents with their datasources, and discover new powerful workflows.</li>
</ol>
<h2><a href="#configuration-and-import" aria-hidden="true" class="anchor" id="configuration-and-import"></a>Configuration and Import</h2>
<p>I tried writing this in Shortcuts, but I ended up with the structure I had written for <a href="https://github.com/evantravers/ThingsToOrgmode">orgmode</a> and <a href="https://github.com/evantravers/thingstotaskwarrior">taskwarrior</a> and <a href="https://github.com/evantravers/things-to-obsidian-tasks">just used JXA</a>. Much easier.</p>
<p>There are a <em>lot</em> of different ways you could configure Obsidian Tasks, but I made a couple executive decisions:</p>
<ul>
<li>I prefer readable plaintext. I chose the Dataview format rather than the default Emoji format.</li>
<li>I imported files that corresponded to the Areas and Projects lists in Things into <code>projects</code> folder.</li>
<li>I wrote <a href="https://github.com/evantravers/things-to-obsidian-tasks/blob/49b8236ca20a14119914bd6f2643748b675f5b8b/things-to-obsidian-tasks.js#L60">conversions</a> to let tags import well.</li>
</ul>
<p>I also spent some time going through my wiki repo, cleaning up wherever <code>- [ ]</code> appeared. I chose to represent every <code>- [ ]</code> checkbox as a task, and not use the <code>- [ ] #task</code> form. I like the simplicity.</p>
<p>While I was trialing the import I developed Obsidian &quot;views&quot; that corresponded to the screens in Things. I kept tweaking them until they consistently matched their corresponding Things.app views.</p>
<h2><a href="#obsidian-templates" aria-hidden="true" class="anchor" id="obsidian-templates"></a>Obsidian Templates</h2>
<p>Obsidian Tasks lets you create custom blocks using either a SQL-style language or javascript. Assuming you've made similar configuration decisions in your repo, here are the Things.app-style queries that drive my current Task Management system, although it's still evolving:</p>
<h3><a href="#inbox" aria-hidden="true" class="anchor" id="inbox"></a>Inbox</h3>
<p>(Literally just a file named Inbox. 🤷)</p>
<h3><a href="#today" aria-hidden="true" class="anchor" id="today"></a>Today</h3>
<p>I used to visit Today daily to see what I had assigned for that day.</p>
<p><img src="https://images.evantravers.com/articles/2025/01/today.png" alt="Today View" /></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!warning]+ Overdue
</div><div class="line" data-line="2"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">((starts before tomorrow) AND (has start date)) OR (due before today)
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="9"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">((scheduled on today) OR (scheduled before today)) OR ((starts before tomorrow) AND (has start date)) OR (due today)
</div><div class="line" data-line="10"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<p>I am finding that I use Today less as I have pushed some of the actions I once performed on it into Daily Plan.</p>
<h3><a href="#tomorrow" aria-hidden="true" class="anchor" id="tomorrow"></a>Tomorrow</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="3"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scheduled before tomorrow
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h3><a href="#workday-todos" aria-hidden="true" class="anchor" id="workday-todos"></a>Workday Todos</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!error]- High Energy
</div><div class="line" data-line="2"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include High
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="7"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!tip]- Low Energy
</div><div class="line" data-line="10"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="12"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include Low
</div><div class="line" data-line="13"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="14"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="15"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!attention]- Long Estimates
</div><div class="line" data-line="18"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="20"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include 4h
</div><div class="line" data-line="21"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="22"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="23"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!todo]- Quick Wins
</div><div class="line" data-line="26"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="28"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include 30m
</div><div class="line" data-line="29"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="30"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="31"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="32"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="33"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="34"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="35"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by function task.filename
</div><div class="line" data-line="36"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path does not include Wishlist
</div><div class="line" data-line="37"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h3><a href="#upcoming" aria-hidden="true" class="anchor" id="upcoming"></a>Upcoming</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="3"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">has scheduled date
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by function task.scheduled.format(&quot;MMM Y&quot;)
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort by scheduled date
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h3><a href="#deadlines" aria-hidden="true" class="anchor" id="deadlines"></a>Deadlines</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="3"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">has due date
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by function task.due.format(&quot;MMMM&quot;)
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort by due date
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h3><a href="#anytime" aria-hidden="true" class="anchor" id="anytime"></a>Anytime</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="3"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no scheduled date
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no due date
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">folder does not include booknotes
</div><div class="line" data-line="7"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by path
</div><div class="line" data-line="8"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h3><a href="#someday" aria-hidden="true" class="anchor" id="someday"></a>Someday</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="3"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by path
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag include Someday
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<h2><a href="#quick-capture" aria-hidden="true" class="anchor" id="quick-capture"></a>Quick Capture</h2>
<figure class="dual">
    <img src="https://images.evantravers.com/articles/2025/01/capture.png">
    <img src="https://images.evantravers.com/articles/2025/01/capture-example.png">
    <figcaption>
        <p>
            While now I need to maintain yet-another-crufty-shortcut, it works
            well enough and thanks to my hammerspoon layer, <a href="https://github.com/evantravers/dotfiles/commit/ac2543828b69ade1c83766affc9195a465f3381c">it uses the same shortcut</a>.
        </p>
    </figcaption>
</figure>
<p>While I <em>thought</em> I had weaned myself from using Things.app'a quick capture, I quickly missed having that power. So I whipped up a custom Shortcut and bound it to the same keys. It's not as good… but in some ways it's better.</p>
<p>I used Claude.ai to generate some of the AppleScript blocks, then I fixed them in Script Editor.</p>
<p>Firefox is the bane of my Quick Capture existence. I may try running Hammerspoon Lua eventually.</p>
<h2><a href="#obsidian-kanban-to-obsidian-projects" aria-hidden="true" class="anchor" id="obsidian-kanban-to-obsidian-projects"></a>Obsidian Kanban to Obsidian Projects</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2025/01/projects.png">
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">        All a &quot;project&quot; is a note with the tag `#project`. So I can have
</div><div class="line" data-line="4">        lists of tasks, a home repair, or an upcoming essay or blog post.
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
</figure>
<p>I started<sup class="footnote-ref"><a href="#fn-started" id="fnref-started" data-footnote-ref>2</a></sup> using <a href="https://github.com/marcusolsson/obsidian-projects">Obsidian Projects</a> because it lets me populate the board's based on a tag. Think of it as a pre-made fancy Dataview view, it's not a real file. This causes some inconsistencies in the system, but it serves my needs well. I do wish it was just plaintext, but I don't see how.</p>
<p>I have mine set to be columns based a <code>status</code> property. When I drag between columns, it updates the property.</p>
<p>I like Kanban as a way to visualize the intensity of my commitments. I missed that in Things.app, and it's part of what drove me to try this experiment.<sup class="footnote-ref"><a href="#fn-todoist" id="fnref-todoist" data-footnote-ref>3</a></sup></p>
<h2><a href="#neat-things-i-didnt-expect" aria-hidden="true" class="anchor" id="neat-things-i-didnt-expect"></a>Neat Things I Didn't Expect</h2>
<h3><a href="#dedicated-views" aria-hidden="true" class="anchor" id="dedicated-views"></a>Dedicated &quot;Views&quot;</h3>
<p>I built a custom view for workday tasks:</p>
<figure>
    <img src="https://images.evantravers.com/articles/2025/01/workday.png">
</figure>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!error]- High Energy
</div><div class="line" data-line="2"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include High
</div><div class="line" data-line="5"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="7"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!tip]- Low Energy
</div><div class="line" data-line="10"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="12"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include Low
</div><div class="line" data-line="13"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="14"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="15"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!attention]- Long Estimates
</div><div class="line" data-line="18"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="20"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include 4h
</div><div class="line" data-line="21"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="22"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="23"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!todo]- Quick Wins
</div><div class="line" data-line="26"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="28"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags include 30m
</div><div class="line" data-line="29"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="30"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div><div class="line" data-line="31">
</div><div class="line" data-line="32"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="33"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="34"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function task.file.property(&#39;tags&#39;).includes(&#39;#Areas/Work&#39;)
</div><div class="line" data-line="35"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter by function !task.file.hasProperty(&#39;status&#39;) || task.file.property(&#39;status&#39;) == &quot;In Progress&quot;
</div><div class="line" data-line="36"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by function task.filename
</div><div class="line" data-line="37"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path does not include Wishlist
</div><div class="line" data-line="38"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<p>This only shows tasks for <code>In Progress</code> projects because of the line <code>task.file.property('status') == &quot;In Progress&quot;</code>. If I drag the parent Project to &quot;Done&quot; or &quot;Blocked,&quot; child tasks disappear like magic. I <em><em>love</em></em> this.</p>
<p>In Things.app, the closest thing I had to dedicated Views was to save a URL that contained tags I wanted to search for: <code>Work</code> and <code>High Focus</code>. Obsidian Tasks lets me dataview query all kinds of interesting and custom views.</p>
<p>One neat one (inspired by <a href="https://bookworm.fm">bookworm</a>) is &quot;action items from books I've read&quot;:</p>
<figure>
    <img src="https://images.evantravers.com/articles/2025/01/booknotes.png">
    <figcaption>
<p>All this lovely information with only…</p>
<div class="highlight"><pre class="highlight markdown"><code><span class="p">```</span><span class="nl">tasks
</span><span class="sb">not done
path includes booknotes
group by path</span>
<span class="p">```</span>
</code></pre></div>
    </figcaption>
</figure>
<p>Another is being able to show child projects of an &quot;Area&quot; style project:</p>
<figure>
    <img src="https://images.evantravers.com/articles/2025/01/project.png">
    <figcaption>
<div class="highlight"><pre class="highlight markdown"><code><span class="p">```</span><span class="nl">tasks
</span><span class="sb">TABLE status, due
FROM #Areas/Personal AND #project
WHERE status != "Done"</span>
<span class="p">```</span>
</code></pre></div>
    </figcaption>
</figure>
<p>Obsidian's tooling and plugins allows for even more creative custom UIs… I could embed a set of views into a Canvas for a productivity dashboard if I wanted to!</p>
<h3><a href="#reducing-ritual-friction" aria-hidden="true" class="anchor" id="reducing-ritual-friction"></a>Reducing Ritual Friction</h3>
<p>I've been using this same power in my daily rituals.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2025/01/essential.png">
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">        Here, the question of &quot;protect the essential&quot; tasks of the day is made easier by filtering today&#39;s list to just `#Focus/High` and tasks with elevated priority.
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6">        I&#39;ve been abusing Obisidan&#39;s <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://help.obsidian.md/Editing+and+formatting/Callouts</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>callouts<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> system to hide the extra filters so it&#39;s not overwhelming.
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
</figure>
<p><a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/">My rituals</a> are typically prompts and questions like &quot;what projects have we scheduled for this month&quot; or &quot;what questions should you ask your spouse?&quot; Before, I'd read the prompt and then go find the answer in the system by searching projects by scheduled date or tasks tagged &quot;Wife.&quot; With Obsidian Tasks, I can embed those custom views <strong>right</strong> into the ritual.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>❓ Any questions to answer?
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!question]- Questions for Wife
</div><div class="line" data-line="4"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not done
</div><div class="line" data-line="6"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags includes Family
</div><div class="line" data-line="7"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group by path
</div><div class="line" data-line="8"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span>
</div></code></pre>
<p>This has been a game-changer… much less app-switching when I'm trying  to just plan the week with my wife.</p>
<h3><a href="#power-of-plaintext" aria-hidden="true" class="anchor" id="power-of-plaintext"></a>Power of Plaintext</h3>
<p>Because Obsidian Tasks is all plaintext… there's just so much that's possible:</p>
<ul>
<li>You can search for todos natively in Obsidian using <code>task:&lt;string&gt;</code> or even <code>task-todo:&lt;string&gt;</code> for uncompleted todos.</li>
<li>I can filter tasks to only projects marked &quot;In Progress&quot; in my kanban: <code>filter by function !task.file.hasProperty('status') || task.file.property('status') == &quot;In Progress&quot;</code></li>
<li><strong>Any note</strong> can become a project on the Kanban… this blog post is a project right now.</li>
<li>I can leave <code># FIXME</code> style tasks on any writing project anywhere in my notes, and they show up in my task lists. This post had <code>- [ ]</code> tasks all over it while I worked on it.</li>
<li>I love being able to combine documentation and todos. I now have documents for my vehicles containing both a log of repairs, and tasks for what to do next.</li>
</ul>
<p>Some useful plugins that I've found helpful:</p>
<ul>
<li><a href="https://github.com/TfTHacker/obsidian42-text-transporter">TextTransporter</a> let's me push a line to another file. It's not as good as <a href="https://orgmode.org/manual/Refile-and-Copy.html">orgmode's refile action</a>, but it's close. <em>Super</em> handy for processing the Inbox into project lists. I have some of the TT actions under Leader Key plugin under <code>⌘+.</code></li>
<li><a href="https://github.com/vslinko/obsidian-outliner">Outliner</a> has some shortcuts for moving around bullet points that makes reordering a task nice</li>
<li><a href="https://publish.obsidian.md/omnisearch/How+to+use+Omnisearch">Omnisearch</a> makes searching much faster.</li>
</ul>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>Obsidian Tasks is definitely not for everybody, but it is for me. Who else might it be for?</p>
<ul>
<li>spiritual folks who want to include quotes among their task system to remember a higher calling.</li>
<li>writers who spend a lot of times deep in a document, and want their tasks to link to a place in that document.</li>
<li>people who stare longingly at orgmode and want something approachable and mobile friendly.</li>
</ul>
<p>I'm delighted. I have a system that is free and flexible, on all my devices. It lives among my writing and my work, and can be summoned to appear magically among my rituals documents for minimal friction. I can make custom and detailed overviews. And it's still growing.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-nudges">
<p>I talked a little about how I define nudges in the last post. <a href="#fnref-nudges" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-started">
<p>I had been <a href="https://evantravers.com/articles/2022/08/30/writing-in-obsidian/">using Obsidian Kanban to manage writing projects</a> for the past few years. I love that it's plaintext under the hood, and you can easily script it or modify it. <a href="#fnref-started" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-todoist">
<p>Yes, I know Todoist.app has this feature now… but then I'd still be bouncing back and forth between context and tasks, and a lot of this is reducing that friction. <a href="#fnref-todoist" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Aposiopesis Aggression</title>
       <link>http://evantravers.com/articles/2025/01/03/aposiopesis-aggression/</link>
       <pubDate>Fri, 03 Jan 2025 20:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/01/03/aposiopesis-aggression/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Recently someone at work said &quot;people around here use the ellipsis a lot.&quot; (I smiled, and nodded, knowing that that almost <em>certainly</em> meant me.)</p>
<p>Then they added… &quot;and to me an ellipsis always means stress and anger.&quot;</p>
<p>I was horrified.</p>
<p>I've used an ellipsis… (steps away to count using rg and vim) <strong>1,317</strong> times on my blog. Have I been threatening y'all?!</p>
<p>I honestly don't know what to do. I have <em>always</em> loved the ellipsis as a pause, to represent my internal self-conscious search for the right words.<sup class="footnote-ref"><a href="#fn-editors" id="fnref-editors" data-footnote-ref>1</a></sup> I believe that I picked this up from dialog in novels I loved<sup class="footnote-ref"><a href="#fn-novels" id="fnref-novels" data-footnote-ref>2</a></sup>. (I'll probably dig into my bookshelf to see which ones used the device.) It was there that I picked up the belief that <code>…</code> meant a gap in racing thoughts, a self-conscious and humble admission that the right words do not come easy to me.</p>
<p>The wikipedia article calls using an ellipsis at the end of a sentence as Aposiopesis as &quot;is the use of an ellipsis to trail off into silence.&quot; It's associated with strong emotion like fury or modesty.</p>
<p>For me it's mostly been modesty.</p>
<p>Now I find that my intended humility is read as… <a href="https://workplace.stackexchange.com/questions/149145/is-the-use-of-ellipsis-dismissive-or-rude#149149">dismissive</a>. It's very associated with boomers and older.<sup class="footnote-ref"><a href="#fn-old" id="fnref-old" data-footnote-ref>3</a></sup></p>
<p>For those to whom I have miscommunicated since I discovered that <code>⌥-;</code> sends the <code>…</code> character: <strong>please</strong> forgive me. It was done unintentionally.</p>
<p>I'm probably going to attempt to erase it from my daily work text communication. I'm not going to stop using it in my personal writing. It's become part of my voice that I like… and it'd be hard to erase that.</p>
<p>So…</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-editors">
<p>Some sources seem to support my thinking, like <a href="https://editorsmanual.com/articles/ellipsis/">this article from editorsmanual.com</a> which calls them suspension points:</p>
<blockquote>
<p>The three dots that make up an ellipsis are also called suspension points. In informal writing, these dots can indicate indecision, an incomplete thought, or a pause. The ellipsis then acts as a punctuation mark that indicates a pause.</p>
</blockquote>
<a href="#fnref-editors" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
<li id="fn-novels">
<p>I'm still looking through my old books to see which ones may have had this effect on me. Close at hand, <em>The View From Saturday</em> by E.L. Konigsburg has this pattern. <a href="#fnref-novels" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-old">
<p>In my mind, I've always read and spoken as if I didn't fit in my generation so I suppose that fits.</p>
<ul>
<li><a href="https://www.purewow.com/tech/why-do-boomers-use-ellipses">https://www.purewow.com/tech/why-do-boomers-use-ellipses</a></li>
<li><a href="https://theoutline.com/post/3333/why-do-old-people-text-like-this-an-investigation">https://theoutline.com/post/3333/why-do-old-people-text-like-this-an-investigation</a></li>
</ul>
<a href="#fnref-old" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Recently Reading</title>
       <link>http://evantravers.com/articles/2025/01/02/recently-reading/</link>
       <pubDate>Thu, 02 Jan 2025 06:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2025/01/02/recently-reading/</guid>
       <description><![CDATA[ <h4><a href="#night-driving-by-chad-bird" aria-hidden="true" class="anchor" id="night-driving-by-chad-bird"></a>Night Driving by Chad Bird</h4>
<p><em>Chad reflects on his own journey through sin and exile, how he previously upheld a standard of perfection through choosy reading of the OT, and how he learned to see God at the center of redemption, not his own repentance or penance.</em></p>
<p>This honestly heartbreaking and uplifting personal story was one of the books the Lord used in my heart this year to help me understand forgiveness, and how I foolishly refuse to accept it.</p>
<h4><a href="#stepping-up-by-dennis-rainey" aria-hidden="true" class="anchor" id="stepping-up-by-dennis-rainey"></a>Stepping Up by Dennis Rainey</h4>
<p><em>Using examples from history and scripture, Rainey argues that the masculine virtue is courage and walks through a man's life examining the areas where we are tempted to retreat vs. the Godly calling to step up.</em></p>
<p>The mentality of taking initiative, of &quot;stepping up&quot; is very convicting to me. Rainey argues successfully that it's the essential godly masculine trait, and one I fail at constantly. I need to revisit the ten questions from the Courage chapter. While I would have preferred less movie-references and more scripture, this book did leave a mark on my thoughts.</p>
<h4><a href="#slow-productivity-by-cal-newport" aria-hidden="true" class="anchor" id="slow-productivity-by-cal-newport"></a>Slow Productivity by Cal Newport</h4>
<p><em>Aligning himself with a larger movement, Cal argues for a historically-based and more intentional method of productivity: work at a natural pace. Don't succumb to the cult of busyness.</em></p>
<p>I've read and heard so much about the arguments of this book that it wasn't as revolutionary to me, but I do want all my future managers to be familiar with the ideas. I've been thinking a lot about how I could construct a &quot;Pull Work&quot; environment for my team.</p>
<h4><a href="#rejoice-and-tremble-by-michael-reeves" aria-hidden="true" class="anchor" id="rejoice-and-tremble-by-michael-reeves"></a>Rejoice and Tremble by Michael Reeves</h4>
<p><em>Dismantling unbiblical perspectives on the Fear of God, Reeves works through scripture and Puritan writings to show that Godly fear is indeed fear of the beauty and goodness of God, knowing him as creator and redeemer.</em></p>
<p>If Isaiah 11:3 represents Jesus as having the Fear of the Lord, then it can neither mean &quot;being afraid&quot; nor can this fear be the opposite of love… then what is it?</p>
<p>Excellent book. I will reread this year most likely.</p>
<h4><a href="#the-demon-of-unrest-by-erik-larson" aria-hidden="true" class="anchor" id="the-demon-of-unrest-by-erik-larson"></a>The Demon of Unrest by Erik Larson</h4>
<p><em>Chronicling the time between Lincoln's election and the Firing on Fort Sumpter, Larson weaves together different diaries and letters to show how miscommunication and lack of leadership laid the fuel for the fire of Civil War.</em></p>
<p>I love most of Larson's works, and this is no exception. There are some broken men and women in this story, and hard facts of history. Larson himself admits not being impartial here, and honestly loathes aspects of southern culture, including religion, that makes some of his judgements hard to swallow. Still a good read.</p>
<h4><a href="#brave-new-words-by-salman-khan" aria-hidden="true" class="anchor" id="brave-new-words-by-salman-khan"></a>Brave New Words by Salman Khan</h4>
<p><em>As a lifelong tutor, Khan makes the techno-optimist case that Generative AI could be prompted to be the tutor for every student in the world.</em></p>
<p>Admitting his <em>The Diamond Age</em> influence, Khan discusses and &quot;demos&quot; his Khanmigo tutor for everybody. At the very end he stops assuming Dewey-istic mass education and rethinks how education could work with such tech, but most of the book is about band-aiding existing educational problems rather than other approaches. A must-read for anyone in ed-tech.</p>
<h4><a href="#moonbound-by-robin-sloan" aria-hidden="true" class="anchor" id="moonbound-by-robin-sloan"></a>Moonbound by Robin Sloan</h4>
<p><em>A boy feels that his life must be more than his humble village, under neath the dragon's moon.</em></p>
<p>Imaginative and joyful. An interesting take on intelligence and story.</p>
<h4><a href="#the-common-rule-by-justin-whitmel-earley" aria-hidden="true" class="anchor" id="the-common-rule-by-justin-whitmel-earley"></a>The Common Rule by Justin Whitmel Earley</h4>
<p><em>If our habits our build our lives, then distinctly Christian lives should have distinctly Christian habits.</em></p>
<p>Working from personal experience with Burnout, Justin presents 8 habits to create margin, and a different way of living.</p>
<p>Nearly the same origin story as <em>How To Calm Your Mind</em> by Chris Bailey, but from a christian perspective. Just argues eloquently that habits form our hearts, so we should choose our habits wisely. I love the Habit of Failure and Formation: How we &quot;get back up&quot; is more important than how we fall.</p>
<p>Continued logically to children in <em>Habits of The Household</em>.</p>
<h4><a href="#just-enough-research-by-erika-hall" aria-hidden="true" class="anchor" id="just-enough-research-by-erika-hall"></a>Just Enough Research by Erika Hall</h4>
<p><em>Collection of useful advice for practical research.</em></p>
<p>I was convicted at some of the areas where I fall short here. One practical and simple one that kicked me hard was: use finite words for problem statements. Don't say &quot;understand&quot; or &quot;explore,&quot; instead try &quot;describe&quot; or &quot;identify.&quot;</p>
<h4><a href="#a-neglected-grace-by-jason-helopoulos3" aria-hidden="true" class="anchor" id="a-neglected-grace-by-jason-helopoulos3"></a>A Neglected Grace by Jason Helopoulos3</h4>
<p><em>Family worship follows the Regulative Principle and ideally should include the word, prayer, and singing. It falls upon the father as a joyful responsibility.</em></p>
<p>This inspired me to start reading through whole books of the Bible, and to try singing some hymns with the kids.</p>
<h4><a href="#personal-socrates-by-marc-champagne" aria-hidden="true" class="anchor" id="personal-socrates-by-marc-champagne"></a>Personal Socrates by Marc Champagne</h4>
<p><em>An interviewer profiles curious humans and the central questions that drove their lives.</em></p>
<p>While I struggled with some of the profiles (I'm not a fan of astrology) some of the questions hit me hard. I've broken them out into a file that I can revisit periodically during my <a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/">rituals</a>.</p>
<h4><a href="#a-swim-in-a-pond-in-the-rain-by-george-saunders" aria-hidden="true" class="anchor" id="a-swim-in-a-pond-in-the-rain-by-george-saunders"></a>A Swim in a Pond in the Rain by George Saunders</h4>
<p><em>A writing instructor condenses his favorite class on Russian short-literature sharing some thoughts on how to craft fiction, and how it in turn transforms us.</em></p>
<p>This is not an easy read, but worthy. Some of the exercises Saunders takes the reader through causes a greater awareness of how reading fiction affects us, and the intuition and science of writing, including one of my favorite descriptions:</p>
<blockquote>
<p>We can reduce all of writing to this: we read a line, have a reaction to it, trust (accept) that reaction, and do something in response, instantaneously, by intuition.</p>
<p>That's it.
Over and over.</p>
</blockquote>
<h4><a href="#a-system-for-writing-by-bob-doto" aria-hidden="true" class="anchor" id="a-system-for-writing-by-bob-doto"></a>A System for Writing by Bob Doto</h4>
<p><em>A zettelkasten tinkerer summarizes constructing and using a zettelkasten as a creativity system.</em></p>
<p>A concise and helpful description of a proper analog or digital zettelkasten. While I was familiar with much of the language, this finally helped it all click. The power of Doto's arguments is such that I'm tempted to try folgezettel alphanumeric IDs, I'm envious of the dimensions of proximity and depth that it adds.</p> ]]></description>
    </item>
    <item>
       <title>2024</title>
       <link>http://evantravers.com/articles/2024/12/31/2024/</link>
       <pubDate>Tue, 31 Dec 2024 21:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/12/31/2024/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/12/2024.JPG"></p><p>The theme going into 2024 was &quot;Own Up.&quot; In <a href="https://evantravers.com/articles/2024/01/01/2023/">2023</a> &quot;Wake Up&quot; was part of revealing some areas that needed improving, and Own Up represented taking ownership of that and being intentional. It's largely guided my headspace and has been helpful.</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>While this is always an area I feel I could improve, the real story is not what I have done, but what God is doing in me.</p>
<p>Through a series of messages, books, conversations, and counseling God has been quietly dismantling <a href="https://evantravers.com/articles/2023/07/27/last-mile-legalism/">my legalistic heart</a> into one that quietly abides. When I am trusting in my own righteousness I refuse to be comforted, and feel like I have to &quot;get back on the path&quot; in my own strength. This never ends well. Jesus showed me a little of what it means to be loved from before I even sinned, and that feeling of His love has lasted. There is still much to wrestle through, but I know He will carry to completion what He has began.</p>
<p>I sporadically journaled my QT reading and praying, and that brought a little more intentionality and structure to my quiet time. I'm also trying to put another moment of prayer and the Word in the afternoon. Toddler-filled mornings often swallow my morning quiet-time. This is helping so far.</p>
<p>Inspired by a godly friend and upheld by the Lord, we've had a consistently restarted family worship. Hearing the kids sing Christmas Carols at the tops of their lungs has been a wonderful temporal reward to months of patiently asking them to &quot;please come back to the table and let daddy finish reading this.&quot;</p>
<p>I'm trying to pay more attention to what God is doing, so my quarterly reviews now prominently feature answers to prayer that I know about. A quick scan showed around 40ish. Awfully encouraging to go to my knees when I can easily remind myself that the Lord hears.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>I'm blessed by my wife. Best of wives, best of women.</p>
<p>I've been attempting to refocus my intentionality on our relationship. To that end I added a section to my daily and weekly journaling to notice what's going on her life. I'll likely extend this to the kids as well, especially as our older ones are getting big feelings and &quot;story arcs&quot; that last weeks.</p>
<p>I've also taken the kids on more &quot;daily adventures,&quot; one of the privileges of homeschooling. Returning packages, getting haircuts, coworking at the coffeeshop, even career events. They seem to love it, it gets them out of the house for the wife, and car-ride questions are always a golden opportunity.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p>I started this year ten pounds heavier than I should be. I did largely lose that weight and also gained some muscle.</p>
<p>I was working through a foot injury all year. After a year of PT, I can muster up a run once a week without pain which is <em>such</em> a blessing.</p>
<p>I also invested in some weights and a sports watch. Moving from bodyweight to a simple bench and dumbells has helped me reengage with workouts, and the watch has the dual purpose of helping me track sleep (which is improving!) and offering coaching and running workouts suggestions. I'm excited to see that compounding effect over time.</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>I'm still sketchnoting every sermon I hear.</p>
<p><img src="https://images.evantravers.com/articles/2024/12/sketchnotes.png" alt="" /></p>
<p>I don't yet know what to do with these. I think having a &quot;blog&quot; here with a separate RSS feed makes the most sense, but I'm not sure.</p>
<p>This has been a quietly productive year. I did a lot of learning about <a href="https://evantravers.com/articles/tags/nix/">nix</a>, so that dominated a lot of my random coding time.</p>
<p>I touched 4000 files in my wiki this year, although I'm sure a lot of those were cleaning up my <code>- [ ]</code> tasks to get ready to use Obsidian Tasks as my task manager (more on that later!)</p>
<p>I just about tied last year with 51-ish<sup class="footnote-ref"><a href="#fn-tied" id="fnref-tied" data-footnote-ref>1</a></sup> articles.</p>
<p>I'm proud of:</p>
<ul>
<li><a href="https://evantravers.com/articles/2024/03/07/on-augmented-reality/">On Augmented Reality</a></li>
<li><a href="https://evantravers.com/articles/2024/05/18/connected-bible-study-in-markdown/">Connected Bible Study in Obsidian</a></li>
<li><a href="https://evantravers.com/articles/2024/09/03/positions-on-generative-ai/">Positions on Generative AI</a></li>
<li><a href="https://evantravers.com/articles/2024/09/17/making-my-nvim-act-more-like-helix-with-mini-nvim/">Making my Nvim Feel More Like Helix with Mini.nvim</a></li>
</ul>
<h2><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h2>
<p>I started 28 books this year, finishing 26. 7 fiction, 19 non-fiction. I still don't have a regular reading habit, it fits in-between other things.</p>
<h2><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h2>
<p>This has been a busy and chaotic year. I have a great team that I love to serve, and I have found encouragement measuring the effect of our UX Vision has had over the past five years.</p>
<p>I've started using <a href="https://www.focusmate.com">FocusMate</a> to create focused blocks of work, and I have enjoyed it. I've also switched back to doing some pomodoro blocks and have benefited from that too.</p>
<p>I'm excited to see what this year holds.</p>
<h2><a href="#2025" aria-hidden="true" class="anchor" id="2025"></a>2025</h2>
<p>As much as I am a fan of <a href="https://www.themesystem.com">yearly themes</a>, a new theme for 2025 has not emerged. To be honest, this holiday season has had less reflection time than I typically give myself, although I'm not sorry for how I spent it. Perhaps a phrase will reveal itself and resonate as we go through <a href="https://evantravers.com/articles/2020/12/28/plan-your-year/">Plan Your Year</a> this week.</p>
<p>May your 2025 be blessed. Happy New Year!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-tied">
<p>It's fascinating to me how the numbers have largely leveled out… I can't run farther, workout more hours, write more, etc. without a substantial change to my patterns of life. <a href="#fnref-tied" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Why I&#39;m Changing My Task Manager</title>
       <link>http://evantravers.com/articles/2024/12/26/why-im-changing-my-task-manager/</link>
       <pubDate>Thu, 26 Dec 2024 09:11:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/12/26/why-im-changing-my-task-manager/</guid>
       <description><![CDATA[ <p>Like a favorite jacket that no longer fits just right, I've realized that my current task management system no longer serves me well.</p>
<p>A personal system should change with you. While I sadly am not skilled enough to rescue my favorite jacket, I <em>can</em> adjust my productivity system to serve my needs.</p>
<p>I've been holding out for a while, ignoring some of the signs. It was scary to change something that's been working so well for so long. Eventually some of the friction has really started to bother me.</p>
<ul>
<li>Over the past five years my work has shifted to more writing.</li>
<li>I'm often copying things out of Obsidian and linking back to context in Obsidian. (Booknotes action items, next steps for writing, etc.)</li>
<li>I was grooming two different project boards: one for writing, another for the rest of my life. Everything but writing was winning… even though I say I value writing.</li>
<li>I wanted badly to express a more nuanced view of Project state.. I found myself managing a Kanban in another app just to visualize it.</li>
<li>I badly wanted a way to put tasks on my calendar.</li>
<li>I'm doing more and more work on PC and Linux. It's frustrating to go power up an older Mac device just to see my tasks.</li>
<li>I'm simply not using quick capture (Thing's best feature) less and less.<sup class="footnote-ref"><a href="#fn-capture" id="fnref-capture" data-footnote-ref>1</a></sup></li>
<li>I don't work out of the Things.app Today list. I copy big things to my bullet journal, and check in periodically, but I don't have it open in the second monitor.</li>
</ul>
<p>While I've <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/">played around with other Task Managers before</a>, around four months ago I started slowly planning to finally make the change.</p>
<h2><a href="#jobs-to-be-done" aria-hidden="true" class="anchor" id="jobs-to-be-done"></a>Jobs to Be Done</h2>
<p>I've realized there are two jobs that I've hired my task manager to do:</p>
<ol>
<li><strong>Manage</strong> and filter a series of project-esque lists.</li>
<li>Remember and <strong>Nudge</strong>: due dates or rituals.</li>
</ol>
<p>I've currently split these up. I may live to regret it.</p>
<p>Two insights:</p>
<p>First, that neither require require constant browsing access. For managing, you just need to know <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/#the-brain-and-the-list">a limited subset of &quot;next things to do.&quot;</a> For nudging, all you need is the reliable notification at the right moment.</p>
<p>Second: These &quot;jobs&quot; are highly modal. Almost all Nudges are recorded on phone on the go, and almost all Manage tasks are created from my laptop during the execution of a project.</p>
<p>I believe there is <em>great value</em> in having both these &quot;jobs&quot; live in the same system. I really wouldn't advocate for having separate systems. In fact, Things.app is <em>really great</em> at handling both jobs.</p>
<p>I'm particularly refactoring my Manage system, so for the moment I've broken out Nudging from Things.app into Reminders.app so that my normal machine of life can keep chugging. In addition, I was choosing between bullet journal and Obsidian Tasks, and neither of those are especially good at Nudging.</p>
<h2><a href="#what-defines-a-nudge" aria-hidden="true" class="anchor" id="what-defines-a-nudge"></a>What Defines a &quot;Nudge?&quot;</h2>
<p>This is really clear in my mind, but very hard to explain.</p>
<p>Everything that I define to be a nudge is an isolated<sup class="footnote-ref"><a href="#fn-isolated" id="fnref-isolated" data-footnote-ref>2</a></sup> task that is only directly related on a true Start Date or Location.</p>
<p>(If you use Siri to create reminders, many of those &quot;remind me to grab milk <em>when I get home</em>&quot; or &quot;remind me to take my pill <em>every day at 8a</em>&quot; sort of things I would define to be a Nudge.)</p>
<p>I also moved my <a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/">Rituals prompts</a> to Reminders… and it's been great!</p>
<figure class="three-up">
    <img src="https://images.evantravers.com/articles/2024/12/reminders-today.PNG">
    <img src="https://images.evantravers.com/articles/2024/12/reminders-rituals.PNG">
    <img src="https://images.evantravers.com/articles/2024/12/reminders-family.PNG">
    <figcaption>
        <ul>
            <li>Works very well from the Today smart list</li>
            <li>I have lists for kinds of Nudges and Sections for areas of life</li>
            <li>There's some kinda low-level "don't let me forget" going on in here. Lowers stress in my life.</li>
        </ul>
    </figcaption>
</figure>
<ul>
<li>Reminders is <em>very good</em> at notifications.<sup class="footnote-ref"><a href="#fn-notifications" id="fnref-notifications" data-footnote-ref>3</a></sup></li>
<li>Inputting random items through Siri is very handy.</li>
<li>I can share some of them with family through iCloud.</li>
<li>Reminders directly supports a URL, so linking to a checklist in Obsidian (of course!) is easy.</li>
</ul>
<figure>
    <img src="https://images.evantravers.com/articles/2024/12/fantastical-today.PNG">
    <figcaption>
        <p>
            Reminders can be <a href="https://evantravers.com/articles/2023/05/16/time-blocking-in-fantastical/">timeblocked on Fantastical</a> using the <code>[20m]</code> syntax, so my Rituals can live on my calendar where they should be.
        </p>
    </figcaption>
</figure>
<p>While I intended this to be temporary system… it's working much better than I anticipated. I would advocate that most people should have all their tasks and nudges in one system, but this will work for now for me.</p>
<p>(Honestly, Reminders.app is now a &quot;good enough&quot; task manager for most people, especially if you add some apps or Shortcuts on top of it to make capture easier.)</p>
<h3><a href="#why-not-bullet-journal" aria-hidden="true" class="anchor" id="why-not-bullet-journal"></a>Why Not Bullet Journal?</h3>
<p>Honestly, with this division of jobs between manage and remember, I could easily give an analog system the job of Remembering. As it is, there were certain advantages I could see in using a digital system, but you could take that insight and run with it.</p>
<p>If you are customizing your system, make something that works the way <em>you</em> work. If you are a tmux-ninja who lives in his terminal, choose TaskWarrior. If you are trying to use grippy rather than slippy tools to help your burdened focus (or just love fountain pens!) choose Bullet Journal. If you just want Things + time blocking on your calendar, Todoist is winning the race.</p>
<p>I do lot of writing and thinking in plaintext markdown, and many of my tasks and &quot;next actions&quot; come from that activity. Embedding my tasks in the context that spawned them has a lot of value for me.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>In <a href="https://evantravers.com/articles/2025/01/06/setting-up-obsidian-tasks-as-a-things-app-user/">the next post</a> I'll detail how I set up Obsidian Tasks to feel familiar coming from Things.app, and the neat features and things I've found since switching.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-capture">
<p>Part of that is intentional behavior change on my part as a preparation for moving away, part of that is some frustrating tech choices at work (<em>cough</em> teams <em>cough</em>) that don't have URLs to grab. <a href="#fnref-capture" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-isolated">
<p>It's not dependent on any other list or task for dependencies or context. <a href="#fnref-isolated" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-notifications">
<p>A large part of this is how I have locked down my devices to only show notifications for family messages, upcoming events, or nudges. <a href="#fnref-notifications" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Merging my Creativity System and Blog</title>
       <link>http://evantravers.com/articles/2024/12/20/merging-my-creativity-system-and-blog/</link>
       <pubDate>Fri, 20 Dec 2024 10:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/12/20/merging-my-creativity-system-and-blog/</guid>
       <description><![CDATA[ <p>I have been stuck for… years? I want to have a single git repository that's both where I think and emits content out to this blog. <a href="https://stephango.com/">@kepano</a> demoed his incredibly similar process just this week, and it makes me envious:</p>
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="en" dir="ltr">a quick demo of how I edit my website with Obsidian 1.8<br><br>write in <a href="https://twitter.com/obsdmd?ref_src=twsrc%5Etfw">@obsdmd</a> → auto-build jekyll → preview local site in web viewer tab → push to github → auto-deploy to live site<br><br>I&#39;ve been making websites for twenty five years, and this is by far the nicest it&#39;s ever been <a href="https://t.co/Dlw7Iorxop">pic.twitter.com/Dlw7Iorxop</a></p>&mdash; kepano (@kepano) <a href="https://twitter.com/kepano/status/1869857708394086450?ref_src=twsrc%5Etfw">December 19, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Fantastic.</p>
<p>I've got a lot of technical debt: A 2GB+ blog repo (images I haven't been able to scrub from history), but I want to <em>maintain</em> the history to preserve <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">my changelogs</a>. Which history would have to disappear? My wiki and changes, or my blog's truthfulness and accountability? Ugh!</p>
<p>I complained, and <a href="https://chriskrycho.com">Chris Krycho</a> and <a href="http://thecreekmores.org/">Jonathan Creekmore</a> kindly reached out separately with solutions. Thank you gentlemen! 🙏</p>
<ul>
<li><code>git merge --allow-unrelated-histories</code> let's you take two separate histories and merge them.</li>
<li><code>git filter-repo</code> lets you do some big changes to a repository.</li>
</ul>
<p>(To be fair, Krycho was pointing out that this would be even easier in jujutsu, but more on that later. 😂)</p>
<h2><a href="#what-i-did" aria-hidden="true" class="anchor" id="what-i-did"></a>What I Did</h2>
<p>Now inspired… I got hacking. I'm again using ruby to drive shell scripts, which <em>is weird</em>, but allows me to drop into ruby's very powerful regex system for file manipulation.</p>
<p>Here's what I was able to do:</p>
<p>Starting with:</p>
<ul>
<li>blog: <code>evantravers.com</code> repo (2GB, middleman site, history of articles)</li>
<li>wiki: <code>wiki</code> repo (189MB, markdown and javascript, history of wiki edits)</li>
</ul>
<p>I create some non-destructive tmp copies. Then I'm mostly changing things in the blog repo:</p>
<ol>
<li>Use <code>git filter-repo --path-regex</code> to delete everything that isn't a markdown file</li>
<li>Use <code>git filter-repo --subdirectory-filter</code> to set the folder with articles as &quot;root&quot;</li>
<li>Clean up other files in the repo.</li>
<li><code>git filter-repo --strip-blobs-bigger-than 1M</code></li>
<li><code>git gc</code> (garbage collection just in case.)</li>
<li>For each file:
<ul>
<li>rename the file as a ZK or evergreen file</li>
<li>add permalink/slug metadata</li>
</ul>
</li>
<li>Make a commit describing the changes I've just done.</li>
</ol>
<p>Then I merge the two repos with <code>git merge --allow-unrelated-histories</code>, leaving my <code>tmp/wiki</code> folder in a merge conflict between the old evergreen notes and the new copies from the blog.</p>
<h2><a href="#how-i-did-it" aria-hidden="true" class="anchor" id="how-i-did-it"></a>How I Did It</h2>
<p>If you are interested in seeing code, let's dig in:</p>
<p>First: some boilerplate, some resetting of the folder so that the script is idempotent, and some <code>git filter-repo</code> magic to shrink the blog repo down to just the markdown articles.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># frozen_string_literal: true</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Setup some constants to store the locations of the tmp folders</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tmp/evantravers.com</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">WIKI</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tmp/wiki</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># BLOG MINIFICATION AND MERGING WITH WIKI</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># =============================================================================</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Resetting tmp…</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rm -rf tmp</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkdir tmp</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># COPY blog to this folder</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Copying blog…</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp -r ../evantravers.com/ ./</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cd </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">; rm -rf build</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="19">
</div><div class="line" data-line="20"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Remove everything but the content</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># </span><span style="color: light-dark(#ffffff, #0d1117); background-color: light-dark(#d0d7de, #7d8590); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">TODO</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> I probably need to include my resume builder</span>
</div><div class="line" data-line="22"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">remove everything but articles: remove LFS, git filter-repo</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="24">cd </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="25">git lfs uninstall
</div><div class="line" data-line="26"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># (I&#39;m currently using LFS, but I&#39;d like to move away from that eventually.)</span>
</div><div class="line" data-line="28">
</div><div class="line" data-line="29"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Now we get into it. I want to end up with a folder containing nothing but my articles and their git history.</span>
</div><div class="line" data-line="30"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># First, `git filter-repo` is going to strip out everything that doesn&#39;t match a regex, in this case doesn&#39;t end in `.md`</span>
</div><div class="line" data-line="31"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="32">git filter-repo --path-regex &#39;^.*.md$&#39; --use-base-name --force
</div><div class="line" data-line="33">
</div><div class="line" data-line="34"># This next command sets source/articles as if it was the root dir. Pretty magic.
</div><div class="line" data-line="35">git filter-repo </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\
</div><div class="line" data-line="36"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  --subdirectory-filter source/articles </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\
</div><div class="line" data-line="37"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  --force
</div><div class="line" data-line="38">
</div><div class="line" data-line="39"># This command is worded strangely. I want to get rid of the series folder, so I filter-repo **to** series, but then invert the &quot;selection&quot;
</div><div class="line" data-line="40">git filter-repo --path series --invert
</div><div class="line" data-line="41">
</div><div class="line" data-line="42"># a quick clean to remove any now un-tracked files
</div><div class="line" data-line="43">git clean -df
</div><div class="line" data-line="44"># removing a folder that doesn&#39;t need to exist anymore.
</div><div class="line" data-line="45">rm -rf source
</div><div class="line" data-line="46">
</div><div class="line" data-line="47"># Remove the 400MB LFS folder
</div><div class="line" data-line="48">rm -rf .git/lfs
</div><div class="line" data-line="49">
</div><div class="line" data-line="50"># Remove untracked dotfiles
</div><div class="line" data-line="51">rm -rf .devbox .devenv .direnv .DS_Store
</div><div class="line" data-line="52"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="53">
</div><div class="line" data-line="54"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># CLEAN unlinked objects? (Currently reduced the repo size to 3.9MB)</span>
</div><div class="line" data-line="55"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Attempting to clean the repo to make it smaller</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="56"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="57">cd </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="58"># this may not be needed, but stripping all blobs bigger than a 1M should remove every image. Could be smaller I suppose.
</div><div class="line" data-line="59">git filter-repo --strip-blobs-bigger-than 1M
</div><div class="line" data-line="60"># a garbage collection just in case.
</div><div class="line" data-line="61">git gc --auto
</div><div class="line" data-line="62"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div></code></pre>
<p>After all those transformations, my once 2GB blog repo is now a meagre 5.5MB. Awesome!</p>
<p>With that done I now do some transforming of the article files so that they can live in the wiki comfortably.</p>
<p>I'll define some convenience functions, and then <code>Dir.glob</code> over the articles we've just <code>git filter-repo</code>'d.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1">
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># </span><span style="color: light-dark(#0969da, #2f81f7); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">NOTE</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> Should there be booknotes in this list?</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Some of my blog posts have &quot;mirrors&quot; in my main notes. This is a mapping of those posts to those Evergreen or Main Notes that already exist.</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">EVERGREEN</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2024-09-16-take-screenshots-of-your-work.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Take Screenshots of Your Work</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2024-09-03-positions-on-generative-ai.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Positions on Generative AI</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2023-10-25-opportunity-solution-trees.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Opportunity Solution Trees</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2023-06-26-he-who-grasps-the-heel.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">He Who Grasps the Heel</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2023-05-21-and-there-arose-a-generation-who-knew-not.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">And There Arose a Generation Who Knew Not</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2022-07-12-never-make-infinite-meetings.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Never Make Infinite Meetings</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2021-11-08-border-of-the-known.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Border of the Known</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2020-07-09-outcomes-over-outputs.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Outcomes over Outputs</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">freeze</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># quick check to make sure that I end up with the same number of files that I started with.</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BEFORE: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ls -l </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> | wc -l</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> posts</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="17">
</div><div class="line" data-line="18"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># quick and dirty way to &quot;slice&quot; a YAML block out of the front of an article.</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta_start</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_index</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=~</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta_end</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">…</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_index</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=~</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta_start</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta_end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span>
</div><div class="line" data-line="24"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="25">
</div><div class="line" data-line="26"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># add_meta takes a file&#39;s content and writes a new YAML string key</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I 100% should have just used a gem for this.</span>
</div><div class="line" data-line="28"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># </span><span style="color: light-dark(#ffffff, #0d1117); background-color: light-dark(#d1242f, #f85149); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FIXME</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> add_meta is going to read and write like three times per file</span>
</div><div class="line" data-line="29"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">value</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="30">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="31">
</div><div class="line" data-line="32">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil?</span>
</div><div class="line" data-line="33">
</div><div class="line" data-line="34">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="35">
</div><div class="line" data-line="36">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new_meta</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">value</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span>
</div><div class="line" data-line="37">
</div><div class="line" data-line="38">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="39"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="40">
</div><div class="line" data-line="41"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># The main loop.</span>
</div><div class="line" data-line="42"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Dir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">glob</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="43">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">read</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="44">
</div><div class="line" data-line="45">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># add `published: true` to every article.</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="47">
</div><div class="line" data-line="48">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># compute the slug and add it. I may move this to a permalink attribute some day.</span>
</div><div class="line" data-line="49">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slug</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;4&rbrace;-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;2&rbrace;-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;2&rbrace;-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="50">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slug</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slug</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="51">
</div><div class="line" data-line="52">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="53">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">EVERGREEN</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="54">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># rename file to evergreen title</span>
</div><div class="line" data-line="55">      <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Found an evergreen file! </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">…</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="56">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">EVERGREEN</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="57">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="58">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># use zkid based on date</span>
</div><div class="line" data-line="59">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datestr</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="60">
</div><div class="line" data-line="61">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zkid</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="62">        <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DateTime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datestr</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="63">                <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%Y%m%d%H%M</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="64">
</div><div class="line" data-line="65">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zkid</span>
</div><div class="line" data-line="66">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="67">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="68">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I specifically use a rename rather than the single write so that git will `--follow` it.</span>
</div><div class="line" data-line="69">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="70"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="71">
</div><div class="line" data-line="72"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># quick check to make sure that I end up with the same number of files that I started with.</span>
</div><div class="line" data-line="73"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AFTER: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ls -l </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> | wc -l</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> posts</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div></code></pre>
<p>With all that done, I make a commit on the repo to &quot;stamp&quot; the changes in before doing the merge.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Committing changes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="3">cd </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BLOG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="4">git add -A
</div><div class="line" data-line="5">git commit -m &#39;Migration to wiki:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- rename and rewrite of history</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- adding new YAML attributes&#39;
</div><div class="line" data-line="6"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># COPY wiki to this folder</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Copying wiki…</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp -r ../../../wiki/ ./</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">WIKI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div></code></pre>
<p>Now all that's left is to use <code>git remote</code> and <code>git merge</code> to pull this new slimmed down repo into my wiki:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># MERGE modified blog with wiki</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="3">cd </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">WIKI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="4">git remote add blog ../evantravers.com
</div><div class="line" data-line="5">git fetch --all
</div><div class="line" data-line="6">git merge blog/master --allow-unrelated-histories
</div><div class="line" data-line="7"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div></code></pre>
<h2><a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"></a>What's Next</h2>
<p>This leaves me in a merge conflict where I need to reconcile the existing Evergreen files and my blog posts… and that's fantastic!</p>
<p>At this point, the next step seems to be to write some kind of middleware to translate the wiki's content into something that Middleman will accept<sup class="footnote-ref"><a href="#fn-accept" id="fnref-accept" data-footnote-ref>1</a></sup>. (Middleman is very picky about filenames, file extensions, a whole mess of things.)</p>
<p>So I suppose the deploy will look like this:</p>
<ul>
<li>a push to my wiki or my blog repo will trigger a build.</li>
<li>the blog builder will shallow checkout, and then deep checkout the content (wiki) repo.</li>
<li>the middleware will transform the small wiki into a smaller subset of middleman ready articles</li>
<li>then middleman will run and push it to S3.</li>
</ul>
<p>One thing that I've realized is that this will likely speed up deploys: Currently I have to do a deep copy checkout of my whole 2G repo in order to have the changelogs... now I can just do a shallow checkout and save a few seconds.</p>
<p>The nice thing is that since this script is stable, I can keep working and writing while I figure out whether that middleware layer should be in nix, middleman, or a ruby script I just call.</p>
<p>I should just do the simplest thing and move on. 🤷</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-accept">
<p>The other path is to rewrite my whole blog into something else other than Middleman, and that while I will consider isn't something for which I have bandwidth. <a href="#fnref-accept" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Apple Intelligence&#39;s Advertising</title>
       <link>http://evantravers.com/articles/2024/11/19/apple-intelligence-s-advertising/</link>
       <pubDate>Tue, 19 Nov 2024 16:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/11/19/apple-intelligence-s-advertising/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>People keep bashing the Apple Intelligence ads… for somewhat good reason. They are a noted departure from the slick and trend-setting ads that have come before, from <a href="https://en.wikipedia.org/wiki/1984_(advertisement)">1984</a> to the <a href="https://en.wikipedia.org/wiki/IPod_advertising">iPod silhouettes</a> to <a href="https://www.youtube.com/watch?v=k70OczvX45k">Spike Jonze and FKA Twigs</a>. Some might ask, &quot;what is Apple thinking?&quot; but they make total sense to me.</p>
<p>From a historical perspective they stand in a grand Apple tradition of introducing non-ideal user behavior into their UX Vision. There's a very direct line drawn from <a href="https://evantravers.com/articles/2021/04/14/scifi-drives-the-future/#1987-apple-imagines-the-knowledge-navigator">the selfish, lazy professor in the Knowledge Navigator video</a> to the polished but kinda slinky &quot;cheat off the machine&quot; ads that are running today for Apple Intelligence. It's funny… but it's also somewhat realistic. While we detest some of the behavior, it's easier to recognize ourselves in the protagonists.</p>
<p>This has a benefit from an economic perspective. By shifting the &quot;hero&quot; away from a technological wunderkind, the Apple Intelligence ad distances itself from <a href="https://en.wikipedia.org/wiki/Get_a_Mac">Justin Long</a> and proclaims that this technology is for everyone: forgetful, distracted, desiring approval. I think that's a pretty smart position for an AI Product when the daily use of the tool hasn't quite crossed the chasm.</p>
<p>My qualms about putting AI in every device still stands… but at least I understand what they are trying to say.</p> ]]></description>
    </item>
    <item>
       <title>Memex Limbo</title>
       <link>http://evantravers.com/articles/2024/11/12/memex-limbo/</link>
       <pubDate>Tue, 12 Nov 2024 20:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/11/12/memex-limbo/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I've been kinda stuck.</p>
<p>I can see the final-state: a single git repository that stores my writing and hosts my blog's content, a home for all my words to live and grow, links to make sense, and for the act of writing and developing thought to live equally in harmony with my other commitments.</p>
<p>It's beautiful, no?</p>
<p>The transition has been… tortured.</p>
<ul>
<li>In order to get the blog and the wiki merged, I'm faced with losing the git history for one of them, and I like <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">my changelogs</a>.</li>
<li>trying to <a href="https://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/">migrate off of middleman since</a>… forever.</li>
<li>While I can't get off Middleman, trying to rewrite the github action in nix, but I have been successful because <a href="https://discourse.nixos.org/t/can-i-have-access-to-the-git-history-in-a-derivation-source-code-makes-calls-to-git-log/43635">nix derivations don't let me use git history to do the changelog</a>.</li>
<li>Trying to move my Things task manager to <a href="https://publish.obsidian.md/tasks/Introduction">Obsidian Tasks</a> (that's a whole other blog post for the future.) If I can move Tasks to Obsidian, then I can see and prioritize writing next to all my other work, whereas right now I maintain two separate project lists. Instead of maintaining a meta-task for writing, I can <em>just write</em> and that note that I'm workshopping can be a &quot;project&quot; in the system</li>
<li>I've actually written <a href="https://github.com/evantravers/things-to-obsidian-tasks">a half-way decent Things -&gt; Obsidian migration tool</a> but I haven't been able to commit fully because of all the other things going on.</li>
</ul>
<p>But I haven't been able to do any of the two. Still in Things, still have separate repos.</p>
<p>Worst part is that an in progress writing can live in one of three places: I started this blog post on my computer in the get repository, and then as I was walking around and thinking about it, I wanted to add to it on my phone… And I had to remember whether it was on Drafts, in Obsidian, or in to get repo. Often it exists in a horrible superposition of two of the three. That needs to stop.</p>
<p>The good news is that I believe this will be sortable in time: writing is thinking. Part of this private little snarky complaint was to force my brain to articulate and visualize the dependency tree that's keeping the work from flowing. My digital lament is an act of self-direction and a certain amount of accountability.</p>
<p>But good grief I can't figure out what to do first. 🙇</p> ]]></description>
    </item>
    <item>
       <title>Web Native Highlighting</title>
       <link>http://evantravers.com/articles/2024/10/24/web-native-highlighting/</link>
       <pubDate>Thu, 24 Oct 2024 11:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/10/24/web-native-highlighting/</guid>
       <description><![CDATA[ <p>TIL you can link directly to any string text on a webpage. I guess I saw Andy Mutaschak doing this in <a href="https://evantravers.com/articles/2024/09/14/latticework-and-markdown-bible/">his Latticework demo</a>, but I am pleased to see it's just part of spec.</p>
<p>I highlight and quote parts of web pages a lot to <a href="https://evantravers.com/articles/2022/05/03/indieweb-replies/">build mention pages</a> or recapture a thought, so I worked it into <a href="https://evantravers.com/articles/2021/01/27/updated-hammerspoon-snipping-tool/">my hammerspoon-powered clipping program</a>. Here's the commit: <a href="https://github.com/evantravers/dotfiles/commit/ae249941fadeaedf05d1169a6faafc5e3aa5945e">Github/evantravers/dotfiles</a>.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(underline, underline);">https://stackoverflow.com/questions/19326368/iterate-over-lines-including-blank-lines</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magiclines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>gmatch<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(.-)</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Snip current highlight</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;s&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- get the window title</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">                   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>gsub<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- Brave</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">                   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>gsub<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- Google Chrome</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- get the highlighted item</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;c&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pasteboard</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">readString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">word</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>gmatch<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">([^%s]+)</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">word</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">textStart</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encodeForQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">textEnd</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encodeForQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">words</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span>
</div><div class="line" data-line="25">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">line</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magiclines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&gt; &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">line</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="27">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- get the URL</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;l&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="30">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;c&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="31">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pasteboard</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">readString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>gsub<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?utm_source=.*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="32">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--</span>
</div><div class="line" data-line="33">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">format</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[%s
</div><div class="line" data-line="34">
</div><div class="line" data-line="35">%s
</div><div class="line" data-line="36">[%s](%s#:~:text=%s,%s)]]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">textStart</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">textEnd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="37">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- format and send to drafts</span>
</div><div class="line" data-line="38">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;drafts://x-callback-url/create?tag=links&amp;text=&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encodeForQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="39">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Snipped!&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;The snippet has been sent to Drafts&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="40"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Rather than including the whole quote in the URL, I'm arbitrarily choosing to highlight the two words at start and end of the passage. I think that will work for my purposes.</p> ]]></description>
    </item>
    <item>
       <title>Manifesting a Clever Phone</title>
       <link>http://evantravers.com/articles/2024/10/02/manifesting-a-clever-phone/</link>
       <pubDate>Wed, 02 Oct 2024 15:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/10/02/manifesting-a-clever-phone/</guid>
       <description><![CDATA[ <blockquote>
<p>I wish that there was an 5G, e-ink device, USB-C charging, decent battery life, and decent calling/ 5G hotspot.</p>
</blockquote>
<p>Well <a href="https://evantravers.com/articles/2022/05/19/contemplating-clever-phones/">2022-Evan</a>, looks like you have your wish!</p>
<p><img src="https://images.evantravers.com/articles/2024/10/mudita.png" alt="" /></p>
<p><a href="https://mudita.com/kompakt/">Mudita Kompakt</a></p>
<p>Mudita is teasing their new device: the Kompakt. USB-C charging, super simple OS, and can be used as an internet hotspot.</p>
<p>The previous Mudita Pure was a lovely device but apparently a horrid phone. I'm going to be watching this closely. The Lightphone update does not interest me although it's a bold step.</p> ]]></description>
    </item>
    <item>
       <title>Making my Nvim Feel More Like Helix with Mini.nvim</title>
       <link>http://evantravers.com/articles/2024/09/17/making-my-nvim-act-more-like-helix-with-mini-nvim/</link>
       <pubDate>Tue, 17 Sep 2024 14:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/17/making-my-nvim-act-more-like-helix-with-mini-nvim/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/09/nvim.png"></p><p>I've been rewriting my nvim config to align with the features <a href="https://evantravers.com/articles/2024/09/05/using-helix-as-a-vim-user/">I am enjoying in Helix</a>: simple TS-aware movements and uniform LSP-actions.</p>
<p>I haven't messed with my nvim config for quite a while… the <a href="https://evantravers.com/articles/2019/08/27/adding-ruby-and-elixir-mappings-for-vim-sandwich/">last time I wrote about a plugin change</a> was five years ago!</p>
<h2><a href="#changes" aria-hidden="true" class="anchor" id="changes"></a>Changes</h2>
<p>Basically four objectives:</p>
<ol>
<li>Update and replace plugins with TreeSitter and LSP aware versions.</li>
<li>Change keybindings to match Helix where it doesn't break Vim's paradigm.</li>
<li>Find some LSP-aware text-objects and motions.</li>
<li>Simplify wherever I can.</li>
</ol>
<p>I wound up removing <em>everything</em>, and slowly re-adding plugins and bindings as I missed functionality.</p>
<p>I was in the middle of this, when <a href="https://x.com/Folke/status/1835286675611640007">@folke pointed out</a> <a href="https://github.com/echasnovski/mini.nvim/">mini.nvim</a>. Mini provides a slew of useful, well written, TS and LSP aware lua modules that are really straightforward to configure.</p>
<p>This madlad wants vim to work like I want it to work. 👏</p>
<p>I wound up replacing a <em>lot</em> with mini.nvim modules:</p>
<ul>
<li>EasyAlign -&gt; mini.align</li>
<li>flash.nvim -&gt; mini.jump</li>
<li>lualine -&gt; mini.statusline</li>
<li>nvim-autopairs -&gt; mini.pairs</li>
<li>nvim-web-devicons -&gt; mini.icons</li>
<li>vim-sandwich -&gt; mini.surround</li>
<li>vim-unimpaired -&gt; mini.bracketed</li>
</ul>
<p>It's <em>wild</em> to me that I've taken unimpaired out of my nvim config. It's been there since nearly the very beginning… but the reason is Treesitter. Because @echasnovski is prioritizing Treesitter, I get consistent, useful Treesitter motions that go with all the others.</p>
<p>I removed the following plugins because they weren't working, deprecated… of I just don't use them anymore.</p>
<ul>
<li>completion-nvim</li>
<li>git-messenger-vim</li>
<li>nvim-ts-autotag</li>
<li>plenary-nvim</li>
<li>popup-nvim (noice.nvim)</li>
<li>trouble-nvim</li>
<li>vim-abolish</li>
<li>vim-elixir</li>
<li>vim-fetch</li>
<li>vim-gist</li>
<li>vim-projectionist</li>
<li>vim-repeat</li>
<li>webapi-vim</li>
</ul>
<p>I really like mini.nvim's style. You don't have to go all-in like I did, they are so well documented and built out… you probably will.</p>
<p>I also spent some time rewriting my lsp configuration such the the bindings are nearly the same as I have become used to in Helix, and instrumenting those bindings using <code>mini.clue</code>.</p>
<h2><a href="#walkthrough" aria-hidden="true" class="anchor" id="walkthrough"></a>Walkthrough</h2>
<p>I know that not everyone who reads this is going to want to <a href="https://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/">use nix to manage their dotfiles</a>, so I'll pull it out of nix just to highlight some things.</p>
<p>Here's the final config file (after nix is done with it and with heavy commentary!)</p>
<p>At the top I load <a href="https://github.com/evantravers/dotfiles/blob/c6abd86824f3204af1f3475546f26d52aee69b74/.config/nvim/.config/nvim/.vimrc">my vimrc</a> which has my main settings that are backwards compatible, then I load all the neovim specific options and changes in <a href="https://github.com/evantravers/dotfiles/blob/master/.config/nvim/.config/nvim/init.lua">an init.lua</a>.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Load .vimrc</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">runtime</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.vimrc</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Neovim specific settings</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">icm</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;split&#39;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">foldtext</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;v:lua.vim.treesitter.foldtext()&quot;</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">showmode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Use rg</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grepprg</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[rg --glob &quot;!.git&quot; --no-heading --vimgrep --follow $*]]</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grepformat</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grepformat</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%f:%l:%c:%m&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Set up pretty unicode diagnostic signs</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sign_define</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignError&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignError&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">texthl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignError&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">culhl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignErrorLine&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sign_define</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignWarn&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignWarn&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">texthl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignWarn&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">culhl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignWarnLine&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sign_define</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignInfo&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignInfo&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">texthl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignInfo&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">culhl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignInfoLine&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sign_define</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignHint&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignHint&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">texthl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignHint&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">culhl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;DiagnosticSignHintLine&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Then I set some keymaps that I've been using for years that aren't related to any plugins.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Make &lt;Tab&gt; work for snippets</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;i&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;s&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;Tab&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">   <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">snippet</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">active</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">direction</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">     <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;cmd&gt;lua vim.snippet.jump(1)&lt;cr&gt;&#39;</span>
</div><div class="line" data-line="5">   <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="6">     <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;Tab&gt;&#39;</span>
</div><div class="line" data-line="7">   <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8"> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expr</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Covenience macros</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- fix ellipsis: &quot;…&quot; -&gt; &quot;…&quot;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;leader&gt;fe&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;mc:%s,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\\</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\\</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\\</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.,…,g&lt;CR&gt;:nohlsearch&lt;CR&gt;`c&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;… -&gt; …&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- fix spelling: just an easier finger roll on 40% keyboard</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;leader&gt;fs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;1z=&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Fix spelling under cursor&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>The plugins are <a href="https://github.com/evantravers/dotfiles/blob/c6abd86824f3204af1f3475546f26d52aee69b74/home-manager/nvim/default.nix">all loaded through nix</a>, but we'll go through the configured ones here. Nix puts some in vim's paths that don't show up in the config.</p>
<p>First, my trusty zenbones color scheme.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zenbones</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solid_line_nr</span>          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solid_vert_split</span>       <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zenbones</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]]</span>
</div></code></pre>
<p>Then I have a plugin previously that follows the OS light/dark scheme and works across operating systems:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;auto-dark-mode&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update_interval</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1000</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set_dark_mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">api</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nvim_set_option</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;background&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;dark&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set_light_mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">api</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nvim_set_option</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;background&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;light&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>A plugin that uses virtualtext to show colors in CSS files:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nvim-highlight-colors&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">render</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;virtual&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable_tailwind</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Oil.nvim is a re-think of vinegar.vim which sits on top of netrw to make interacting with files a bit easier.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;oil&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">view_options</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show_hidden</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;n&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;-&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;oil&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">open</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Open parent directory&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Display git status in signcolumn:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gitsigns&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Highlight <code>TODO</code> style comments and bindings to throw them into the <code>:quickfix</code> list.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;todo-comments&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>A custom function for a minimal writing environment using zen-mode that emulates pencil.vim, but isn't broken. 🤷</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- I write prose in markdown, all the following is to help with that.</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_G</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggleProse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;zen-mode&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backdrop</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">width</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">80</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">plugins</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gitsigns</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enabled</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tmux</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enabled</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kitty</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enabled</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on_open</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filetype</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;markdown&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filetype</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;telekasten&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="17">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">so</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">999&#39;</span>
</div><div class="line" data-line="18">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rnu</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nu</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wrap</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="20">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">linebreak</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="21">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colorcolumn</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0&#39;</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;j&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gj&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;k&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gk&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on_close</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">so</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3&#39;</span>
</div><div class="line" data-line="29">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rnu</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="30">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filetype</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;markdown&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filetype</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;telekasten&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="31">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wrap</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="32">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">linebreak</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="33">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colorcolumn</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">80&#39;</span>
</div><div class="line" data-line="34">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="35">
</div><div class="line" data-line="36">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;j&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;j&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="37">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;k&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;k&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="38">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="39">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="40"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="41">
</div><div class="line" data-line="42"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="43">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="44">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;localleader&gt;m&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="45">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;:lua _G.toggleProse()&lt;cr&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Toggle Writing Mode&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="47"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>This plugin renders markdown in a sort of styled way in the terminal… which as many doc sources are in markdown makes some of the LSP popups have some style for free!</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;render-markdown&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Telescope for finding files and picking stuff:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;/&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;cmd&gt;lua require(&#39;telescope.builtin&#39;).live_grep()&lt;cr&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Live Grep&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;f&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:lua require(&#39;telescope.builtin&#39;).find_files(&lbrace; find_command = &lbrace;&#39;rg&#39;, &#39;--files&#39;, &#39;--hidden&#39;, &#39;-g&#39;, &#39;!.git&#39; &rbrace;&rbrace;)&lt;cr&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Live Grep&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;b&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:lua require(&#39;telescope.builtin&#39;).buffers()&lt;cr&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Buffers&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;z&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:lua require(&#39;telescope.builtin&#39;).find_files(&lbrace;prompt_title = &#39;Search ZK&#39;, shorten_path = false, cwd = &#39;~/src/wiki&#39;&rbrace;)&lt;cr&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">noremap</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">silent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Wiki&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Treesitter for all my grammars and syntax files.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nvim-treesitter.configs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">indent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Tree-pairs makes <code>%</code> respect Treesitter nodes, which is great for languages with <code>do -&gt; end</code> style syntax (looking at you ruby and elixir!)</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;tree-pairs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Treesitter Incremental selection lets me emulate most of Helix's feature to select up to the next tree-sitter scope. Highly recommended. I'm using Helix-like bindings. Most people use <code>&lt;cr&gt;</code> or <code>v</code>.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nvim-treesitter.configs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">incremental_selection</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymaps</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">init_selection</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;M-o&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scope_incremental</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;M-O&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">node_incremental</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;M-o&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">node_decremental</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;M-i&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>And then mini.nvim is doing a <em>ton</em> of heavy lifting.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.ai&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>         <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- a/i textobjects</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.align&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- aligning</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.bracketed&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- unimpaired bindings with TS</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.comment&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- TS-wise comments</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.icons&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- minimal icons</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.jump&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>       <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- fFtT work past a line</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.pairs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- pair brackets</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.statusline&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- minimal statusline</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.surround&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>   <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- surround</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">custom_surroundings</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;l&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">output</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;[&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;]()&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mini.clue&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>                   <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- cute prompts about bindings</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">triggers</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;Leader&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;Leader&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Built-in completion</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;i&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;C-x&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- `g` key</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;g&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;g&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="28">
</div><div class="line" data-line="29">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Marks</span>
</div><div class="line" data-line="30">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&#39;&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="31">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;`&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="32">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&#39;&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="33">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;`&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="34">
</div><div class="line" data-line="35">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Registers</span>
</div><div class="line" data-line="36">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&quot;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="37">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&quot;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="38">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;i&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;C-r&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="39">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;c&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;C-r&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="40">
</div><div class="line" data-line="41">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Window commands</span>
</div><div class="line" data-line="42">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;C-w&gt;&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="43">
</div><div class="line" data-line="44">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- `z` key</span>
</div><div class="line" data-line="45">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;z&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="46">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;x&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;z&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="47">
</div><div class="line" data-line="48">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Bracketed</span>
</div><div class="line" data-line="49">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;[&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="50">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mode</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;]&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="51">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="52">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clues</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="53">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">builtin_completion</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="54">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="55">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">marks</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="56">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">registers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="57">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">windows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="58">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">miniclue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gen_clues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">z</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="59">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="60"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>lsp_config is setup to give me a consistent interface, even the same leader keys and actions as Helix.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;d&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diagnostic</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setloclist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Add buffer diagnostics to the location list.&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Use LspAttach autocommand to only map the following keys</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- after the language server attaches to the current buffer</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">api</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nvim_create_autocmd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;LspAttach&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">group</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">api</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nvim_create_augroup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;UserLspConfig&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">callback</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ev</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Enable completion triggered by &lt;c-x&gt;&lt;c-o&gt;</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ev</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">omnifunc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;v:lua.vim.lsp.omnifunc&#39;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Buffer local mappings.</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- See `:help vim.lsp.*` for documentation on any of the below functions</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buffer</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ev</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">desc</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gD&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">declaration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Declaration&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gd&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">definition</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Definition&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gi&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">implementation</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Implementation&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;M-k&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">signature_help</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Signature Help&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;i&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;M-k&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">signature_help</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Signature Help&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;wa&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_workspace_folder</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Add Workspace Folder&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;wr&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">remove_workspace_folder</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Remove Workspace Folder&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;wl&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inspect</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list_workspace_folders</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;List Workspace Folders&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;D&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type_definition</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Type Definition&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;r&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Rename Symbol&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="29">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;v&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;space&gt;a&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code_action</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Code Action&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="30">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;gr&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">references</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Buffer References&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="31">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keymap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;n&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;localleader&gt;f&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="32">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lsp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">format</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">async</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="33">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">opts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Format Buffer&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="34">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="35"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="36">
</div><div class="line" data-line="37"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;lspconfig&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="38">
</div><div class="line" data-line="39"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elixirls</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;elixir-ls&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="40"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solargraph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="41">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="42">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solargraph</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="43">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diagnostics</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">useBundler</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="45">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="47"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="48"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="49"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lua_ls</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="50">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="51">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Lua</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="52">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">runtime</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="53">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">version</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;LuaJIT&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="54">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">package</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="55">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="56">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diagnostics</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">globals</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;vim&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;hs&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="57">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">workspace</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="58">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">library</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="59">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expand</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;$VIMRUNTIME/lua&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="60">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expand</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;$VIMRUNTIME/lua/vim/lsp&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="61">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expand</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;/Applications/Hammerspoon.app/Contents/Resources/extensions/hs/&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="62">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="63">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="64">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="65">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="66"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="67"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lspconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">markdown_oxide</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>And that's it! 271, down from 441.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I've been bouncing back and forth, and so far I'm very pleased. Having all my plugins be Treesitter and lsp aware makes for a much more consistent interface, and <code>mini.clue</code>'s little prompts reminds me that I have a lot of textobjects and actions that I often forget about.</p>
<p>It's also a bit snappier. It's much easier to see on my older intel mac, but less plugins == speed.</p>
<p>Thanks to <code>mini.clue</code> and some refactoring of bindings, the way I interact with the LSP is roughly the same muscle memory on Helix or nvim, so I have a choice whether to use Helix's interesting new modal model, or nvim's tried and true ecosystem.</p> ]]></description>
    </item>
    <item>
       <title>Take Screenshots of Your Work</title>
       <link>http://evantravers.com/articles/2024/09/16/take-screenshots-of-your-work/</link>
       <pubDate>Mon, 16 Sep 2024 10:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/16/take-screenshots-of-your-work/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>Have a weekly prompt to take screenshots of your work.</p>
</div>
<p>Most of the digital record of my career is already gone.</p>
<p>I'm old enough that the first things I ever made on a computer<sup class="footnote-ref"><a href="#fn-claris" id="fnref-claris" data-footnote-ref>1</a></sup> were in <a href="https://archive.org/details/claris-claris-works-4.0-for-macintosh-4.0-v-4-1996-06-english-iso">Clarisworks</a> on floppy disks.</p>
<p>While I obviously can't open those anymore, I've lost much more. When I did <a href="https://evantravers.com/articles/2020/05/07/time-for-a-redesign/">the redesign post in 2020</a> this blog's software was old enough that it was non-trivial to &quot;rewind&quot; and take screenshots of how it used to look. Soon it will be nearly imposible.</p>
<p>The first projects I ever built as a professional are <em>all</em> gone. They weren't captured by the Internet Archive, the original design files weren't in git or were in old versions of Photoshop or Indesign that aren't even compatible with modern versions… even if I was willing to pay for it. It's all gone.</p>
<p>Which brings me to the main point.</p>
<p>One of the most important <a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/#weekly-review-fridays-4p">ritual habits</a> I recently adjusted: Take Screenshots.</p>
<p>At the end of the week I remind myself to look back and record any work that I'm proud of…</p>
<ul>
<li>meetings where I contributed…</li>
<li>designs I pushed forward…</li>
<li>research insights I gathered…</li>
<li>conflict I helped work through…</li>
<li>anything I shipped…</li>
</ul>
<p>I take screenshots of things visual, and write tweet-length summaries of all of it.</p>
<p><em>I keep the screenshots and logs in my personal log</em>, and translate it to my current professional goal-system.</p>
<p>It makes easier reviewing quarterly/yearly goals, and provides me with a sense of satisfaction and growth that is invaluable.</p>
<p>References:</p>
<ul>
<li><a href="https://alexwlchan.net/2022/screenshots/">Alex Wichlan wrote a great blog post</a> about this that I think I encountered a while back.</li>
<li>I feel certain that I've encountered <a href="https://en.wikipedia.org/wiki/Jason_Scott">Jason Scott (textfiles)</a> advising this somewhere.</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-claris">
<p>Some issues of a family newspaper, a submarine scifi rip-off of <em>20000 Leagues Under the Sea</em> and <em>The Fantastic Voyage</em>… stuff like that. 🤷 <a href="#fnref-claris" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>CSS :has and Focus Outline</title>
       <link>http://evantravers.com/articles/2024/09/16/the-undeniable-utility-of-css-has-josh-w-comeau/</link>
       <pubDate>Mon, 16 Sep 2024 06:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/16/the-undeniable-utility-of-css-has-josh-w-comeau/</guid>
       <description><![CDATA[ <p>Ever faced the &quot;should I make this whole card an <code>&lt;a&gt;</code> just because the focus or hover makes more sense?&quot; Josh Comeau demos a cool technique using <code>:has</code> I've not seen yet.</p>
<blockquote>
<p>To solve this problem, I moved the focus outline to the parent container.</p>
<p>[...]</p>
</blockquote>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bento-card</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">has</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">button</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focus-visible</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">outline</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">px</span> solid <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--color-primary</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/* Remove the default button focus outline */</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bento-card</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">button</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">outline</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> none<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Immediately using this. What a cool accessibility tool.</p>
<blockquote>
<p><strong>It kinda feels like <code>:has</code> is the &quot;missing selector&quot; in CSS.</strong> Historically, there have been a bunch of relationships we just couldn't express in CSS. With <code>:has</code>, we can select any element based on the properties/status of any <em>other</em> element. No limits!</p>
<p>As we've seen, the <code>:has</code> selector is <em>incredibly</em> powerful. Things that used to require JavaScript can now be accomplished exclusively using CSS!</p>
</blockquote>
<p>Thank you Josh!</p><p><a href="https://www.joshwcomeau.com/css/has/" class="u-in-reply-to  is-reply">The Undeniable Utility Of CSS :has • Josh W. Comeau - www.joshwcomeau.com</a></p> ]]></description>
    </item>
    <item>
       <title>Latticework and Markdown Bible</title>
       <link>http://evantravers.com/articles/2024/09/14/latticework-and-markdown-bible/</link>
       <pubDate>Sat, 14 Sep 2024 18:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/14/latticework-and-markdown-bible/</guid>
       <description><![CDATA[ <p>I'm late to this, but just look!!</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/RHsBH9iYqCQ"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<blockquote>
<p>Latticework’s main goal, then, is to enable fluid movement between these foraging and sensemaking stances.</p>
</blockquote>
<p>This looks like such neat solution to the &quot;how can I highlight&quot; and move back and forth between source and research. I love it. I feel very validated in <a href="https://evantravers.com/articles/2024/05/18/connected-bible-study-in-markdown/#don-t">my recommendation to keep your source document clean</a>.</p>
<p>I hope that Matthew and Andy continue this work, it's very promising.</p><p><a href="https://www.matthewsiu.com/Latticework" class="u-in-reply-to  is-reply">Latticework: Unifying annotation and freeform text editing for augmented sensemaking - www.matthewsiu.com</a></p> ]]></description>
    </item>
    <item>
       <title>Using Helix as a Vim User</title>
       <link>http://evantravers.com/articles/2024/09/05/using-helix-as-a-vim-user/</link>
       <pubDate>Thu, 05 Sep 2024 12:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/05/using-helix-as-a-vim-user/</guid>
       <description><![CDATA[ <p>I've been playing with <a href="https://helix-editor.com/">Helix</a> for a month or so, and honestly I've struggled to explain <em>why</em>. After giving a scatter-brained demo to my friend, he responded…</p>
<div class="admonition chat_in">
<div class="admonition__title">Seth</div>
<p>It's like everything you do is a vim macro!</p>
</div>
<p>This is the best explanation of using Helix as a Vim-user. Vim is such a muscle-memory specific thing that explaining where its mental model is inconsistent is <em>really hard for me</em>. Approaching Helix's consistent modal paradigm and &quot;selection first&quot; model feels like re-thinking everything… and probably will make me a better Vim-user.</p>
<p>So what does this mean?</p>
<p>Vim has been under my fingers for my entire career. As such, it's hard to articulate what the differences are, but the <a href="https://docs.helix-editor.com/from-vim.html">chief change is that Helix is consistently</a> <code>selection -&gt; action</code>. Maybe I use Vim wrong, but my paradigm usually involves placing the cursor in the right place/line, then invoking a Command Verb followed by Motion/Direct Object. This requires knowing the change you wish to make in the first place.</p>
<p>Helix's adamant decision that <em>everything</em> starts with a selection (a cursor is a single character selection!) brings a lot of clarity and consistency, as well as mapping very well to identifying a thing to change, then considering the change. You can &quot;select&quot; without knowing what you are yet going to do.</p>
<p>It is a weird experience as a vim-nerd. There are things that are crazy simple that seem harder, and there are refactors that would be extremely convoluted in vim that become extremely simple.</p>
<p>A contrived example: aligning vertically.</p>
<figure>
> [!youtube] https://www.youtube.com/watch?v=Sgpts9_vtTA
  <figcaption>
    <p>In Neovim, I use a plugin called <a href="https://github.com/junegunn/vim-easy-align">EasyAlign</a> to accomplish this.</p>
    <ol>
      <li>Make a selection</li>
      <li>Invoke Easy Align</li>
      <li>Enter the character you are aligning by</li>
      <li>Optional: change the alignment strategy in a slightly complex way.</li>
    </ol>
    <p>While effective, EasyAlign has to slightly break the vim-pattern in order to work.</p>
    <p>In Helix the alignment follows the Helix-way: select, then act.</p>
    <ol>
      <li>Make a selection: in this case I'm using Treesitter to select an an area by syntax (<code>&lt;a-o&gt;</code>).</li>
      <li>Search (<code>s</code>) to start a search which will put a multi-cursor at each point of the search within the selection.</li>
      <li>Align <code>&amp;</code> to align all the multicursors. That's it.</li>
    </ol>
  </figcaption>
</figure>
<p>This is really a terrible example. It <em>only</em> resonates if you use Helix enough to realize that each of the more esoteric refactor techniques stay consistent within Helix's <code>selection -&gt; action</code> model, while the same behaviors can force cause Vim to break its idioms.</p>
<p>(It also could be that I'm bad at Vim.)</p>
<p>If nothing else, it works really well if you are the kind of person who constantly highlights text they are reading. 🤷</p>
<p>I think Helix's style and consistency has a lot of merit. Making changes on subsets of plain-text is a core refactoring and writing activity, and maps well to some of the LLM assisted coding tools that are becoming popular. I'm already experimenting with how this changes my Vim usage, at first that's going to be trying to come up with some consistent TreeSitter enabled motions since those have been <em>so</em> helpful in Helix.</p> ]]></description>
    </item>
    <item>
       <title>Positions on Generative AI</title>
       <link>http://evantravers.com/articles/2024/09/03/positions-on-generative-ai</link>
       <pubDate>Tue, 03 Sep 2024 09:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/09/03/positions-on-generative-ai</guid>
       <description><![CDATA[ <div class="admonition info">
<p>I've been writing unpublished essays about AI since Dall-E was announced. My opinions have slowly congealed to the following points. We shall see how well they stand the passage of time.</p>
</div>
<p>First of all, Generative AI is <em>not</em> an Artificial General Intelligence (AGI). Much of the fear and discussion<sup class="footnote-ref"><a href="#fn-fear" id="fnref-fear" data-footnote-ref>1</a></sup> around the future of GenAI concerns whether it leads to AGI.</p>
<p>I'm going to sidestep that conversation for the moment and discuss GenAI directly for this moment.</p>
<p>A quick definition of Generative AI:</p>
<figure>
  <img src="https://images.evantravers.com/articles/2024/08/generative-ai.png">
  <figcaption>I'm still developing better metaphors to explain the training process.</figcaption>
</figure>
<p>Generative AI is an advanced machine learning technology. It relies on Training Data, a machine-reinforced Model, and a Prompt, with the goal of simulating human creativity or behavior… It relies on Training Data, a machine-reinforced Model, and a Prompt, with the goal of simulating human creativity or behavior.</p>
<h2><a href="#theological-math-not-a-mind" aria-hidden="true" class="anchor" id="theological-math-not-a-mind"></a>Theological: Math, not a mind</h2>
<p>Theologically, I believe creation of life is a non-communicable aspect of the Triune God.</p>
<p>The best explanation I have yet encountered is <a href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/">Stephen Wolfram's What is ChatGPT Doing… and Why Does It Work?</a>. While it can feel like we are interacting with an intelligence, <a href="https://www.astralcodexten.com/p/janus-simulators">ACT's discussion of Janus Simulators</a> speaks to interacting with a math function that <em>feels</em> but is not sentient in any way<sup class="footnote-ref"><a href="#fn-sentient" id="fnref-sentient" data-footnote-ref>2</a></sup>.</p>
<p>The human tendency to anthropomorphize GenAI actions makes this conversation difficult. Even those who believe it's just a mathematical simulation still talk about AI &quot;making stuff up&quot; to say hallucination… when it's not making up, it is simulating based on its training data and model.</p>
<p>That being said: it doesn't have to be a mind to be dangerous or interesting.<sup class="footnote-ref"><a href="#fn-demon" id="fnref-demon" data-footnote-ref>3</a></sup></p>
<h2><a href="#legal-training-data--piracy" aria-hidden="true" class="anchor" id="legal-training-data--piracy"></a>Legal: Training Data ~= Piracy.</h2>
<p>Y'all remember Limewire? People smirking and saying &quot;I'm not stealing, I'm just ''borrowing one bit from a hundred thousand people!'&quot; Ethically murky businesses championed technologies that eventually spawned legitimate businesses… after the lawsuits settled.</p>
<p>Sound familiar? AI training data is making the <em>same</em> argument, same situation, I'm guessing same timeline.</p>
<h2><a href="#morally-its-likely-defrauding" aria-hidden="true" class="anchor" id="morally-its-likely-defrauding"></a>Morally: It's likely defrauding.</h2>
<p>Have you noticed that some uses of GenAI seem wonderful and some seem downright sinister? I find the 1828 Webster's dictionary definition of defrauding helpful (emphasis mine):</p>
<blockquote>
<p><strong>DEFRAUD</strong>, <em>verb transitive</em> [Latin To cheat.]</p>
<p><strong>1.</strong> To deprive of right, either by obtaining something by deception or artifice, or by <highlight>taking something wrongfully without the knowledge or consent of the owner</highlight>; to cheat; to cozen; followed by of before the thing taken; as, to defraud; a man of his right.</p>
<p>We have corrupted no man, we have defrauded no man. (2 Corinthians 7:2)</p>
</blockquote>
<p>&quot;Taking without knowledge or consent&quot; is a useful rubric for this GenAI moment. The degree of &quot;wrongness&quot; in an AI application correlates with perceived consent.</p>
<p>In these early days of TOS changes and <a href="https://uxdesign.cc/ai-is-sleepwalking-us-into-surveillance-ed7921462b8b">rushing to scrape the web before the legal precedent is set</a> we are guaranteed to be hoisting content without the author's knowledge, GenAI is always a little questionable<sup class="footnote-ref"><a href="#fn-conviction" id="fnref-conviction" data-footnote-ref>4</a></sup>.</p>
<h2><a href="#practical-broadens-your-skills-zero-to-one" aria-hidden="true" class="anchor" id="practical-broadens-your-skills-zero-to-one"></a>Practical: Broadens your skills, zero-to-one.</h2>
<p>GenAI can not make you better, but it can grant you new capability. As Wolfram points out:</p>
<blockquote>
<p>tasks—like writing essays—that we humans could do, but we didn’t think computers could do, are actually in some sense computationally easier than we thought.<sup class="footnote-ref"><a href="#fn-wolfram" id="fnref-wolfram" data-footnote-ref>5</a></sup></p>
</blockquote>
<p>There is a new set of previously &quot;unprogrammable&quot; problems that are available to everyone.</p>
<p>If you are familiar with the idea of a <a href="https://en.wikipedia.org/wiki/T-shaped_skills">T-shaped skillset</a>, AI-tooling will not deepen your core skill, but it can extend the breadth of your capability. It won't 10X a programmer, but it can help that programmer write better marketing copy or generate more research documents.</p>
<p>I personally use it a fair amount for defeating blank page syndrome. I'll generate an outline, and then start hating on it… because it's usually terrible. Arguing with mediocre GenAI work is easier than trying to start from scratch.</p>
<p>I also generate coloring pages for my kids. A lot.</p>
<h2><a href="#investment-too-bubbly" aria-hidden="true" class="anchor" id="investment-too-bubbly"></a>Investment: Too bubbly.</h2>
<p>It's the current bubbly long bet after crypto. There'll be ten thousand losers and two winners, same as all bubbles. Too early to tell. There will be lies and grifters the whole way, but <a href="https://evantravers.com/articles/2022/02/08/scams-and-liars/">that's not new</a>.</p>
<p>I personally believe the current hardware buildout and investment <a href="https://www.youtube.com/watch?app=desktop&amp;v=w30WLkNU47g#t=38m52s">is not going to be worth the amount we are putting in</a>, simply because I believe that a second generation of hardware will come along and the billions of spend on current cloud-based build out will be obsolete.</p>
<h2><a href="#cultural-brace-yourself-for-the-trust-apocalypse" aria-hidden="true" class="anchor" id="cultural-brace-yourself-for-the-trust-apocalypse"></a>Cultural: Brace yourself for the trust apocalypse.</h2>
<p>I will frame this as a bet: <em>Video evidence will not be admissible in criminal court by 2026.</em></p>
<p>GenAI is so far <a href="https://www.threads.net/@chriswelch/post/C-8LF4BOSAP/">exceptional at mass-producing mass-media</a>. They call it &quot;<a href="https://www.cnet.com/tech/services-and-software/the-new-ai-buzzword-is-slop-and-its-messing-with-you-what-to-watch-out-for/">AI slop</a>,&quot; and it's growing quickly. What's worse is it seems capable of mass-producing longer-ish form media that was previously unfakeable: <a href="https://www.infiniteconversation.com/">podcasts</a>, <a href="https://www.wired.com/story/generative-ai-podcasts-boring/">more podcasts</a>, <a href="https://arstechnica.com/information-technology/2023/09/ai-generated-books-force-amazon-to-cap-ebook-publications-to-3-per-day/">books and novels</a>... and it's only <a href="https://openai.com/index/sora/">going to continue</a>.</p>
<p>Our society is not prepared legally, culturally, or socially for a world where most media we encounter is untrustworthy. Bad actors will use the momentary confusion for evil. Eventually good people will evolve defensive cultural and technological strategies. Until then, Building and Keeping Community will be critical.<sup class="footnote-ref"><a href="#fn-levit" id="fnref-levit" data-footnote-ref>6</a></sup></p>
<h2><a href="#analyze-data-is-value-dont-give-it-away" aria-hidden="true" class="anchor" id="analyze-data-is-value-dont-give-it-away"></a>Analyze: Data is value. Don't give it away.</h2>
<p>The apocryphal Native Americans who sold the rights to Manhattan Island for a handful of beads made an incredibly good deal… in the economy in which they operated and assumed would persist. They traded something valueless (to them) for something valuable, and died happy… and wrong.</p>
<p>The largest companies in the world are giving away free technological tools in exchange for your attention and behavioral data. They are even waging secret wars against each other for the same data<sup class="footnote-ref"><a href="#fn-secretwars" id="fnref-secretwars" data-footnote-ref>7</a></sup>. It's a great deal for you… until the economy in which we live shifts towards the next.</p>
<p>Consider the deal you are making. You are giving away your forest for beads. So have I. That train has already left, but we can start renegotiating that deal <em>now</em>.</p>
<h2><a href="#caution-spooky-interactions-at-a-distance" aria-hidden="true" class="anchor" id="caution-spooky-interactions-at-a-distance"></a>Caution: Spooky interactions at a distance.</h2>
<p>There's a wild combination of effects between the ability to query previously &quot;unprogrammable&quot; problems and the wild land-grab of barely-legal dataset acquisition.</p>
<p>People will lean on these systems as authoritative and god-like, and the weird interactions of several together could create very unpredictable and harmful edge cases.</p>
<p>In a previous technological moment, The Data Visualization trend of the early Web 2.0 had some examples of what happens when you reveal or translate a dataset in a new way: <a href="https://www.engadget.com/2018-01-28-strava-fitness-tracking-data-reveals-details-of-secret-bases.html">Strava revealed locations of secret military bases</a>, <a href="https://www.forbes.com/sites/kashmirhill/2011/07/05/fitbit-moves-quickly-after-users-sex-stats-exposed/">Fitbit told everyone when you had sex</a>… and as advertising/attention economy shifts towards consolidating power on Training Data… the surveillance economy will only benefit.</p>
<p>GenAI has the ability to notice and correlate patterns, and puts that power in more people's hands.</p>
<h2><a href="#cynical-bias-unintentional-and-intentional" aria-hidden="true" class="anchor" id="cynical-bias-unintentional-and-intentional"></a>Cynical: Bias, unintentional and intentional.</h2>
<p>The Training Data is generated by us sinful humans. The Prompt is written by sinful humans. Sinful humans interact with the final product. There is a potential Tolerance Stacking problem here. GenAI is trained on our preferences and behavior… and our what the parents do in moderation the silicon children do in excess.</p>
<p>I think often about Neil Gaiman's <em>American Gods</em>. In the novel, <em>anything</em> to which humans devote time and attention become little gods. In the novel, the old gods of myth and legend are grappling with their worship fading as the New Gods of Materialism and Media grow in power. The bible has long warned us about what we worship… our idols resemble us and we grow to resemble them.</p>
<p>Training Data has been gathered unethically from the corpus of available human endeavor on the internet. This mass of writing and behavior made by humans operating in Redemptive History contains both echoes of Doctrine of Common Grace<sup class="footnote-ref"><a href="#fn-russianrealism" id="fnref-russianrealism" data-footnote-ref>8</a></sup> and our human Sin Nature. This can have dramatic and somewhat unexpected effects:</p>
<ul>
<li>A <a href="https://www.propublica.org/article/machine-bias-risk-assessments-in-criminal-sentencing">machine learning algorithm called COMPAS</a> was trained on criminal court sentencing to eliminate human racial bias. Instead, the system picked up on the pattern and exaggerated it.</li>
<li>A current generation portrait generator trained on millions of illustrations <a href="https://www.technologyreview.com/2022/12/12/1064751/the-viral-ai-avatar-app-lensa-undressed-me-without-my-consent/">will &quot;pornify&quot; when prompted with a picture of an asian woman</a> because of the millions of such images in its training data.</li>
</ul>
<h2><a href="#existential-terrifying-depending-on-your-worldview" aria-hidden="true" class="anchor" id="existential-terrifying-depending-on-your-worldview"></a>Existential: Terrifying… depending on your worldview.</h2>
<p>Math emulating human intelligence is not scary to a theist.</p>
<p>However, to a materialist human intelligence is purely physical phenomena, math and chance. If your own mind is math, the assertion that GenAI is &quot;math, not a mind&quot; becomes quite frightening.</p>
<p>A materialistic worldview is also open to the theory that we are in <a href="https://en.wikipedia.org/wiki/Simulation_hypothesis">simulation of reality</a> . If GenAI is basically a faster and higher-fidelity simulator… another threatening thought which is explored in Neal Stephenson's <em>Fall; or, Dodge in Hell</em> by Neal Stephenson.</p>
<p>It's fascinating that technology is easier to digest as a theist.</p>
<h2><a href="#hardware-race-to-the-edge" aria-hidden="true" class="anchor" id="hardware-race-to-the-edge"></a>Hardware: Race to the edge.</h2>
<p>The SAAS<sup class="footnote-ref"><a href="#fn-saas" id="fnref-saas" data-footnote-ref>9</a></sup> revolution dominated software for decades, and the present AI-focused hardware buildup follows that same path. However, I predict that a combination of speed requirements and the growing desire to keep data private will reverse this trend and push models to edge devices. It's already happening: <a href="https://www.rabbit.tech/">Rabbit.ai's R1</a>, <a href="https://humane.com/">Humane's AI pin</a>, <a href="https://www.tryrewind.ai/pendant">Rewind.ai's Pendant</a>, and the new iPhones have GenAI chipsets &quot;on the edge.&quot; These device-based, edge-based models have the advantage of being able to &quot;securely&quot; tie together the machine learning and the user's present context in a way that will be more focused and useful.</p>
<p>I used scarequotes around &quot;securely&quot; on purpose. Such an approach will <strong>not</strong> be private. Big Tech has always <a href="https://techcrunch.com/2021/06/08/ring-police-warrants-neighbors/">bowed the knee</a> <a href="https://en.wikipedia.org/wiki/Printer_tracking_dots">since the start</a>. OpenAI is already <a href="https://www.youtube.com/watch?v=aEYcZtaZRXQ#t=50m22s">commited to this with their board appointments</a>.</p>
<h2><a href="#future-ai-in-the-light-of-history-and-eternity" aria-hidden="true" class="anchor" id="future-ai-in-the-light-of-history-and-eternity"></a>Future: AI in the light of History and Eternity</h2>
<p>I am surprisingly hopeful about the future. We live in a world primed for economic upheaval driven by a technological innovation. While I would prefer to not live in interesting times, I believe Ecclesiastes is true: there is nothing new under the sun.</p>
<p>The invention of the printing press triggered a new wave of personal autonomy and thought. Knowledge and art unbundled from patronage and distributed to rising classes, <a href="https://en.wikipedia.org/wiki/Tulip_mania">new forms of financial power</a>, and political unrest… and out of that chaos strode a squat german monk with a list of Theses.</p>
<p>The first industrial revolution destroyed economies, <a href="https://en.wikipedia.org/wiki/Luddite">started riots</a>, coincided with nation-reforming and moving… and out of that noise and change arose the sparks of Great Awakenings.</p>
<p>Revival often seems to colocate in redemptive history with economic and technological upheaval. We stand on the precipice of a world barren of Truth. A world longing for meaningful relationship. A world needing hope… and we as Christians are anchored in a millennia-old love story of Truth, relationship, and hope.</p>
<p>May we be found faithful.](<a href="https://evantravers.com/articles/2024/09/03/positions-on-generative-ai">https://evantravers.com/articles/2024/09/03/positions-on-generative-ai</a>)</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-fear">
<p>This partly explains the now deeply entrenched camps that divide OpenAI board members and social media: each side sharpening their knives to protect or destroy GenAI based on how they think AGI threatens or benefits humanity. <a href="#fnref-fear" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-sentient">
<p><em>Blindsight</em> by Peter Watts takes this strange experience and spins it into a frightening and intriguing first-contact story. <a href="#fnref-sentient" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-demon">
<p>Robert Cotton from MereOrthodoxy makes the argument that the seemingly spiritual and duplicitous answers often given by a Generative AI when pressed is evidence of demonic activity enlivening the inanimate. The author argued this is a historical trend in demonic idolatry going all the way back.</p>
<p>I disagree that the current LLM responses can be interpreted as any form of intelligence or sentience, but <em>That Hideous Strength</em> and <em>American Gods</em> remind us that demons use and inhabit that which men fear and worship. (Also, the are some real connections between the shamanic and futurist worldviews)</p>
<p>Given that the most believers in AGI are picturing gods: benevolent like the Minds from <em>The Culture</em> or dragons from <em>Moonbound</em> by Robin Sloan, or destructive like HAL-9000 or Skynet… I could see that our fear and worship could draw spiritual forces to play. Anything we fear. Anything we worship.</p>
<p><a href="https://mereorthodoxy.com/augustine-ai-and-the-demon-heuristic">Augustine, AI, and the Demon Heuristic</a> <a href="#fnref-demon" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-conviction">
<p>Honestly, a valid argument could be made that use of GenAI is breaking the eighth commandment. I think is a pretty narrow position, but one that you could stand on. <a href="#fnref-conviction" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-wolfram">
<p><a href="https://evantravers.com/articles/2023/07/16/what-is-chatgpt-doing-and-why-does-it-work/">Stephen Wolfram's What is ChatGPT Doing… and Why Does It Work?</a> <a href="#fnref-wolfram" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-levit">
<p>I wouldn't be shocked if a supreme court justice rules that we can't convict except on the testimony of two or three witnesses. (Deuteronomy 17:6) <a href="#fnref-levit" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="fn-secretwars">
<p>It has been theorized that the reason <a href="%5Bhttps://mjtsai.com/blog/2018/07/03/the-app-developers-sifting-through-your-gmail/%5D(https://mjtsai.com/blog/2020/06/01/unhelpful-amazon-order-confirmation-e-mails/)">Amazon hides items and amounts from transactional emails</a> is to keep Gmail and others from <a href="https://mjtsai.com/blog/2020/02/14/companies-that-scrape-your-e-mail/">scraping and using that information</a>. Private Equity firms are making acquisitions of medical companies and others <em>simply</em> for the datasets they represent. <a href="https://medcitynews.com/2019/06/unitedhealths-4-3b-davita-medical-acquisition-wins-conditional-ftc-approval/">UnitedHealth Group -&gt; Davita (4.3B)</a>, <a href="https://news.bloomberglaw.com/health-law-and-business/ibm-buying-truven-for-26-billion-to-amass-more-health-data">IBM -&gt; Truven (2.6B)</a>. <a href="#fnref-secretwars" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="fn-russianrealism">
<p>I have often reflected that the aspirations of mid-nineteenth century Russian Realism authors had a similar effect: in attempting to capture realistically the human experience, even non-christian writers found themselves reflecting stories of redemption and grace writ large in the human experience. <a href="#fnref-russianrealism" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="8" aria-label="Back to reference 8">↩</a></p>
</li>
<li id="fn-saas">
<p>Software as a Service is dominated by large &quot;cloud-providers&quot; with centralized servers instead of every person and business owning their own hardware. <a href="#fnref-saas" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="9" aria-label="Back to reference 9">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>iPhone Continuity Camera for Remote Meetings… 👍👍</title>
       <link>http://evantravers.com/articles/2024/08/30/iphone-continuity-camera-for-remote-meetings/</link>
       <pubDate>Fri, 30 Aug 2024 09:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/08/30/iphone-continuity-camera-for-remote-meetings/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/08/desk.jpg"></p><p>I've already spent nearly a grand on an incredible camera and speaker system that I always have with me… why not use it for the calls that dominate most of my workday? It gives me a clean home desk without the looming desklight and microphone, and I can be sure to have the <em>same</em> setup no matter where I decide to work that day.</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/F986Ud2g_gk"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>Four years ago, when we all went home to work remote, I supplemented my stolid Blue Snowball microphone with a new Logitech StreamCam and Elgato Key Light. I was in a large part reacting to <a href="https://spandex.substack.com/p/why-your-livestreaming-setup-is-a">a post proclaiming</a> that &quot;a good streaming setup is the new three piece suit.&quot;</p>
<p>I used this setup happily until the last OSX release which introduced Continuity Camera. This allows you to use the camera and micorophone on your iPhone as a webcam and microphone.</p>
<p>I have been <em>shocked</em> how good the results are. I sold my video light and camera.
For the past eleven months I exclusively used just my iPhone and Airpods Pro as my entire remote meeting setup. I did update my Airpods Pro to the 2nd version two months ago. It has worked amazingly even in relatively loud toddler-filled environments.</p>
<figure class="two-up">
  <img src="https://images.evantravers.com/articles/2024/08/laptop.JPG">
  <img src="https://images.evantravers.com/articles/2024/08/monitor.jpg">
  <figcaption>I use the wonderful <a href="https://www.peakdesign.com/products/everyday-case-for-iphone-13-mini?_pos=1&_sid=6965bfbfe&_ss=r&variant=40139548688461">Peak Design case</a> now.</figcaption>
</figure>
<p>I have both the <a href="https://www.amazon.com/Belkin-Continuity-Desktops-Displays-Compatible/dp/B0BNPTB659?ref_=ast_sto_dp">monitor</a> and <a href="https://www.amazon.com/Belkin-MagSafe-MacBook-Continuity-Compatible/dp/B0BJNHF6WJ?ref_=ast_sto_dp&amp;th=1">laptop</a> Belkin Magsafe mounts. The monitor edition stays at my home desk with a hidden right angle lightning cable that I can pull up to charge it when docked. The laptop one goes in my trusty <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">office-in-a-bag</a>.</p>
<p>I am shocked how good the Audio Input of the iPhone can sound. I usually have a powerful PC just a foot away, fans blowing… can't hear it. My children loudly playing just outside the room with the door open, and nothing on the recording. 🤞</p>
<p>For audio output I either use the laptop speakers or often my Airpods Pro on noise cancellation mode.</p>
<p>I turn on Portrait Mode, Studio Light, and Voice Isolation in the new Mac OSX audio/visual filters mode. I also typically turn on whatever voice isolation is available in the Video Meeting software I'm using at the moment… it helps hide my loud toddler coworkers from disturbing my remote colleagues.</p>
<p>In loud coffee-shops with a lot of ambient noise the iPhone doesn't work as well as input. I'll typically switch to the Airpods Pro microphone.</p>
<p>I'm really shocked how good the iPhone default settings nail white-balance, how well Studio Light handles the harsh backlighting of my office… as a relatively picky person, it's very good.</p>
<p>This past month I found that Elgato has an app called <a href="https://www.elgato.com/us/en/s/epoccam">EpocCam Pro</a> for iPhone that will allow you to use this <em>same setup</em> on a PC. You don't get Portrait Mode or the other filters, but it at least works and I'm able to avoid buying more equipment just for working on my PC.</p>
<p>I'll often make the other person's video very small and float it at the top of the monitor just under the camera to maximize eye exposure. If it's a gallery of participants, I'll use <a href="https://evantravers.com/articles/2024/02/15/yabai-tiling-window-management-for-osx/">yabai</a> to split the monitor and put them as a row at the top.</p>
<p>I've been very happy with this setup. 👨‍💻</p> ]]></description>
    </item>
    <item>
       <title>Flirting With Helix</title>
       <link>http://evantravers.com/articles/2024/08/19/flirting-with-helix/</link>
       <pubDate>Mon, 19 Aug 2024 22:39:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/08/19/flirting-with-helix/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>My friend Tom has praised Kakoune for <em>years</em> and always threatened leaving Neovim for it.</p>
<p>Well… I'm <a href="https://github.com/evantravers/dotfiles/commit/07915bed91aacfbcb2328554e42d944644556591">playing with just that</a>. I spent a weekend going through the <code>helix --tutor</code>, then doing a little <a href="https://evantravers.com/articles/2022/07/26/an-ode-to-advent-of-code/">advent of code</a> golfing in elixir.</p>
<p>Why?</p>
<p>As fan of modal editing, I'm intrigued by the supposedly more efficient and consistent editing paradigm. I also really like <a href="https://github.com/evantravers/dotfiles/blob/07915bed91aacfbcb2328554e42d944644556591/home-manager/home.nix#L83-L100">how little configuration</a> it requires to get it basically 95% of what I was doing in neovim. 17 lines I think!?</p>
<p>It kind of reminds me of what I like about Fish over Bash. Same principles, just enough batteries added to be comfortable without stretching out and going crazy and leaving the linux philosophy.</p>
<p>Thanks to the deep magicks of LSPs, I can even access my wiki pretty ably in Helix much the same way I was able to in Neovim. I still miss a lot of my customizations and bindings. I imagine that if I were to go write some serious code, I'd probably jump right back over to <code>nvim</code>, but for the moment Helix is like a fun weekend motorcycle. Not sure I want to make it a daily driver, but it's a fun hobby.</p> ]]></description>
    </item>
    <item>
       <title>🔎➕🍄‍🟫🟰🤔</title>
       <link>http://evantravers.com/articles/2024/08/13/foraging-for-facts/</link>
       <pubDate>Tue, 13 Aug 2024 18:49:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/08/13/foraging-for-facts/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Searching for facts on the internet is a bit like foraging for mushrooms.</p>
<p>Doesn't matter how experienced you are… you should double check every single one.</p> ]]></description>
    </item>
    <item>
       <title>Tag Refactor Complete</title>
       <link>http://evantravers.com/articles/2024/07/16/tag-refactor-complete/</link>
       <pubDate>Tue, 16 Jul 2024 14:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/07/16/tag-refactor-complete/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I spent some time on calls today going through and refactoring all the <a href="/articles/tags">tags</a>.</p>
<p>Some I completely removed, like <code>focus</code> and <code>productivity</code>. Since nearly everything I write tends to touch on those two, it felt duplicative and useless. Also gone are tags related to <code>ios</code> or <code>mac</code>.</p>
<p>One I broke up... <code>code</code> because whatever language the code was written in: <code>lua</code>, <code>javascript</code>, <code>css</code>, <code>ruby</code>, and a few <code>elixir</code> posts.</p>
<p>I renamed <code>bible</code> to <code>bible-study</code> and <code>prayer</code> to <code>prayer-journal</code> as that's more specifically what they are.</p>
<p>One new lovely tag is <a href="/articles/tags/time-stewardship"><code>time-stewardship</code></a>, because it's something I'm passionate about and have written a fair amount related to it.</p>
<p>There were a bunch that were basically mirrors, like <code>books</code> and <code>reading</code>, <code>vimwiki</code> and <code>vim</code>. There were a bunch related to my obsession with plaintext notes... <code>plaintext</code>, <code>zettelkasten</code>, <code>smz</code> and maybe another I've forgotten have been condensed to <code>notemaking</code>. I don't love that because it's Nick's term, but it fits and I use it for my own thinking.</p>
<p>Since anyone who can see this is the &quot;true audience,&quot; let me know if that makes sense or if I've broken a favorite bookmark. 🤷</p> ]]></description>
    </item>
    <item>
       <title>You Should Use: Soulver</title>
       <link>http://evantravers.com/articles/2024/07/16/you-should-use-soulver/</link>
       <pubDate>Tue, 16 Jul 2024 11:49:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/07/16/you-should-use-soulver/</guid>
       <description><![CDATA[ <p>I've been aware of <a href="https://apps.apple.com/app/id1508732804">Soulver</a> for years but I finally purchased it recently. It's wonderful.</p>
<p>The core is a notepad that automatically does a summation of the numbers entered, and also supports human-language conversions and functions.</p>
<p><img src="https://images.evantravers.com/articles/2024/07/conversions.PNG" alt="" /></p>
<p>Soulver sits at the liminal space for questions that need several calculator operations, but it would be too much trouble to set up a spreadsheet.</p>
<p>Its smart summary is clever enough to understand units and fractions.</p>
<p><img src="https://images.evantravers.com/articles/2024/07/peryear.PNG" alt="" /></p>
<p>Since downloading this I use it <em>all the time</em>: planning vacations, how many invites fit in our party budget, how much money to redo a room of our house… and much more. I can return back to the note, adjust a variable and see a new result.</p>
<p>Most recently I used it as my wife and planned an upcoming camping trip. I could leave my budget in the note, and as the price of flights fluctuated I could see the budget total and when my budget and flight costs aligned, we could make a go decision.</p>
<p><img src="https://images.evantravers.com/articles/2024/07/budget.PNG" alt="" /></p>
<p>There's a free web clone at <a href="http://numbr.dev">http://numbr.dev</a> if you want to try the concept. I recommend supporting Zac's original version. It's very convenient on mobile.</p>
<p><a href="https://apps.apple.com/app/id1508732804">Soulver 3 by Zac Cohan</a></p> ]]></description>
    </item>
    <item>
       <title>Refactoring Tags...</title>
       <link>http://evantravers.com/articles/2024/07/15/refactoring-tags/</link>
       <pubDate>Mon, 15 Jul 2024 21:01:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/07/15/refactoring-tags/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I'm thinking about refactoring <a href="https://evantravers.com/articles/tags/">all my tags on blog</a>. I've got some that are too vague like <a href="https://evantravers.com/articles/tags/automation/">automation</a>, and couple that are essentially duplicates like <a href="https://evantravers.com/articles/tags/prayer/">prayer</a> and <a href="https://evantravers.com/articles/tags/bible/">bible</a></p>
<p>I'm probably going to forge through and try to create some more &quot;threads&quot; where if someone encounters a post that appeals to them, they are more likely to find something else in that same vein.</p>
<p>But I ask y'all, faithful secret RSS Club... what say you? What would you find most helpful? If you have an idea, <a href="/contact">I'd love to hear it</a>.</p> ]]></description>
    </item>
    <item>
       <title>Trending Topic Trash</title>
       <link>http://evantravers.com/articles/2024/07/15/trending-topic-trash/</link>
       <pubDate>Mon, 15 Jul 2024 10:05:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/07/15/trending-topic-trash/</guid>
       <description><![CDATA[ <p>The idea of a hashtag and &quot;trending topics&quot; has done more to foster the cultural snowplow<sup class="footnote-ref"><a href="#fn-plow" id="fnref-plow" data-footnote-ref>1</a></sup> than <strong>anything</strong> else.</p>
<p>For nearly every topic that matters, we don't need reactions, we should incentivize responses: measured, thoughtful, timely.</p>
<p>Instead &quot;Trending topics&quot; pressgangs all posts out of their original conversation: thrust into a context that rewards strong emotional reaction: a pause in scroll, a reaction click, a reply.</p>
<p>&quot;Trending topics&quot; transforms writers and conversationalists into propagandists and pundits… they have no choice.</p>
<p>I kind of wish I could prevent my social media posts from appearing in &quot;trending&quot;. If there were such a feature, I'll wager much of the deeper value would be in non-trending conversation streams. At that point the conversations would no longer resemble modern social media: if you have a single stream of thought and conversation where you can control the context and learn your audience…</p>
<p>You have a blog or newsletter. 🤔</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-plow">
<p>term came from Douglas Murray to describe the growing divide between ideologies in western culture. <a href="https://www.youtube.com/watch?v=14ghWBi5Zto">The Portal #41</a> <a href="#fnref-plow" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Stop perfecting your config</title>
       <link>http://evantravers.com/articles/2024/07/09/stop-perfecting-your-config-arkadiusz-chmura/</link>
       <pubDate>Tue, 09 Jul 2024 09:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/07/09/stop-perfecting-your-config-arkadiusz-chmura/</guid>
       <description><![CDATA[ <blockquote>
<p>I suggest following ThePrimeagen’s advice on approaching your configuration. He recommends revisiting your configuration only once every couple of months, which I think is a very healthy and sustainable approach. In the meantime, take a mental note of the things that are annoying or slowing you down so that you can address them when the time to overhaul comes.</p>
</blockquote>
<p>I feel very seen. And <a href="https://evantravers.com/articles/tags/dotfiles/">guilty</a>.</p>
<p>While I agree whole heartedly with the main argument of this article, I'll present an alternative and useful mental model: think like a carpenter. Build jigs to serve your current work.</p>
<p>A carpenter will build a <a href="https://worldofwoodcraft.com/what-is-a-woodworking-jig/">jig</a> to automate a repetitive or precise task, but he'll make it 80% good, intentionally temporary, and perhaps throw it away at the end. If he finds himself building that jig over and over, he may make a more flexible and permanent version.</p>
<p>The slough of distraction is when you are trying to &quot;perfect your config&quot; for all situations, all languages, for problems you currently aren't solving.</p>
<p>If the carpenter has no project, he has no purpose to build a jig. Programmers frequently start with the jig, and end with the project. <a href="https://techcrunch.com/2019/05/30/the-slack-origin-story/">Sometimes this works out</a>. Usually it does not.</p>
<p>Your tools can be improved and modified, and you <strong>should</strong>, but only change it to serve your work for today, not tomorrow.</p><p><a href="https://arkadiuszchmura.com/posts/stop-perfecting-your-config/" class="u-in-reply-to  is-reply">Stop perfecting your config | Arkadiusz Chmura - arkadiuszchmura.com</a></p> ]]></description>
    </item>
    <item>
       <title>Outage…</title>
       <link>http://evantravers.com/articles/2024/06/28/outage/</link>
       <pubDate>Fri, 28 Jun 2024 08:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/06/28/outage/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Last night my friend <a href="https://joschua.io">Joschua</a> alerted me that my website was giving a 522 error. I poked at it a little bit on my phone, but I was visiting family and couldn't look at it more. It was very strange, because I had not pushed anything to the site in a few days.</p>
<p>I updated some github actions from my phone in <a href="https://evantravers.com/articles/2021/01/01/building-middleman-using-github-actions/">my github workflow</a>, just in case there was a new version of the AWS actions or something that had expired. Nothing. I tried searching Twitter/X for &quot;cloudflare&quot; and &quot;cloudflare 522,&quot; hoping to see a rash of complaints… nothing. I had to go to bed, hoping it was some regional thing.</p>
<p>This morning I was convinced it had something to do with a certificate issue, so I wound up crawling all through AWS to find all the old systems I had setup, and then all through Cloudflare's settings.</p>
<p>Frustratingly, the S3 static site was <em>always</em> available and fast. According to Cloudflare defines a 522 as the server isn't responsive. Eventually… I realized that means the DNS records were wrong.</p>
<p>I wasted some time deleting and shutting down AWS services I wasn't using at the time, thinking that might at least clear the air of possibilities.</p>
<p>When I imported the settings to Cloudflare from Route52, I think it froze the current IP that S3 was using. Probably Route52 is smart enough to follow any rotation within their system. That's not <a href="https://developers.cloudflare.com/support/third-party-software/others/configuring-an-amazon-web-services-static-site-to-use-cloudflare/#configuring-an-amazon-web-services-static-site-to-use-cloudflare">what Cloudflare recommends on their S3 static site guide</a>. I followed the steps in this guide, and realized that my <code>A</code> record was pointing to an IP, while they recommend using a <code>CNAME</code> to point to the bucket endpoint.</p>
<p>Hey presto.</p>
<p>I guess that IP address mapped to the bucket region for years, and sometime this week it rotated out. Who knows.</p> ]]></description>
    </item>
    <item>
       <title>Confidence and the Obsidian Graph</title>
       <link>http://evantravers.com/articles/2024/06/12/confidence-and-the-obsidian-graph/</link>
       <pubDate>Wed, 12 Jun 2024 16:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/06/12/confidence-and-the-obsidian-graph/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/06/graph-groups.png"></p><p>For years I have embraced a <a href="https://evantravers.com/articles/2024/03/14/recently-obsidian/#note-making">simply taxonomy of named and unnamed notes</a>. Named notes a strong ideas or strong opinions, unnamed notes are almost marginalia to other thoughts that may develop into something greater.</p>
<p>While exploring the graph, I started &quot;dimming&quot; my less-certain unnamed notes. It's as easy as adding a color to: <code>file:/^\d&lbrace;10&rbrace;/</code></p>
<figure class="two-up">
    <img src="https://images.evantravers.com/articles/2024/06/local-nogroups.png">
    <img src="https://images.evantravers.com/articles/2024/06/local-groups.png">
    <figcaption>
        Doesn't a little color really help you read the relationship here? Red: bible chapters, Dimmed: marginalia unnamed notes.
    </figcaption>
</figure>
<p>Just a small thing, but it can help you decide where to explore next, or discover a cluster of related ideas that may need some nurturing.</p> ]]></description>
    </item>
    <item>
       <title>Home-Cooked Software and Barefoot Developers</title>
       <link>http://evantravers.com/articles/2024/06/11/home-cooked-software-and-barefoot-developers/</link>
       <pubDate>Tue, 11 Jun 2024 08:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/06/11/home-cooked-software-and-barefoot-developers/</guid>
       <description><![CDATA[ <blockquote>
<p>The emerging golden age of home-cooked software, barefoot developers, and why the local-first community should help build it.</p>
</blockquote>
<p>If you like the things I write and think about, you should be following Maggie.</p><p><a href="https://maggieappleton.com/home-cooked-software" class="u-in-reply-to  is-reply">Home-Cooked Software and Barefoot Developers - maggieappleton.com</a></p> ]]></description>
    </item>
    <item>
       <title>iOS Homescreen 2024.2</title>
       <link>http://evantravers.com/articles/2024/06/04/ios-homescreen-2024-2/</link>
       <pubDate>Tue, 04 Jun 2024 15:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/06/04/ios-homescreen-2024-2/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/06/homescreen-v2.png"></p><p>I started experimenting again after <a href="https://evantravers.com/articles/2024/01/05/ios-homescreen-2024/">my last post</a>. This has been stable for six months.</p>
<p>The goal is always to use the phone less. Here's some new adaptations I've made to make my life more interesting and my phone less addicting.</p>
<h2><a href="#lock-screen" aria-hidden="true" class="anchor" id="lock-screen"></a>Lock Screen</h2>
<figure class="iphone">
    <img src="https://images.evantravers.com/articles/2024/06/lock-v2.png">
</figure>
<p>Lock screen is largely the same. Same <a href="https://evantravers.com/articles/2019/06/03/minimal-ios-homescreen-2019/">magic button concept as 2019</a>. The only change is that I swapped out additional Drafts button for searching my Contacts via CardHop.</p>
<p>I've also noticed that the Headspaces action no longer has the bug I encountered earlier in the year, I think some iOS update patched in requiring the unlock before the menu will display.</p>
<h2><a href="#home-screen" aria-hidden="true" class="anchor" id="home-screen"></a>Home Screen</h2>
<figure class="iphone">
    <img src="https://images.evantravers.com/articles/2024/06/home-v2.png">
    <figcaption>
        <p>More important "verbs" are at the bottom nearer to my thumb, so from bottom to top:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">    &lt;ul&gt;
</div><div class="line" data-line="2">        &lt;li&gt;Think -&amp;gt; &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="3">        &lt;li&gt;Learn -&amp;gt; &lt;a href=&quot;https://omnivore.app&quot;&gt;Omnivore&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="4">        &lt;li&gt;Untangle -&amp;gt; &lt;a href=&quot;https://www.mindnode.com/&quot;&gt;MindNode&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="5">        &lt;li&gt;Calculate -&amp;gt; &lt;a href=&quot;https://soulver.app/&quot;&gt;Soulver&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="6">        &lt;li&gt;Read -&amp;gt; &lt;a href=&quot;https://read.amazon.com/&quot;&gt;Kindle&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="7">        &lt;li&gt;Query -&amp;gt; &lt;a href=&quot;https://apps.apple.com/us/app/chatgpt/id6448311069&quot;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="8">    &lt;/ul&gt;
</div><div class="line" data-line="9">&lt;/figcaption&gt;
</div></code></pre>
</figure>
<p>Right after releasing my blog post, I heard about <a href="https://apps.apple.com/app/id1570856853">Blank Spaces</a> from Mike Schmitz… and I went for it. I've been using it for months with a couple small changes. For me, it's again trying to remind myself to create with intention and then get off the device, so instead of the app names I have them listed as the creative verbs that I should use them for.</p>
<p>ChatGPT is a new addition. The hope is that I'll use it for quick answers without being sucked away to distraction land. ChatGPT's restrictions and hallucinations should be a helpful constraint. We shall see.</p>
<h2><a href="#widget-screen" aria-hidden="true" class="anchor" id="widget-screen"></a>Widget Screen</h2>
<figure class="iphone">
    <img src="https://images.evantravers.com/articles/2024/06/widget-v2.png">
</figure>
<p>A few small changes here. I moved &quot;lemme just check&quot; apps here: Parcel (deliveries), as well as a tiny widget for Things (tasks). I don't use Things nearly as much on my phone, but I usually have one or two home tasks that I need to see in the afternoon.</p>
<p>I also added Screentime widget here so that as I check my phone I'm faced with my current health and phone addiction statistics. :P</p>
<p>It's helped me put the phone down a few times.</p>
<h2><a href="#other" aria-hidden="true" class="anchor" id="other"></a>Other</h2>
<p>A couple other focus related changes…</p>
<figure class="iphone">
    <img src="https://images.evantravers.com/articles/2024/06/search-v2.png">
</figure>
<p>I disabled all <a href="https://support.apple.com/guide/iphone/about-siri-suggestions-iph6f94af287/ios">Siri suggestions in notifications or search</a>. Go direct to app, don't get distracted.</p>
<p>I installed Mail for the first time in years. I use it mostly for emailing friends. I was opening browser to do this, and getting sucked away. Might move back on this. For now, it's not stealing my time that much and is providing meaningful conversations. (As long as I keep unsub'ing from promotional mail.)</p>
<p>Using <a href="https://www.refocusapp.co/">ReFocus</a> to heavy block distractions in browser… especially youtube. I've come to enjoy an intentionally high friction youtube workflow:</p>
<ul>
<li>I'll save the video to Omnivore</li>
<li>unblock it in Refocus for 3m</li>
<li>then go back to Omnivore to start the video</li>
</ul>
<p>Even after the Refocus unblock expires, the video will keep playing, and Omnivore will let me play picture-in-picture or with the screen closed. But when the video is over, the blocking kicks in and I can't get lost in related videos. 🧑‍🍳👌</p>
<p>Noticeably absent: Things. I spend less and less time in it. I typically capture todos on paper or in Drafts. I look at it at the start of the day and halfway thru the afternoon. Maybe the experiments started in <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/">dating other task managers</a> will pay off.</p> ]]></description>
    </item>
    <item>
       <title>Connected Bible Study in Obsidian</title>
       <link>http://evantravers.com/articles/2024/05/18/connected-bible-study-in-markdown/</link>
       <pubDate>Sat, 18 May 2024 17:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/05/18/connected-bible-study-in-markdown/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/05/bible.png"></p><div class="admonition tldr">
<p><!-- raw HTML omitted --></p>
</div>
<p>I've been using a copy of the Bible in Markdown in Obsidian for over three years as my primary digital Bible. It's been <em>wonderful</em>.</p>
<p>I can read along the passage with the sermon or bible study, and see <em>every time I have ever studied or mentioned</em> the current chapter and verses in any note from the last decade.</p>
<figure>
> [!youtube] https://www.youtube.com/watch?v=JY_EwZONns8
    <figcaption>Quick demo of what it's like to read the digital bible and encounter notes that link two passages.</figcaption>
</figure>
<p>I do try to use my physical bible whenever possible… but if I do pull out my phone to find some scripture, I'm using Obsidian. I open the app, hit the <code>+</code> icon in the center of the bottom toolbar to open/create a file and type a fraction of the book/chapter… something like <code>Gal 3</code> to jump to <code>Galations 3.md</code>.</p>
<p>I then just treat it like a digital bible. Because I have it organized in chapters I can read the book in the app easily. I use <a href="https://github.com/TfTHacker/obsidian42-strange-new-worlds">Strange New Worlds</a> to highlight headers that have a link to them, so I can see any &quot;digital marginalia&quot; that I've added. If I scroll to the bottom and invoke the <code>Unlinked Mentions</code> feature it'll display any Kindle Highlights or journal entries that have not yet been linked up.</p>
<p>If I take notes, I usually still <a href="https://evantravers.com/articles/2023/08/01/sketchnoting-sermons/">take notes by hand in my journal</a> or throw it into <a href="https://evantravers.com/articles/tags/drafts-app/">Drafts</a>. The friction of translation between mediums helps me filter the important and interesting… and it keeps me from spending time on my phone during a sermon or bible study session.</p>
<p>As with anything else, <a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/#workday-shutdown-workdays-4p">my afternoon note-making ritual</a> will help me move anything particularly interesting into the notes. Most of them become unnamed notes with a link to the scripture in the form:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">[[Galatians 3#19]] asserts that the promise made &quot;face to face&quot; by God to Abraham has precedence over The Law which was delivered by multiple intermediary angels over a period of time.
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">Source: Brumlow, bujo://10/113
</div></code></pre>
<p>(Filename: <code>202405081707.md</code>)</p>
<p>If I come across this thought later in my notes, it has intrinsic value… but I also can encounter it as part of my digital bible in the Linked Mentions or the footnotes system from Strange New Worlds.</p>
<h2><a href="#dos-and-donts" aria-hidden="true" class="anchor" id="dos-and-donts"></a>Dos and Don'ts</h2>
<p>I have tried a bunch of different methods and organizations<sup class="footnote-ref"><a href="#fn-history" id="fnref-history" data-footnote-ref>1</a></sup>. Here’s what I have learned:</p>
<h3><a href="#do" aria-hidden="true" class="anchor" id="do"></a>Do...</h3>
<ul>
<li>Read and spend time in this Bible. While using a digital bible has focus disadvantages, you are able to encounter thoughts and notes in this bible. Obsidian is where I go to think, and my thoughts tend to center around what I learn in scripture.</li>
<li>Use an application that supports highlighting links on headers. I use a plugin called  <a href="https://github.com/TfTHacker/obsidian42-strange-new-worlds">Strange New Worlds</a> in Obsidian.</li>
<li>When writing notes, write the thesis sentence inline with the link so that it’s visible in the preview.</li>
<li>Use headers for verses. Headers give linking, blocks, and outline. They also translate to HTML or other documents easily.</li>
<li>Ensure that the files are stored locally on your device. While using Obisidan Sync it’s faster loading than most other bible apps on my phone.</li>
</ul>
<h3><a href="#dont" aria-hidden="true" class="anchor" id="dont"></a>Don’t...</h3>
<ul>
<li>Make the filenames simple. I originally had ordering numbers on the books, but then I had to remember the ordering of a book to write the reference.</li>
<li>Write notes inside the Bible chapter files.
<ul>
<li>It makes it hard to transport thoughts and connections across Bible verses.</li>
<li>If you later want to improve your reading experience &quot;add a feature&quot; like Next/Prev Chapter you have to be very clever to avoid destroying your precious notes.</li>
</ul>
</li>
<li>Use iCloud to Sync. It unloads all files locally except the last 200 or so, and you are about to be working with <em>far more</em> than that.</li>
</ul>
<h2><a href="#history" aria-hidden="true" class="anchor" id="history"></a>History</h2>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-history">
<ul>
<li>I used to use a Drafts script to import portions of scripture into a note. It was effective, but each note was isolated, and I had multiple copies of each scripture passage across the files.</li>
<li>I was playing with nested tags to &quot;connect&quot; each copy of the passage (e.g. <code>#bible/genesis/3/1</code>) so that I could find all notes related to <code>#bible/genesis/3</code> or what have you.</li>
<li>When I saw <a href="https://www.youtube.com/watch?v=vxc6YbmpMNQ">Joschua's include functionality and centrality to his note-making</a> I immediately saw that having a central single copy was <em>far</em> better.</li>
<li>I messed around with using the anchor system in Obsidian, but it's not compatible with new lines within the blocks. It's just also less compatible with other systems (which tend to honor <code># headers</code> as navigational items, because of HTML.)</li>
<li>Headers are the correct option!</li>
<li>I used Joe Buhlig's clone of Joschua's thing, changed a few things to match my needs, <a href="https://github.com/evantravers/undo-zk/blob/master/fix_bible.rb">wrote a transform script to fix others that I didn't like</a>.</li>
<li>Messed with ordering numbers on the Books… I don't think I'm going to keep it because it means when composing you have to remember what number is associated with each book, and keeps you from writing simple embeds like <code>![[Genesis 3#1]]</code> (which if there's only one note called <code>Genesis 3</code> will work even without the folders!)</li>
<li>I managed to fix the chapter headings (<a href="https://github.com/evantravers/undo-zk/commit/a47a0b93d5a4479158ebc408f49cddd4a41bb67a">commit</a>)... mostly. This goes through the import and yanks out all the little &quot;editor chapter headings&quot; and sets them as an <code>&lt;h4&gt;</code>. Still buggy, and I end up fixing manually.</li>
<li>I recently did a huge scary reflex to refactor away from having hyphens in the names to the simpler <code>Genesis 1</code> form. This means that Obsidian’s Unlinked Mentions can trigger on a mention of a book of the Bible in a kindle highlight, or OCR’d journal entry. Very exciting… and simpler to write.</li>
</ul>
<a href="#fnref-history" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Shopping for an Ergonomic Keyboard</title>
       <link>http://evantravers.com/articles/2024/05/15/shopping-for-an-ergonomic-keyboard/</link>
       <pubDate>Wed, 15 May 2024 12:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/05/15/shopping-for-an-ergonomic-keyboard/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/10/atreus.png"></p><div class="admonition tldr">
<p>An ergonomic keyboard with programmable layout and neutral wrist posture can help some RSI symptoms.</p>
</div>
<p>Already read <a href="https://evantravers.com/articles/2019/09/09/mechanical-keyboards-won-t-fix-your-rsi/">my article on mechanical keyboards and RSI</a>, and believe an ergonomic keyboard will help your symptoms? Ok! 👨‍💻</p>
<h2><a href="#while-you-shop-prepare-today" aria-hidden="true" class="anchor" id="while-you-shop-prepare-today"></a>While You Shop: Prepare Today</h2>
<p>Here are a few steps to prepare for your ergonomic keyboard… and they can reduce strain <em>today</em>.</p>
<h3><a href="#push-board-back-for-straighter-wrists" aria-hidden="true" class="anchor" id="push-board-back-for-straighter-wrists"></a>Push Board Back for Straighter Wrists</h3>
<div class="admonition tldr">
<p>Push the keyboard back to straighten your wrists.</p>
</div>
<p>A standard staggered keyboard forces your wrists to contort slightly. Sometimes shifting the position of your keyboard deeper onto your desk can help this, as it decreases the intensity of the angle.</p>
<p>You can also experiment with the height of your desk and the height of your hands above the keyboard.  I don't use wrist wrests (which can aggravate tendon-related issues as they apply pressure on the bottom of your soft tissues) and &quot;float&quot; my hand above my keyboard. Your mileage may vary.<sup class="footnote-ref"><a href="#fn-piano" id="fnref-piano" data-footnote-ref>1</a></sup></p>
<h3><a href="#use-the-opposite-hand-for-modifiers" aria-hidden="true" class="anchor" id="use-the-opposite-hand-for-modifiers"></a>Use The Opposite Hand for Modifiers</h3>
<div class="admonition tldr">
<p>When pressing a key, use the opposite hand for the modifiers. (i.e. LH Shift for <code>J</code>, RH Shift for <code>F</code>.)</p>
</div>
<p>Modifiers like Shift, Control, and Command/Windows occur on both sides of the keyboard <em>for a reason</em>. When I first started programming I experienced RSI-esque pain above my left wrist. My friend Tom pointed out that I only used my left hand for every single modifier. This heavy use plus contorting that hand to reach all the modifiers largely caused the pain.</p>
<p>There are a couple ways to learn this:</p>
<ul>
<li><a href="https://monkeytype.com/">monkeytype.com</a> has an option called <code>opposite shift mode</code>.</li>
<li>Karabiner-Elements has <a href="https://ke-complex-modifications.pqrs.org/#block_one_handed_combos">a complex rule to force this behavior</a>.</li>
</ul>
<p>I used the Karabiner-Elements limiter. It was <em>incredibly</em> frustrating for a month or two (especially passwords!) but then I learned and I've been typing using the opposite hand for modifiers ever since.</p>
<p>(You can also consider moving a common modifier (Control is a common choice) to the Caps Lock key. <a href="https://support.apple.com/guide/mac-help/change-the-behavior-of-the-modifier-keys-mchlp1011/mac">OSX allows this with no other software tools</a> .)</p>
<h3><a href="#minimize-finger-motion" aria-hidden="true" class="anchor" id="minimize-finger-motion"></a>Minimize Finger Motion</h3>
<div class="admonition tldr">
<p>Use layout modifications to creatively reduce how far each finger reaches.</p>
</div>
<p>We want to reduce harmful hand motions… anything that requires reaching, curling-under… basically any finger movement off it's standard axis. Pay attention to common chords and keystrokes, and think how you could make it easier.</p>
<p>Some quick examples to pay attention to:</p>
<ul>
<li>Common chords: (zoom in/out, next/prev tab).</li>
<li>common modifiers like Control often require a hand twist and finger curl.</li>
<li>parentheses and common special characters sometimes are quite a pinky reach.</li>
</ul>
<p>A great place to start is the <a href="https://stevelosh.com/blog/2012/10/a-modern-space-cadet/">recommendations made by Steve Losh in Modern Space Cadet</a>: Control moved to Caps Lock, Shifts for parentheses.</p>
<p>If you are like me… <a href="https://evantravers.com/articles/2023/05/27/5x3-3-keyboard-layout/">I've gone wild over the last decade</a>. But baby steps! I started with moving Control and arrows to <code>hjkl</code>. 🤷</p>
<h2><a href="#get-in-nerd-were-going-shopping" aria-hidden="true" class="anchor" id="get-in-nerd-were-going-shopping"></a>Get In Nerd, We're Going Shopping</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2024/05/compare.png">
  <figcaption>
    Here I'm comparing the curves and thumb locations of a Kyria, Corne, and Atreus… all boards I use.
  </figcaption>
</figure>
<p>It's really hard to have an &quot;evergreen&quot; guide to what keyboards are good… there's new ones coming out all the time! Here's some guidelines:</p>
<ul>
<li>check out <a href="https://reddit.com/r/ergomechkeyboards">reddit.com/r/ergomechkeyboards</a> to see up and coming projects.</li>
<li>it needs to be reprogrammable… or you can't reap the benefit.</li>
<li>if your issues are related to wrist alignment, (inflammation of tendons and soft tissues,) then a keyboard that realigns your wrists naturally like a split or &quot;bent&quot; keyboard <em>can</em> help.</li>
<li>compare layouts using <a href="https://jhelvy.shinyapps.io/splitkbcompare/">the split keyboard comparing tool by jhelvy</a>. Print off 1:1 copies of layouts on a piece of paper to put your hands on the shapes: different hands prefer different positions of thumb clusters.</li>
<li>at first you'll want to keep your number row and have lots of keys, but the more keys means more finger reaching and more money to pay for switches.</li>
<li>there are limited keyboards available with fancy metal cases. Buy something simple and cheap.</li>
</ul>
<p>If you still just want a &quot;what should I buy:&quot; I recommend the <a href="https://shop.keyboard.io/products/keyboardio-atreus">Keyboardio Atreus</a> as a starter. It's got enough keys for most people, it's relatively inexpensive, and supports visual reprogramming.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-piano">
<p>I played classical piano for many years, so long habit. 🎹 <a href="#fnref-piano" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>If We Hung Out…</title>
       <link>http://evantravers.com/articles/2024/04/30/if-we-hung-out/</link>
       <pubDate>Tue, 30 Apr 2024 06:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/30/if-we-hung-out/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>If we hung out for a day, I'd…</p>
<ol>
<li>probably have my <a href="https://evantravers.com/articles/tags/bullet-journal/">journal</a> out in front of me during our coffee.</li>
<li>ask you what you are learning this week.</li>
<li>give thanks for my amazing wife.</li>
<li>find a way to show you pictures of my kids.</li>
<li>teach you <a href="https://www.youtube.com/watch?v=nJYKKyZFqzU">how to roll top a chip bag without a clip</a>.</li>
<li>demonstrate <a href="https://www.fieggen.com/shoelace/ianknot.htm">tying the best shoelace knot</a>.</li>
<li>ask you if you want to see <a href="https://evantravers.com/articles/2024/02/15/yabai-tiling-window-management-for-osx/">weird window management</a> tricks.</li>
<li>beg you to <a href="https://1password.com/">use a password manager</a>.</li>
<li>shyly use <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">this weird keyboard</a> and kinda hope you'd notice.</li>
<li>text you that funny video <a href="https://www.youtube.com/watch?v=aXQ2lO3ieBA">about design by committee from Pentagon Papers</a> as an weird encouragement.</li>
<li>recommend using a Clipboard history manager.</li>
<li>jot down something we said into <a href="https://evantravers.com/articles/tags/drafts-app/">Drafts.app</a> because I want to write and expand on it later.</li>
<li>talk about either <em>The Devil and The White City</em> or <em>In The Garden of Beasts</em>.</li>
<li>rave about how Obsidian Canvas helps me connect things long term.</li>
<li>show <a href="https://evantravers.com/articles/2024/01/05/ios-homescreen-2024/">stuff I do with my homescreen</a>.</li>
<li>encourage you to <a href="https://evantravers.com/articles/tags/sketchnotes/">give sketchnotes a try</a>.</li>
<li>be confused by my own live demo about <a href="https://evantravers.com/articles/tags/nix/">nix</a>.</li>
<li>recommend learning <a href="https://www.youtube.com/watch?v=L7av0C0jWQw">how to coil a cable properly</a>. (I spent too long not knowing this.)</li>
<li>attempt to explain why <a href="https://evantravers.com/articles/2020/05/09/creating-a-focus-budget/">time-blocking is so helpful</a> for me.</li>
<li>endorse <a href="https://youtu.be/QIkodlp8HMM?t=152">setting up your car's mirrors correctly</a>.</li>
<li>lament the loss of a <a href="https://viewsource.info/">view source Web</a> and encourage you to <a href="https://evantravers.com/articles/tags/indieweb/">build an indieweb site</a>.</li>
<li>involuntary podcast about weak signals and <em>Left of Bang</em>.</li>
<li>eventually try to explain why I love <em>Till We Have Faces</em>, and ultimately fail. Again.</li>
<li>listen to your favorite rant… and encourage you to write a blog post about it.</li>
<li>be curious about any productivity practices you have particular to you.</li>
<li>want to know your favorite <a href="https://evantravers.com/articles/tags/books/">books</a>.</li>
<li>ultimately make a C.S. Lewis or Tolkien reference.</li>
<li><a href="https://evantravers.com/articles/2024/02/02/digital-prayer-journal-using-contacts/">write down your prayer requests</a>, and maybe pray for you right then.</li>
<li>be curious how you would think about developing your family values with the question: &quot;What are the attributes and values that <strong>only you</strong> can teach your children?&quot;</li>
<li>embarrassedly chuckle and start a conversation with &quot;I've an unfinished essay where I argue...&quot;</li>
<li>be very pleased if you also liked bluegrass music... but not required.</li>
<li>try to restrain myself from talking for thirty minutes on creativity, AI, or whatever else it is that I'm currently essay-ing.</li>
<li>be interested in what you keep in your <a href="https://evantravers.com/articles/tags/edc/">EDC bag</a>.</li>
<li>find my thoughts improved and connected by our conversation... and want to write it all down so I don't lose it.</li>
<li>send you a follow-up email with links to all the random stuff I mentioned so that you wouldn't have to remember.</li>
</ol>
<p>Oh and I recently had a birthday. 🥳</p> ]]></description>
    </item>
    <item>
       <title>Discouraging AI Agents with darkvisitors.com</title>
       <link>http://evantravers.com/articles/2024/04/22/discouraging-ai-agents-with-darkvisitors-com/</link>
       <pubDate>Mon, 22 Apr 2024 11:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/22/discouraging-ai-agents-with-darkvisitors-com/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>The <a href="https://evantravers.com/robots.txt">robots.txt for evantravers.com</a> is now generated on site build from <a href="https://darkvisitors.com/">darkvisitor.com</a>'s API.</p>
<p>Pretty simple change. I added this to the helpers block in my middleman's config.rb:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">helpers</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># […]</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dark_visitors</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headers</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Authorization</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Bearer &lt;secret token&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">agent_types</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AI Assistant</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AI Data Scraper</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AI Search Crawler</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Undocumented AI Agent</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encode_www_form</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endpoint</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://api.darkvisitors.com/robots-txts</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">freeze</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">response</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Net</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HTTP</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">post</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endpoint</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">response</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Then I replaced <code>robots.txt</code> with <code>robots.txt.erb</code> and added:</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> dark_visitors <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>That's it!</p>
<p>Of course, adding this to my robots.txt is a little bit like hanging a sign on my house that says please don't steal my stuff, it only works for &quot;honorable thieves,&quot; and that's a bit of a oxymoron.</p> ]]></description>
    </item>
    <item>
       <title>Walking Towards the Fridge</title>
       <link>http://evantravers.com/articles/2024/04/21/walking-towards-the-fridge/</link>
       <pubDate>Sun, 21 Apr 2024 09:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/21/walking-towards-the-fridge/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/04/fridge.jpg"></p><p>Why does a child ask his parent for a snack? Because he knows the parent has the power to grant that request. He will even move towards the fridge as he asks… knowing the answer ahead of time.</p>
<p>Our family prayer requests are written on 3x5 cards and magneted to our kitchen fridge. We put them there because it's convenient space in our home, but it also stands for more: our Heavenly Father has the power to grant the request.</p>
<blockquote>
<p>[16] Let us then with confidence draw near to the throne of grace, that we may receive mercy and find grace to help in time of need.
(Hebrews 4:16)</p>
</blockquote>
<p>We have a father that delights to give good gifts<sup class="footnote-ref"><a href="#fn-gifts" id="fnref-gifts" data-footnote-ref>1</a></sup>. With childlike confidence we can walk towards the fridge.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-gifts">
<blockquote>
<p>[10] Or if he asks for a fish, will give him a serpent? [11] If you then, who are evil, know how to give good gifts to your children, how much more will your Father who is in heaven give good things to those who ask him!
(Matthew 7:10-11)</p>
</blockquote>
<a href="#fnref-gifts" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Calculus Made Easy</title>
       <link>http://evantravers.com/articles/2024/04/19/calculus-made-easy/</link>
       <pubDate>Fri, 19 Apr 2024 09:06:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/19/calculus-made-easy/</guid>
       <description><![CDATA[ <blockquote>
<p>The fools who write the textbooks of advanced mathematics — and they are mostly clever fools — seldom take the trouble to show you how easy the easy calculations are. On the contrary, they seem to desire to impress you with their tremendous cleverness by going about it in the most difficult way.</p>
<p>Being myself a remarkably stupid fellow, I have had to unteach myself the difficulties, and now beg to present to my fellow fools the parts that are not hard. Master these thoroughly, and the rest will follow. What one fool can do, another can.</p>
</blockquote>
<p>At first I thought this was a cheeky blog in Dickensian style, but it turns out that it was published in 1910! I read the first few chapters and my goodness does this &quot;fool&quot; cut to the point and make the 2010s textbook I had in college look a &quot;clever fool.&quot;</p><p><a href="https://calculusmadeeasy.org/prologue.html" class="u-in-reply-to  is-reply">Prologue | Calculus Made Easy - calculusmadeeasy.org</a></p> ]]></description>
    </item>
    <item>
       <title>Not Feeling SASS-y Anymore</title>
       <link>http://evantravers.com/articles/2024/04/17/not-feeling-sass-y-anymore/</link>
       <pubDate>Wed, 17 Apr 2024 11:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/17/not-feeling-sass-y-anymore/</guid>
       <description><![CDATA[ <p>After reading <a href="https://dev.37signals.com/modern-css-patterns-and-techniques-in-campfire/">Modern CSS Patterns in Campfire</a>, I was inspired to refactor the style sheet for this blog. I've been using SASS for every CSS-related project for more than a decade. This is in part because it's been a great tool to use and in part because most of my career has been in the Rails world<sup class="footnote-ref"><a href="#fn-less" id="fnref-less" data-footnote-ref>1</a></sup>.</p>
<p>I was really surprised at both how easily my SASS converted to CSS… and by the advantages that I found while doing the refactor. (If you are a code-nerd and want to <a href="https://gist.github.com/evantravers/53d6750e0c4bb6c29d706cac84cf53cb">read the diff</a> go for it, but otherwise read on!)</p>
<p>Some quick notes from the transition:</p>
<h2><a href="#nesting-just-works" aria-hidden="true" class="anchor" id="nesting-just-works"></a>Nesting just works</h2>
<p>I thought that I'd take a shortcut by simply copy-pasting the SASS-rendered CSS into a new CSS file. The default SASS settings &quot;flattens&quot; the SASS-nesting into a single level CSS file… but then I realized that CSS nesting exists and is basically 1:1 equivalent. 🤯</p>
<p>There's nothing much to report. I just used the exact same nesting structure for both and it worked.</p>
<h2><a href="#oklch-and-variables" aria-hidden="true" class="anchor" id="oklch-and-variables"></a>OKLCH and Variables</h2>
<p>I converted all my colors to OKLCH, first by just converting them out of hex using the <a href="https://www.raycast.com/thomas/color-picker">Raycast color picker extension</a> and then modifying them slightly.</p>
<p>I would like to explore a new palette for my blog, but for now I &quot;burned&quot; the existing results of any computed sass functions (like <code>lighten(#8aace1, 30%)</code>) to a OKLCH color. Then I computed some equivalent colors using <code>calc()</code>:</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">root</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">56.3</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.152</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">259</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deg</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>   <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">oklch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-100</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">oklch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">10</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.9</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-200</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">oklch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">20</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.8</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--blue-h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>It looks a little different, hopefully that will change as I learn.</p>
<p>You can nest variables in a mediaquery. This <em>alone</em> simplified my CSS file tremendously.</p>
<p>There used to be a little &quot;if/then&quot; dark-mode mediaqueries all over the file, something like this (parts of the SCSS file omitted to show how the logic gets scattered.):</p>
<pre class="lumis"><code class="language-scss" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@media</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prefers-color-scheme</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dark</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">background</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">black</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">white</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nav</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">main_navigation</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hover</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@media</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prefers-color-scheme</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dark</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">white</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="18">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">black</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="22"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="23">
</div><div class="line" data-line="24"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="25">
</div><div class="line" data-line="26"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__title</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="27">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@media</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prefers-color-scheme</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dark</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">white</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// […]</span>
</div><div class="line" data-line="30"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Of course, all those <code>[…]</code> represent hundreds of characters and lines separating those <code>@media</code> statements that all represent the same intent: &quot;if <code>prefers-color-scheme: dark</code> then flip the colors.&quot; Seems wasteful and hard to maintain? Yep.</p>
<p>Check out how this looks now (parenthetical ellipsis omitted for emphasis):</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">root</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--body-color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> black<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@media</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prefers-color-scheme</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> dark<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">root</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--body-color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> white<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--body-color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nav</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">main_navigation</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="18">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hover</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--body-color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__title</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="26">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--body-color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>So clean! 👏</p>
<p>The logic for &quot;what should the color be?&quot; is abstracted to one place, one place that is responsible for all the other dark mode decisions. I'm excited to expand this to &quot;what should the base unit of measurement be on mobile?&quot; or &quot;how should spacing be on touch-oriented devices?&quot; Super fun possibilities.</p>
<p>I also discovered you can <code>@import</code> a css file based on mediaqueries which simplified my including of the files used for styling the code blocks on this page:</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@import</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/css/base16ocean-light.css&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@import</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/css/base16ocean-dark.css&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> screen <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prefers-color-scheme</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> dark<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Once again, the individual files don't need to know anything about the logic of dark/light mode internally, it's all handled at the higher level.</p>
<h2><a href="#view-source-web" aria-hidden="true" class="anchor" id="view-source-web"></a>View-source Web</h2>
<p>After I finished converting all my SASS files to CSS I realized that the only reason I had NPM and Webpack was just for <a href="https://evantravers.com/articles/2019/11/14/indieweb-webmentions-on-middleman-or-jekyll/">one Vue component</a>. I flirted with porting it to HTMX (I may yet do this!) but I realized that I could leverage Vue's power to work from CDN and everything<sup class="footnote-ref"><a href="#fn-axios" id="fnref-axios" data-footnote-ref>2</a></sup> is working without a build step.</p>
<p>This means that all the HTML, CSS, and Javascript currently on this site basically works without a compiler/minifier step. You can just <a href="https://viewsource.info/">view-source and read</a> it.</p>
<h2><a href="#booboos" aria-hidden="true" class="anchor" id="booboos"></a>Booboos</h2>
<p>The only thing that really hung me up was I was so used to CSS comments. 🤷 I ended up using a vim regex to convert them. As it was, using <code>//</code> like I was used to caused CSS to fail silently and strangely, and it took rekindling old dev habits to figure it out.</p>
<p>I do wish I had an LSP or linter step to help me find syntax errors in my files. I've become so used to SASS warning me about badly formed declarations or illegal values.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>There's so much more to learn. I haven't even played with <code>@layer</code> yet, but I can see a <em>real</em> use for it when working in a legacy codebase. You could set a &quot;legacy&quot; <code>@layer</code>, wrap existing nasty CSS in <code>@layer</code> and construct your new CSS architecture however you want:</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@layer</span> newstuff legacy<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@layer</span> legacy <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/* old nasty crufty long code in here */</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@import</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/new/structured/css/manifest.css&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> layer<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>newstuff<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Exciting times y'all! At this point, I can't see a reason to use SASS on a new project. I don't have a good solution for the <code>@mixin</code> or <code>@include</code> behavior, nor is there any way to loop over variables, but for that kind of thing I'd probably have a custom &quot;view&quot; that creates a <code>variables.css</code> file that I could then <code>@import</code> and handle separately.</p>
<p>I guess if you have a <em>giant</em> platform with a huge amount of CSS, Webpack and it's plentiful kin can help you reduce what is loaded for a single request, but that's <a href="https://512kb.club/">not a problem on this blog</a>.</p>
<p>If you want to see what all I changed, there's <a href="https://gist.github.com/evantravers/53d6750e0c4bb6c29d706cac84cf53cb">a slightly redacted diff on github</a>.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-less">
<p>I did have a short stint using LESS, but that was so long ago I have forgotten it. <a href="#fnref-less" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-axios">
<p>All I had to do was <code>import</code> Vue from CDN and lowercase <code>axios</code> everywhere as I just used a normal script tag... but you can just <a href="view-source:https://evantravers.com/js/webmentions.js">view source</a> and see that! <a href="#fnref-axios" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Muscular imagination</title>
       <link>http://evantravers.com/articles/2024/04/12/muscular-imagination/</link>
       <pubDate>Fri, 12 Apr 2024 10:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/12/muscular-imagination/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<blockquote>
<p>The Culture is a spacefaring, free­wheeling admixture of anarchism and socialism. In most ways, it promises its citizens radical, breath­taking freedom … but in a few other ways, it requires their submission — to super­human systems of planning and manufacture, the Culture’s ineffable Minds.</p>
</blockquote>
<p>If that sounds familiar… it's a theocracy. It's just gods we imagined and made, bound by our rules and (mostly) recognizable.</p>
<p>Robin continues:</p>
<blockquote>
<p>Iain M. Banks shows us the Culture harnessing matter and energy on incred­ible scales. He tells us that citizens of the Culture live for hundreds of years; that death is generally a choice. In these books, the Culture basically always wins!</p>
<p>At first glance, this seems fatal to plot. Endless energy, immortality … aren't these the GOALS of the story? Are we just talking about heaven here? Heaven: which ought to be occluded, unknowable, unsayable. Heaven: because it's boring.</p>
</blockquote>
<p>Robin is so right. Alone among cynical, fearful authors Banks stands as a titan of imagination: &quot;what would it be like if we won?&quot; But also alone among authors Banks asks &quot;what would it be like if we won, and it wasn't enough?&quot; Banks' imagination leaves a God-shaped negative space that speaks volumes.</p>
<p>This makes the Culture novels both boundlessly fascinating and endlessly depressing from a redemptive perspective. It's such a closer mirror of Christian understanding of government, freedom, and ideals… but with false gods.</p>
<p>If that sounds interesting, Robin's post is a great guide to the universe, and I agree with his &quot;start here&quot; posts… but I'd add <em>Excession</em> towards the end.</p>
<p>(Some of the Culture books have strong content warnings, so use discretion as a reader.)</p><p><a href="https://www.robinsloan.com/moonbound/muscular-imagination/" class="u-in-reply-to  is-reply">Muscular imagination - www.robinsloan.com</a></p> ]]></description>
    </item>
    <item>
       <title>UX Research System in Confluence</title>
       <link>http://evantravers.com/articles/2024/04/10/ux-research-system-in-confluence/</link>
       <pubDate>Wed, 10 Apr 2024 17:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/10/ux-research-system-in-confluence/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/04/user-insight-template.png"></p><p>Some time ago I ran across Tomer Sharon's post about <a href="https://tsharon.medium.com/democratizing-ux-670b95fbc07f#.5d9dxkqva">Democratizing UX (Medium.com)</a>. Tomer details a workflow that extricates the essential UX Insights out of research and design activities and makes them available for Product and UX.</p>
<p>The concept of an Insight Database really resonated with me. It resembles Atomic Notes or a <a href="https://evantravers.com/articles/tags/creativity-systems/">Creativity System</a>… which of course is fascinating to me. As a member of a team that had a few UX designer/researchers compared to the number of Product folk I wanted this system, but I didn't want to add another tool to our already fragmented knowledge stack.</p>
<p>What I did have… was Atlassian's Confluence.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/create-space.png">
    <figcaption>
        By creating a Space we have a home for our templates and insights.
    </figcaption>
</figure>
<p>So I started experimenting and building… and found a fairly robust solution using Page Properties and Labels.</p>
<p>First, a couple goals. I wanted to…</p>
<ul>
<li>Connect different groups without creating a lot of busywork.</li>
<li>Make research explorable and searchable on Confluence, since that was the first stop for people trying to answer a product question.</li>
<li>Co-opt existing documentation without requiring a refactor or moving from one Confluence Space to another.</li>
</ul>
<p>What I ended up with:</p>
<ul>
<li>A new <a href="https://support.atlassian.com/confluence-cloud/docs/use-spaces-to-organize-your-work/">Confluence Space</a> (I usually name mine &quot;Research&quot; or something)
<ul>
<li>A <a href="https://support.atlassian.com/confluence-cloud/docs/edit-a-template/">Page Template</a> for a User Insight, with <a href="https://support.atlassian.com/confluence-cloud/docs/edit-a-template/#Variables">Variables</a> for <a href="https://confluence.atlassian.com/doc/page-properties-macro-184550024.html">Page Properties</a>.</li>
<li>A <a href="https://confluence.atlassian.com/doc/set-up-a-space-home-page-829076213.html">Space Home Page</a> containing…
<ul>
<li><a href="https://support.atlassian.com/confluence-cloud/docs/insert-the-page-properties-report-macro/">Page Property Reports</a> with <a href="https://community.atlassian.com/t5/Confluence-articles/How-to-Work-With-Tables-in-Confluence-Cloud/ba-p/1718038">Table Filters</a> for displaying User Insights</li>
<li>A <a href="https://support.atlassian.com/confluence-cloud/docs/insert-the-create-from-template-macro/">Create from Template</a> button for building a new User Insight</li>
</ul>
</li>
<li>Folders to store User Insights.</li>
</ul>
</li>
</ul>
<p>When a person either finds an insight or completes a research project they simply:</p>
<ol>
<li>Go to the Research Space</li>
<li>Click the New Insight button</li>
<li>Fill out the required fields</li>
<li>Type up a tweet-length summary of the insight, optionally link to existing documentation.</li>
<li>Save.</li>
</ol>
<p>That's it! The insight is now logged, searchable, and filterable along with all the other reports.</p>
<p>If all that makes sense to you, and you are a Confluence wizard, 👍. If not… more detail follows.</p>
<h2><a href="#confluence-particulars" aria-hidden="true" class="anchor" id="confluence-particulars"></a>Confluence Particulars</h2>
<p>I'm a big fan of atomic notes, and Confluence's search kind of rewards smaller, more particular documents with specific titles. We are going to try to leverage that to make sure that individual insights are as discoverable as possible through our reports, and through raw search.</p>
<h2><a href="#page-properties" aria-hidden="true" class="anchor" id="page-properties"></a>Page Properties</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/finished-entry.png">
    <figcaption>
        Here we see the Page Properties within a finished UX Insight document.
    </figcaption>
</figure>
<p><a href="https://confluence.atlassian.com/doc/page-properties-macro-184550024.html">Page Properties</a> are a Confluence macro that appears as a two-column table. It has the special power of behaving basically like database entries and can be reported on. This is the closest thing I could find to Airtable's flexible database system.</p>
<p>It's tempting to go hog-wild and add every variable you could want to isolate… but I recommend keeping the fields very simple. I settled on:</p>
<ul>
<li><strong>Persona</strong> (Dropdown): You'll want to find research on a user type… and I recommend restricting this list.</li>
<li><strong>Specific Persona</strong> (Text): If you need to specify a particular Persona (First Time User, etc.) than you have this available.</li>
<li><strong>Area</strong> (Dropdown): This lets you segment research by part of the product.</li>
<li><strong>Date Completed</strong>: Since you may be absorbing older insights and research, having a date other than the date the Confluence page was created is important.</li>
</ul>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/edit-variable.png">
    <figcaption>
        You can select a discrete list of options for a Page Property by using the Variable macro in the Template.
    </figcaption>
</figure>
<p>You can copy Tomer's fields if you want from his original post.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/user-insight-template-variables.png">
    <figcaption>
        If you set up Variables in your Template can restrict what goes in each cell to a discrete list you define.
    </figcaption>
</figure>
<p>To ensure consistency, I recommend creating a Page Template for your Space that has the Page Properties macro already installed. Use the Variables feature of the Templating system to restrict fields like <code>Persona</code> to a set list that you have determined to prevent the data from getting murky. You can also add the Label required for the Page Property Report.</p>
<h2><a href="#page-property-reports" aria-hidden="true" class="anchor" id="page-property-reports"></a>Page Property Reports</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/edit-page-properties-report.png">
    <figcaption>
        Configuring the Page Properties Report is really simple.
    </figcaption>
</figure>
<p>I put a <a href="https://support.atlassian.com/confluence-cloud/docs/insert-the-page-properties-report-macro/">Page Property Report</a> on the Home Page to filter and show all the User Insights. It's possible to use plugins or Table Filters to add more searching options, but for now you can keep it simple.</p>
<h2><a href="#final-recommendations" aria-hidden="true" class="anchor" id="final-recommendations"></a>Final Recommendations</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2024/04/home-with-one-entry.png">
    <figcaption>
        The <code>New Insight</code> button allows someone to add something to the Insights list easily.
    </figcaption>
</figure>
<p>For those seeking to explore the growing database, customize the Space's Home Page to guide people to recent research via a Page Property Report, and link to any documentation on the process your team agrees on. For those seeking to report an insight, use the Create New from Template button to make it easier.</p>
<p>If you wanted to, you could create custom reports to reflect a particular Persona / Area combination for your team, exposing a team to a constant stream of intel on the part of the application they work on. You could also try integrations to auto-create pages when support tickets are resolved, or other workflows.</p>
<p>I've rolled this out at two companies now… and while stitching together the system is harder, getting colleagues across departments to embrace it is much harder. Make sure you have a clear communication and training plan to implement this effectively, or it doesn't matter how lovely your templates are… no one will use it.</p>
<h2><a href="#resources" aria-hidden="true" class="anchor" id="resources"></a>Resources</h2>
<ul>
<li><a href="https://tsharon.medium.com/democratizing-ux-670b95fbc07f#.5d9dxkqva">Democratizing UX by Tomer Sharon - Medium</a></li>
<li><a href="https://blog.airtable.com/how-to-build-a-ux-research-system-that-runs-on-autopilot/">How to Build a UX Research System that Runs on Autopilot - airtable</a></li>
<li><a href="https://www.airtable.com/universe/expShuhNMi0Oc0xpb/polaris-ux-nuggets">Polaris UX Nuggets starter kit on Airtable</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Digital Homesteading</title>
       <link>http://evantravers.com/articles/2024/04/01/digital-homesteading/</link>
       <pubDate>Mon, 01 Apr 2024 10:02:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/04/01/digital-homesteading/</guid>
       <description><![CDATA[ <p>I grew up around farms and farmers. Cattle and chickens, the smell of old things slowly becoming food for new things, grizzled men plucking at their coverall straps, spitting to the left, and ruminating with their friends whether the back pasture is going to give them enough hay to last the winter. They made purchases based on how easy it was to maintain: old farm trucks with space to &quot;swing your legs in&quot; while you were working on the engine, tractors where the metal shell was never screwed over the engine block because they were going to work on it tomorrow anyway. There's sustainable wisdom to this: they never encountered a daily problem that they couldn't solve with a little more common sense and simple tools.</p>
<p>Such a lifestyle and the skills required are now seen as quaint. We have been conditioned to believe we don't have time<sup class="footnote-ref"><a href="#fn-easy" id="fnref-easy" data-footnote-ref>1</a></sup> or energy to troubleshoot our problems, much less to start considering &quot;can I fix this myself?&quot; as part of our decision-making.</p>
<p>##… </p>
<p>I grew up alongside farmers, but I didn't have that life and didn't absorb those skills. I spent a lot more time on keyboards than in fields. While I'd like to reclaim those lost farm-skills, I have realized that my journey has an advantage: When I got started writing on the internet, the only way to have a website was to <em>build your own</em> website. It was nerdy, time-consuming, and personal… but more importantly we learned to fix our own mistakes. We learned from the builders around us<sup class="footnote-ref"><a href="#fn-viewsource" id="fnref-viewsource" data-footnote-ref>2</a></sup>. This blog is <em>mine</em><sup class="footnote-ref"><a href="#fn-distribution" id="fnref-distribution" data-footnote-ref>3</a></sup>. I never screw the shell down because I'm going to work on it tomorrow anyway.</p>
<p>If your passion or livelihood depends on a set of tools or capabilities, don't rent those tools from someone who can deny you access<sup class="footnote-ref"><a href="#fn-example" id="fnref-example" data-footnote-ref>4</a></sup> or claim your output<sup class="footnote-ref"><a href="#fn-output" id="fnref-output" data-footnote-ref>5</a></sup> at any time. Own your tools. Be a digital homesteader.</p>
<h2><a href="#resources-for-digital-homesteading" aria-hidden="true" class="anchor" id="resources-for-digital-homesteading"></a>Resources for Digital Homesteading</h2>
<ul>
<li>I'm pretty interested in the idea of the <a href="https://indieweb.org/">indieweb</a>, and <a href="https://evantravers.com/articles/tags/indieweb/">this blog has some features</a>. <a href="https://matthiasott.com/notes/welcome-to-the-indieweb">Matthias Ott wrote a great introduction</a> to help you get started.</li>
<li>Derek Sivers wrote an incredible guide to what <a href="https://sive.rs/ti">he refers to as Digital Independence</a>: website, contacts, calendar, and email under your control.</li>
<li>There are commercial products that are more plug and play if you don't type commands into a terminal. Synology recently released their <a href="https://bee.synology.com/en-us/BeeStation">BeeStation</a> which promises to be a cloud-in-a-box. I haven't tried BeeStation personally although I have used other Synology products.</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-easy">
<p>Remember <a href="https://www.youtube.com/watch?v=NojiCsZQSr8">this commercial</a>? Long before Amazon's Buy It Now. <a href="#fnref-easy" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-viewsource">
<p>When I was learning my craft, <em>every</em> website I encountered could be understood by simply clicking <code>View Source</code>: <a href="https://viewsource.info/">https://viewsource.info/</a>. Hugely empowering… and sadly lost in the age of complex build systems and generative front-end stacks. <a href="#fnref-viewsource" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-distribution">
<p>There are indeed higher powers that could really mess with my ability to distribute: DNS registrars, .gov dominated BGP servers, caching services, search engines. In the end though… I can still build HTML documents and distribute over <a href="https://en.wikipedia.org/wiki/Sneakernet">sneakernet</a> if I want. <a href="#fnref-distribution" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-example">
<p>Example: CGP Grey almost <a href="https://www.youtube.com/watch?v=DIssymQvrbU">lost his livelihood because of an automated copyright strike… on his own content</a>. <a href="#fnref-example" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-output">
<p>The largest content-driven websites are selling rights to train AI models on our behavior, content, and insights. You use their rented tools, they profit from your output. Sometimes that's a good trade. Sometimes it's not. More on this later. <a href="#fnref-output" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Seth Godin Coaching Tim Ferriss</title>
       <link>http://evantravers.com/articles/2024/03/23/seth-godin-coaching-tim-ferriss/</link>
       <pubDate>Sat, 23 Mar 2024 08:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/03/23/seth-godin-coaching-tim-ferriss/</guid>
       <description><![CDATA[ <p>I really loved this episode. Like Tim I struggle with being verbose and I felt that Seth touched a nerve when he expressed it  as a fear of being misunderstood:</p>
<blockquote>
<p>All I have to do is take my idea and make it shorter.&quot; And when we try to do that, resistance kicks in, Pressfield's resistance, and we say, &quot;But I need to clarify this sentence and add a parenthetical to that sentence, or else I will be misunderstood.&quot;</p>
</blockquote>
<p>Ouch.</p>
<p>I also resonated with the conversation on genre. I feel like over the years I've slowly coalesced on a genre: &quot;things I would text to more than one of my friends,&quot; which Seth expresses more elegantly:</p>
<blockquote>
<p>If I can show up with something in your bones you know to be true or interesting or worth thinking about, but I can say it in a way that would benefit you if you could share it with your friends and colleagues, that's a great blog post.</p>
</blockquote>
<p>I am a little more parenthetical prone than Seth, but it brings me joy to hear this.</p>
<p>I suppose the coaching worked for Tim, because Tim published <a href="https://tim.blog/2024/03/22/how-to-start-a-war/">some short fiction</a> (that honestly doesn't feel like fiction) a few days later.</p><p><a href="https://tim.blog/2024/03/20/seth-godin-3/" class="u-in-reply-to  is-reply">Seth Godin — Coaching Tim on Overcoming Resistance, Lessons from Isaac Asimov, Writing Secrets After 8,500+ Daily Blog Posts, The Dangers of Authenticity, Practices for Consistency, and Much More (#728) - The Blog of Author Tim Ferriss - tim.blog</a></p> ]]></description>
    </item>
    <item>
       <title>Alternatives to the Corne-ish Zen</title>
       <link>http://evantravers.com/articles/2024/03/22/alternatives-to-the-corne-ish-zen/</link>
       <pubDate>Fri, 22 Mar 2024 08:32:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/03/22/alternatives-to-the-corne-ish-zen/</guid>
       <description><![CDATA[ <p>I've gotten a lot of emails from those of you who saw <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">my post on the Corne-ish Zen</a> and want one for themselves. Sadly the group buys for the Zen are closed. There is no plan to make more at this point.</p>
<p>As of March 2024 here are a couple alternatives to look into if the idea of a small premium split keyboard is appealing.</p>
<h2><a href="#typeractive-5-column-corne" aria-hidden="true" class="anchor" id="typeractive-5-column-corne"></a>Typeractive 5 Column Corne</h2>
<p><img src="https://pbs.twimg.com/media/FpYVt5bXEAIrv6r?format=jpg&amp;name=large" alt="corne from twitter" />
(Image from <a href="https://twitter.com/joe_scotto/status/1627512199307558912/photo/2">@joe_scotto on X</a>)</p>
<p>The <a href="https://typeractive.xyz/pages/build/corne-5col_choc">Typeractive 5-Column Corne</a> kit appears to be <em>very</em> similar to the Corne-ish Zen, especially when it comes to the choc-spacing of the keys. It's also pretty affordable. I may pick one up as a backup.</p>
<p>Joe Scotto has a great video on how to build one:</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/FJgvi7WShxY"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<h2><a href="#ferris-sweep-crab-broom" aria-hidden="true" class="anchor" id="ferris-sweep-crab-broom"></a>Ferris Sweep (Crab Broom)</h2>
<p><img src="https://boardsource.xyz/cdn/shop/files/ferris_sweep_aluminum_space_grey_stack.jpg?v=1747750028&amp;width=4096" alt="crab broom" /></p>
<p>The <a href="https://www.boardsource.xyz/products/crab-broom">Crab Broom aluminum case</a> for the Ferris Sweep is a very nice looking setup with even <em>fewer</em> keys. I'm <a href="https://github.com/evantravers/zmk-config/compare/6a29008b60d1dd1012f790c321f3b4ff81bf58a0%E2%80%A6c7eefd3b609eb39f603d236e8888f8126784c9e1">playing with ZMK combos</a> to see if I can make myself go down to 3x5_2.</p>
<p>I have said that the only thing that would make me give up my Zen would be another Zen with a more pronounced curve… like the ergonomic curve on the Ferris. It really resembles my very comfy Atreus. I may end up buying on of these if I can budget the funds.</p>
<h2><a href="#totemist-executive-totem" aria-hidden="true" class="anchor" id="totemist-executive-totem"></a>Totemist Executive (Totem)</h2>
<p><img src="https://ergomech.store/web/image/product.image/217/image_1024/Totemist%20-%20Executive%20edition?unique=74f737e" alt="totemist" /></p>
<p>A <a href="https://ergomech.store/shop/totemist-executive-edition-513">new offering from ergomech.store</a> and based on the increasingly popular Totem keyboard, this looks like an amazing premium offering. Amazing footprint, aluminum case, fantastic features. Also the most expensive option here.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>There are a lot of wonderful makers in this space, each with their own take and specialty. I <em>know</em> I'm missing a bunch of options but these are two to which I've found myself emailing folks over the past few weeks.</p>
<p>Some other places to explore:</p>
<ul>
<li>My friend Jesse is launching <a href="https://twitter.com/1337keyboards">1337 keyboards</a> very soon. Cornes and ninjuni with <a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/1b21eih/nijuni/">lovely woodcut cases</a>.</li>
<li>The <a href="https://www.moergo.com/">Glove80</a> appears to be a strong contender for those who want a pre-built with a few more keys.</li>
<li>beekeeb makes an <a href="https://shop.beekeeb.com/product/presoldered-chocofi-split-keyboard/">interesting chocofi option</a>, just no aluminum cases that I can see.</li>
<li>keebio is about to release the <a href="https://keeb.io/products/chiri-ce-low-profile-choc-hotswap-split-ergonomic-keyboard?variant=40306328993886">chiri</a> which has an aluminum case and 3x5 spacing. Doesn't look wireless though.</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Recently: Obsidian</title>
       <link>http://evantravers.com/articles/2024/03/14/recently-obsidian/</link>
       <pubDate>Thu, 14 Mar 2024 15:39:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/03/14/recently-obsidian/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/03/graph.png"></p><p>I'm still using Obsidian. For a while it was the only icon on my iOS dock.</p>
<h2><a href="#bible-study" aria-hidden="true" class="anchor" id="bible-study"></a>Bible Study</h2>
<p><img src="https://images.evantravers.com/articles/2024/03/bible.png" alt="bible study" /></p>
<p>I use a downloaded and modified <a href="https://forum.obsidian.md/t/bible-study-in-obsidian-kit-including-the-bible-in-markdown/12503">markdown bible</a> as my main study bible. I have it split by chapter. That makes it very readable.</p>
<p>Paying for Obsidian Sync has really helped startup time on iOS… iCloud sync would &quot;unload&quot; all but the most recent hundred or so files.</p>
<p>I use <a href="https://github.com/TfTHacker/obsidian42-strange-new-worlds">Obsidian Strange New Worlds</a> to put counters on headers that have links, so I can see what verses have notes linked to them. Because I had run a script over my old files, much of my old sermon notes and journal entries are linked into my bible. I often come across things I wrote almost twenty years ago, and that's pretty cool.</p>
<h2><a href="#journaling" aria-hidden="true" class="anchor" id="journaling"></a>Journaling</h2>
<p><img src="https://images.evantravers.com/articles/2024/03/weekly.png" alt="weekly journal summary" /></p>
<p>I'm still doing the <a href="https://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/">wild ritual-based summarizing journaling system</a>. It's still a powerful force for change, especially the <a href="https://evantravers.com/articles/2024/03/28/obsidian-12wy-review-template/">12WY style reviews</a>.</p>
<p>The funnel of summaries is constructed to help me avoid staying in a bad pattern of behavior and easily see progress<sup class="footnote-ref"><a href="#fn-progress" id="fnref-progress" data-footnote-ref>1</a></sup>.</p>
<h2><a href="#note-making" aria-hidden="true" class="anchor" id="note-making"></a>Note Making</h2>
<figure>
    <img src='https://images.evantravers.com/articles/2024/03/evergreen.png'>
    <figcaption>
        An example of an Evergreen note, spawned from a booknote, featuring Excalidraw.
    </figcaption>
</figure>
<p>I'm doing a lot of thinking and writing in Obsidian. I've developed a personal taxonomy for my own system of atomic notes with <a href="https://evantravers.com/articles/2021/10/30/lifecycle-of-notes-my-implementation/">a lifecycle that hasn't changed much since my last post</a>:</p>
<ul>
<li>unnamed notes:
<ul>
<li>low confidence</li>
<li>contains at least one link</li>
<li>title based on ID</li>
</ul>
</li>
<li>Evergreen Notes:
<ul>
<li>contains strong fact or strong opinion</li>
<li>title based on a phrase that represents an &quot;API&quot; to that idea for my brain</li>
</ul>
</li>
</ul>
<p>I also have a couple special forms:</p>
<ul>
<li>Journal notes in a <code>/journal</code> folder.</li>
<li>book notes in a <code>/booknotes</code> folder… sometimes alongside the <a href="https://github.com/hadynz/obsidian-kindle-plugin">imported Kindle highlights</a>. (Usually a tweet-length summary, some takeaways, any really impactful ideas usually become Evergreen Notes.)</li>
<li>a work-related wiki that generally follows my <a href="https://evantravers.com/articles/2021/11/08/border-of-the-known/">border of the known theory</a>.</li>
<li>MOC-style notes that usually have a tag-style<sup class="footnote-ref"><a href="#fn-tag" id="fnref-tag" data-footnote-ref>2</a></sup> filename (i.e. <code>Journaling.md</code>) and a random list or query to link to other notes.</li>
<li>article/essay drafts in a <code>/writing</code> folder</li>
<li><a href="https://obsidian.md/canvas">Obsidian Canvas</a> usually in the form of a question that I'm exploring. (i.e. &quot;What do I think about generative AI?&quot; or &quot;What is a biblical response to burnout?&quot;)</li>
</ul>
<figure>
    <img src='https://images.evantravers.com/articles/2024/03/canvas.png'>
    <figcaption>
        <p>
            I am <b>really</b> loving Canvas. I need to write a separate post about it… but as a teaser: persistent spatial thinking is easier on canvas because you don't need to save a workspace or <a href='https://help.obsidian.md/User+interface/Tabs#Stack+tab+groups'>Andy-mode stacked tabs</a>. The act of drawing a line between two thoughts, and writing a label to describe why the two are related is a powerful creative act. More later.
        </p>
    </figcaption>
</figure>
<h2><a href="#writing" aria-hidden="true" class="anchor" id="writing"></a>Writing</h2>
<p><img src="https://images.evantravers.com/articles/2024/03/zen.png" alt="zen mode" /></p>
<p>I'm still using the same <a href="https://evantravers.com/articles/2022/08/30/writing-in-obsidian/">kanban system</a> for blog posts like this.</p>
<p>While I used to incubate a post or thought in <a href="https://evantravers.com/articles/tags/drafts-app/">Drafts.app</a> for at least 80% of the lifecycle, I'm pushing it faster into because I want to be able to cultivate it in the context of all the other notes.</p>
<h2><a href="#plugins" aria-hidden="true" class="anchor" id="plugins"></a>Plugins</h2>
<p>I use <a href="https://github.com/tgrosinger/leader-hotkeys-obsidian">Leader Hotkeys</a> to bind the exact same window management settings that I use in tmux.</p>
<p>As before mentioned I use <a href="https://github.com/TfTHacker/obsidian42-strange-new-worlds">Obsidian Strange New Worlds</a> to explore links between blocks, especially Bible verses.</p>
<p>My <a href="https://github.com/tgrosinger/leader-hotkeys-obsidian">crazy journaling system</a> uses <a href="https://github.com/liamcain/obsidian-periodic-notes">Periodic Notes</a>, <a href="https://github.com/phibr0/obsidian-charts">Charts</a>, and <a href="https://blacksmithgu.github.io/obsidian-dataview/">Dataview</a> to generate the graphs and summary charts.</p>
<p>Evergreen Notes and Booknotes often use <a href="https://github.com/zsviczian/obsidian-excalidraw-plugin">Excalidraw</a> to store and reproduce simple diagrams and illustrations. It's essentially a glorified SVG under the hood, so I have a lot of confidence that it won't disappear quickly. It doesn't take up much space, and it is easily trackable by source control. If it was mission critical I'd likely use image files.</p>
<p>I built a minimal writing mode for Obsidian using <a href="https://github.com/deathau/cm-typewriter-scroll-obsidian">Typewriter Scroll</a>, <a href="https://github.com/kepano/obsidian-hider">Hider</a>, and <a href="https://github.com/phibr0/obsidian-commander">Commander</a> just like the one I use in nvim. Essentially I use Commander to create a single command that triggers several commands. I type <code>&lt;leader&gt;-m</code> which calls a Macro from Commander that runs five commands:</p>
<ul>
<li>Hider: Toggle tab bar</li>
<li>Hider: Toggle app ribbon</li>
<li>Hider: Toggle status bar</li>
<li>Typewriter Scroll: Toggle Zen Mode On/Off</li>
<li>Typewriter Scroll: Toggle On/Off</li>
</ul>
<p>I just started using <a href="https://github.com/PKM-er/media-extended">Media Extended</a> to take notes on videos and lectures. It's early, but I'm excited. I can open a Youtube video in Obsidian and insert timestamped links in another note as I watch.</p>
<p>I use <a href="https://quickadd.obsidian.guide/docs/">QuickAdd</a> and <a href="https://github.com/SilentVoid13/Templater">Templater</a> to construct Booknotes with Google Books API. This is way buggier than <a href="https://evantravers.com/articles/2020/03/19/simple-markdown-zettelkasten-drafts-app/#book-notes">my previous method using Drafts</a>, I think mostly the issue is the .js file or plugin settings getting munged by Obsidian Sync. Unsure.</p>
<p>I use <a href="https://github.com/denolehov/obsidian-git">Git</a> to periodically backup to Github just in case, or before I make some drastic changes.</p>
<p>I use <a href="https://github.com/tgrosinger/advanced-tables-obsidian">Advanced Tables</a> on a few of my notes for research or adding up sums. Most notably I moved my wishlist out of Amazon and Pinterest and am now handling it locally.</p>
<p>If I need to any honest-to-goodness text editing, I'll drop into nvim to write on the plaintext file and use Obsidian as a glorified preview mode. Playing with using <a href="https://valentjn.github.io/ltex/">ltex</a> and <a href="https://github.com/artempyanykh/marksman/">Marksman</a> as LSP to drive wiki-style neovim usage instead of a core plugin system.</p>
<h2><a href="#wishes" aria-hidden="true" class="anchor" id="wishes"></a>Wishes</h2>
<p>I want to re-download and transform my markdown bible again, this time without hyphens (<code>-</code>) in the file name. Ideally a book + chapter would naturally match as an <a href="https://help.obsidian.md/Plugins/Outgoing+links">Unlinked Mention</a>. (i.e. &quot;2 Corinthians 5&quot;)</p>
<p>I want to smush my publishing/articles system and my thinking system together into one repo. Not sure how to do that yet without losing <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">the git history</a>.</p>
<p>I really want to move my contact cards for <a href="https://evantravers.com/articles/2024/02/02/digital-prayer-journal-using-contacts/">prayer journaling into Obsidian</a>. I wish there was a way to access and refer to them in plaintext notes and still sync to my phone.</p>
<p>I would like to start writing a book on journaling, maybe I should start a PARA-style folder inside <code>/writing</code>.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>That's it for the moment. Obsidian has become my most used app for thinking, absorbing my beloved Mindnode and Drafts into one big workbench.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-progress">
<p>We just went through annual reviews, and the quarterly summaries made it easy for me to find my story and searching my journal allowed me to find specific praise for those around me. <a href="#fnref-progress" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-tag">
<p>Many of the tags that I have previously used (i.e. &quot;prayer,&quot; &quot;keyboards,&quot; or &quot;selfhelp&quot;) turn into MOC notes now. As I start collecting/refactoring the notes under that tag I end up creating a note by the same name and starting to write about what interests me under that tag. I follow Nick Milo's pattern of linking to notes and as I start explain why they are linked to the central idea, I often start discovering new subwebs of thought or conversations that become essays like this one.</p>
<p>I still have a lot of tags to unwind into MOC this way, but I'm just doing it organically as my interests guide me. <a href="#fnref-tag" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The Sound of Silence</title>
       <link>http://evantravers.com/articles/2024/03/13/the-sound-of-silence/</link>
       <pubDate>Wed, 13 Mar 2024 21:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/03/13/the-sound-of-silence/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>My friend Grégoire posted a thoughtful piece reflecting on the rarity of silence.</p>
<blockquote>
<p>It's more prestigious to be a &quot;knowledge&quot; addict than to admit to wasting hours on social media or playing games.</p>
<p>But in reality, isn't it the same? And sometimes even worse?</p>
<p>Because we fool ourselves into thinking we are doing something meaningful and productive. We stay mildly engaged and don't even rip off the benefits entertainment provides.</p>
</blockquote>
<p>Ouch.</p>
<p>There is an interesting yet heinous incentive hidden in this: there was a time where a well-read person could have roughly studied everything, read all the important literature. Sometime in the 1940s the sheer quantity of knowledge surpassed a human lifetime… but leaving the unfair expectation intact.</p>
<p>Now we are in a strange world where you are expected to listen to every NPR podcast and keep track of every trending topic… but never read Anna Karenina.</p><p><a href="https://www.ggnotes.com/when-can-you-hear-yourself-think/" class="u-in-reply-to  is-reply">When Can You Hear Yourself Think? - www.ggnotes.com</a></p> ]]></description>
    </item>
    <item>
       <title>On Augmented Reality</title>
       <link>http://evantravers.com/articles/2024/03/07/on-augmented-reality/</link>
       <pubDate>Thu, 07 Mar 2024 17:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/03/07/on-augmented-reality/</guid>
       <description><![CDATA[ <p>Half a decade ago I tried on a first generation AR headset, an early <a href="https://en.wikipedia.org/wiki/Microsoft_HoloLens">Hololens</a> prototype. A low-resolution screen (the size of a deck of cards at arms length) floated in my view, revealing a holographic supercar. Leaning in and out towards the engine block you could block out everything but the tiny screen and believe for a second there was an object there that no one else could see… but the technology was too limited to really sell the illusion for more than a moment.</p>
<p>This year there are several competitive AR/VR headsets in the gaming/entertainment space, and Apple released the much-vaunted Vision Pro. While it is still early, we can be sure that there are lower-priced and better-featured Vision devices maturing within the unmarked rooms in Cupertino. We've been promised virtual reality for decades now. It remains to be seen whether this the moment.</p>
<p>I've been thinking about what this technology means as a designer, user, and as a father. Here are some random thoughts.</p>
<h2><a href="#just-add-magic" aria-hidden="true" class="anchor" id="just-add-magic"></a>Just Add Magic</h2>
<p>I'm excited for the design challenges that come with dimensionality. Since before <a href="https://evantravers.com/articles/2021/04/14/scifi-drives-the-future/#1968-the-mother-of-all-demos">the mother of all demos</a> designers have been emulating three dimensional reality with visual tricks: <a href="https://appleinsider.com/articles/22/08/23/what-apple-learned-from-skeuomorphism-and-why-it-still-matters">shadows</a>, hues, <a href="https://m3.material.io/foundations/interaction/states/state-layers">layers.</a>. We mock and <a href="https://www.figma.com/blog/how-we-built-spring-animations/">mimic physics</a> in order to help the user understand the purpose and affordances of the untouchable object hiding behind the sheet of glass.</p>
<p>Designers struggle to make things simple. They take an experience or object and attempt to add magic.</p>
<p>As an example, a designer making a computer solitaire game spends immense time crafting a 2d emulation of interacting with cards. He aims to convince the user that giving up the physical interactivity and engagement is worth computer system handling shuffling and the rules. Screens and mice instead of tables and laughs… but with the convenience of digital magic.</p>
<p>A virtual reality system simply hands you the cards. No persuasion needed. The designer then focuses on adding magic to the recognizable physical card system. We see something recognizable, but magical. Virtual objects can be familiar to the user yet surprise them by transcending normal physics and limitations:</p>
<ul>
<li>A rolodex that sorts by recency and transforms the avatar of person as you start the call.</li>
<li>Recipe books that filter to your guest's dietary restrictions.</li>
<li>Roads that emphasize your destination and preferred fast food joints.</li>
<li>Sticky notes on a wall accessible by teams across continents and timezones</li>
<li>Tools that are simple and easy to understand and use and yet take no weight to carry.<sup class="footnote-ref"><a href="#fn-bag" id="fnref-bag" data-footnote-ref>1</a></sup></li>
</ul>
<p>Imagine: instead of an amorphous screenslab your working tools appear to yourself and to others <em>as what they are</em>: a camera, a writing tablet, an actual stack of todo stickies, a deck of contact cards.</p>
<p>Spatial Computing/VR/AR pushes digital product design up out of two dimensions and into the existing design domains of Service Design or Environmental Design… <a href="https://evantravers.com/articles/2022/10/03/working-backwards-from-magic/">but with magic</a>.</p>
<p>It's exciting.</p>
<h2><a href="#where-there-is-illusion-people-change" aria-hidden="true" class="anchor" id="where-there-is-illusion-people-change"></a>Where There is Illusion, People Change.</h2>
<p>That same day I tried a (then) brand new Vive headset. After playing some games for a few minutes I took off the headset to hand to another person. The jarring &quot;teleportation&quot; sensation of being ripped from one world into the real was profound. It has to be experienced, not explained. It seems like <a href="https://www.youtube.com/watch?v=rilqFauUO9g#t=3m32s">newer headsets provide even more immersive</a> experiences.</p>
<p>Location is a powerful force on our behavioral systems. Having a device that can teleport us to another location is powerful tool for perhaps creating creative-only spaces… I easily see myself creating a &quot;location&quot; in which I only write. (I presently use sound and music to try and trick my brain, but I'd pay money for a virtual writing cabin.)</p>
<p>We aren't the first to realize this power.</p>
<p><em>The Diamond Age</em> by Neal Stephenson imagines a magic book given to young Nell. It can teach and guide her to become her full princess potential… and nudges her towards a particular <em>interesting</em> path of life. <em>Ender's Game</em> by Orson Scott Card imagines a similar device: a VR game so real that it teaches character and empathy. Both stories are hopeful. The tools are written by well-meaning people who want the best for the kids exposed to the technology.</p>
<p>I gotta wonder though… who gets to write the magic tools to teach my children? Who decides what is &quot;interesting&quot; in the Primer? Who decides what is good character and healthy empathy?</p>
<p>The same tools that we can use to create positive self-directed behavioral change can be wielded against us.</p>
<p>I have a hard time believing that the same corporations that make their money off of measuring what we click, what causes our scrolling to linger, what words we respond to with action, and measure their employees engagement, lines of code typed, will ignore this new pool of data. The whole apparatus of surveillance capitalism will benefit more than the headset user. We are placing a device on our heads that records our subconscious eye saccades and facial ticks… not metrics associated with our attention, but our <em>actual</em> attention.</p>
<p>We will likely be <a href="https://en.wikipedia.org/wiki/Ivan_Pavlov">Pavlov'd</a> in even more subtle and <a href="https://www.uxdesigninstitute.com/blog/what-are-dark-patterns-in-ux/">darker UX</a> ways than ever before. Having a strong code of ethics as a designer is going to be <em>very</em> important… we will have more power than ever before.</p>
<h2><a href="#outsourcing-personality" aria-hidden="true" class="anchor" id="outsourcing-personality"></a>Outsourcing Personality</h2>
<p>In Charlie Stross's novel <em>Accelerando</em><sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup>, a novel telling the story of the singularity, the tech-forward Manfred has his goggles ripped by a street thief named Jack. Manfred suddenly has no clue what he was about to do:</p>
<blockquote>
<p>&quot;I'm Manfred – Manfred. My memory. What's happened to my memory?&quot; Elderly Malaysian tourists point at him from the open top deck of a passing bus. He burns with a sense of horrified urgency. <em>I</em> <em>was</em> <em>going</em> <em>somewhere</em>, he recalls. <em>What</em> <em>was</em> <em>I</em> <em>doing?</em> It was amazingly important, he thinks, but he can't remember what exactly it was. He was going to see someone about – it's on the tip of his tongue –</p>
</blockquote>
<p>Manfred has outsourced so much of his thinking and memory to the computer on his face that his youthful assailant Jack is actually able to conduct his meeting for Manfred… transferring Manfred's goggles with their tasks and agents is basically transferring Manfred's goals and context to a new body.</p>
<blockquote>
<p>In a very real sense, the glasses <em>are</em> Manfred, regardless of the identity of the soft machine with its eyeballs behind the lenses. And it is a very puzzled Manfred who picks himself up and, with a curious vacancy in his head – except for a hesitant request for information about accessories for Russian army boots – dusts himself off and heads for his meeting on the other side of town.</p>
</blockquote>
<p>As someone who regularly writes my thoughts out in a digital format, who uses sophisticated calendars and task management to <a href="https://evantravers.com/articles/2021/06/21/review-do-more-better/">be a good steward</a>… this is a little terrifying. The futuristic ability to carry and see through our technology rather than just consult<sup class="footnote-ref"><a href="#fn-consult" id="fnref-consult" data-footnote-ref>3</a></sup> it is powerful and scary.</p>
<p>I'll be clutching <a href="https://evantravers.com/articles/tags/bullet-journal/">my bullet journal</a> a little more tightly.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I believe that virtual environments provide an opportunity for product designers and UX designers to stop designing screens and to focus on service design experiences. What is this person trying to do? Where are they standing? Who are they with? How could we enrich a physical tool with raw magic to make a person more focused, creative, and joyful in their work? It is a very exciting time to be interested in building tools to serve other people.</p>
<p>I believe that wearable technology with high fidelity of data on the human experience will enable profit-minded corporations to read and interpret emotion and subconscious action, combined with emotionally resonant and realistic experiences and memories<sup class="footnote-ref"><a href="#fn-illusion" id="fnref-illusion" data-footnote-ref>4</a></sup>. Unprecedented power to enrich and enslave. The ability to actually change what a person sees in the world.</p>
<p>It's a weird time to be in technology. Buckle up.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-bag">
<p>The magical item of <a href="http://dnd5e.wikidot.com/wondrous-items:bag-of-holding">Bag of Holding</a> in real world use. <a href="#fnref-bag" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p><em>Accelerando</em> is a brilliant book that requires some strong content warnings… so you are warned. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-consult">
<p>Consulting technology as an advisor feels like a relatively healthy mental model. I'm afraid I do much more than consult at this point, but maybe that's a north start to drive towards. <a href="#fnref-consult" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-illusion">
<p>There's a reason that in D&amp;D illusion magic is both under-appreciated and arguably the most powerful of all. Evil creatures in countless stories can shape-shift and change your perception of reality… Steven King's IT, JRR Tolkien's Anatar, Vampires, Demons, superheroes, The Matrix… <a href="#fnref-illusion" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Accessing devdocs.io from Hyper Hotkey</title>
       <link>http://evantravers.com/articles/2024/02/29/accessing-devdocs-io-from-hyper-hotkey/</link>
       <pubDate>Thu, 29 Feb 2024 10:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/29/accessing-devdocs-io-from-hyper-hotkey/</guid>
       <description><![CDATA[ <p>If you've ever sat in a crowded Starbucks, waiting for the burdened wifi to finally deliver the MDN flex container docs, raise your hand. 🤚</p>
<p>For years I have used <a href="https://kapeli.com/dash">Dash.app by Kapeli</a> to access documentation quickly offline. It is a <em>fantastic</em> app and if you spend a lot of time programming on a Mac I really recommend it. While I use it often for referring to the documentation, a surprisingly useful feature is to quickly copy the URL to documentation: I launch it, type <code>css:flex</code> and then press <code>⌘⌥-B</code> and suddenly <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/flex_value">the right link</a> is in my clipboard, ready to be sent to someone on slack or pasted into the references of a git commit.</p>
<p>I've been doing a bit more coding on linux and windows, and I missed this functionality. Fortunately <a href="https://devdocs.io/">devdocs.io</a> provides a 95% as good experience in every browser and cross-platform.</p>
<p>I made a <a href="https://github.com/evantravers/dotfiles/commit/b7e7a221747c77d6eb72898b971afc4b84087a3a">quick change to my hammerspoon setup</a>. The <a href="https://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper Key</a> I had associated with Dash now switches to the devdocs.io tab or opens it if nothing is open.</p>
<p>This is a great argument for having your own &quot;shortcut layer:&quot; if you want to change which tool you use you can move it without losing the muscle memory.</p> ]]></description>
    </item>
    <item>
       <title>Git Spelunking to Avoid Linkrot</title>
       <link>http://evantravers.com/articles/2024/02/20/git-spelunking-to-avoid-linkrot/</link>
       <pubDate>Tue, 20 Feb 2024 09:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/20/git-spelunking-to-avoid-linkrot/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I have been very inconsistent with using github's permalinks in my blog posts.</p>
<p>While emailing an old post to my new friend Justin I found that the links were to the most current version of my hammerspoon config… which has long since changed. Doh!</p>
<p>I'm glad that I usually embed pertinent code into the blog post… that helps a lot to keep the content useful long into the future.</p>
<p>But anyway!</p>
<p>I started to try to find a regex that would represent GitHub links to my own repos that weren't permalinks.  I got as far as <code>rg --pcre2 &quot;github.com/evantravers/\w+/(?!(blob|commit|compare))&quot;</code> but I realized I was quickly in the land of negative lookahead, and that's too much regex for me. I wound up just loading the results of <code>github.com/evantravers</code> into my nvim quickfix list via Telescope and working through it manually.</p>
<p>Thanks to stack overflow I found a <a href="https://stackoverflow.com/questions/6990484/how-to-checkout-in-git-by-date">git snippet for checking out a git repo at a certain time</a>. Using this I could time-travel in my dotfiles or hammerspoon-config repo back to the hour that I posted the blog post and grab the git commit SHA. By running <code>%s,/master/,&lt;new sha&gt;,g</code> in vim I replaced all the tree references with the correct point in the history, and hopefully the timeline has been saved.</p>
<p>You're welcome, Doc Brown.</p> ]]></description>
    </item>
    <item>
       <title>Configuring Yabai for Focus</title>
       <link>http://evantravers.com/articles/2024/02/15/yabai-tiling-window-management-for-osx/</link>
       <pubDate>Thu, 15 Feb 2024 16:48:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/15/yabai-tiling-window-management-for-osx/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/02/yabai.png"></p><p>I've been aware of Yabai for a long time… but every time I gave it a whirl I was immediately greeted with an unusable spew of tiny windows. Frustrated I'd uninstall and forget about it.</p>
<p>This past month I looped back around to &quot;maybe I should try that tiling window manager&quot; again… and this time it feels like it's going to stick.</p>
<h2><a href="#what-and-why" aria-hidden="true" class="anchor" id="what-and-why"></a>What and Why</h2>
<p><a href="https://github.com/koekeishiya/yabai">Yabai</a> is an OSX-only tiling window manager like i3wm. Where a normal window system has an unorganized stack of windows arranged primarily by the mouse, a tiling window manager automatically arranges your windows to maximize the screen real estate.</p>
<p>Why would you want a program to arrange your windows for you?</p>
<ul>
<li>create recognizable workspaces so that your brain is prompted to start working on a task</li>
<li>do less small arranging of windows in common tasks and workflows</li>
</ul>
<p>I have already done a fair amount of thinking and programming around this… I wrote  <a href="https://github.com/evantravers/movewindows.spoon">a hammerspoon clone of spectacle or moom</a> to efficiently move windows with the keyboard. I've also written a <a href="https://github.com/evantravers/autolayout.spoon">rule-based autolayout program</a> a couple of times to set up workspaces based on system events… and <a href="https://github.com/evantravers/split.spoon">one just for splitting a screen in two</a>.</p>
<p>Within a week, Yabai has been able to supplant and exceed all of those. 🤷</p>
<h2><a href="#yabai" aria-hidden="true" class="anchor" id="yabai"></a>Yabai</h2>
<p>Yabai has a solid hierarchy: each <code>display</code> can have one or more <code>spaces</code> containing <code>window</code>s. When <code>layout</code> is set to <code>bsp</code>, it treats the <code>space</code> as a tree… each node can be split into two. You can <code>swap</code> the position of two windows, or <code>warp</code> a window into a tree node, then creating a new tree of two in a split.</p>
<p>Yabai has a unique design decision: the config file is just a shell script of yabai API commands. This means that reconfiguring the system is possible on the fly in lots of ways… you can have another program rewrite the config file and reload it, or just issue commands to the running instance using <code>yabai -m &lt;command&gt;</code>. It's clever and simple.</p>
<h2><a href="#recommendations" aria-hidden="true" class="anchor" id="recommendations"></a>Recommendations</h2>
<p>If you are going to try a tiling window manager you must both configure it to work with you and change your computer usage to match the tool's. If you have been in the habit of leaving unused windows open or unhidden (raises hand) this doesn't work well.</p>
<p>I recommend closing all your windows and starting with just one… when I first ran yabai on a pile of windows it was confusing and overwhelming. When I closed all windows but one and then started to work… its promise as a helpful focus tool started to shine.</p>
<p>I recommend using the following starter settings in your <code>~/.yabairc</code>:</p>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># use the &quot;tiled&quot; layout that we want to try</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># (Default: float, which is &quot;normal&quot; window behavior.)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bsp</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># ctrl is the most useful mouse modifier for me…</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I don&#39;t have fn on my mech keyboards usually.</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># (Default: fn)</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mouse_modifier</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ctrl</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># when you drop a window on another window, stack the two.</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># (Default: swap)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mouse_drop_action</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stack</span>
</div></code></pre>
<p>If you ran yabai, it's now running and managing your windows! You can hold your <code>mouse_modifier</code> (now <code>ctrl</code>) and click <em>anywhere</em> on the window to move it. If you move it onto the 20% edge of a window, it'll perform a &quot;warp&quot; and split with that window. If you drag it onto the 20% center of the window, where it used to <code>swap</code> it'll now stack the two windows and they move together until you do a warp or close one of them.</p>
<h3><a href="#stacks" aria-hidden="true" class="anchor" id="stacks"></a>Stacks</h3>
<p>Stacking is the feature that made yabai usable for me. Stacking (just as it sounds) groups any number of <code>window</code>s in the same node of the tree together… and you can toggle back and forth between them as you will. There presently isn't a way to tell what is in the stack, but there is a <a href="https://github.com/AdamWagner/stackline">hammerspoon repo for StackLine</a> which is very lovely.</p>
<p>You can also set the entire <code>layout</code> to <code>stack</code>, this makes the space behave like an iphone, all apps are full screen and no splitting. I'll sometimes do this when I'm juggling a lot or I just want to focus on one thing at a time… like when writing this essay.</p>
<p>I also use stacks to group my terminal and browser when coding. New windows pop up to the side, but my main focus area stays the same. I've also stacked Microsoft Teams windows so they don't get lost, or a couple different chat apps (Signal, iMessage, etc.) so that they occupy the same place.</p>
<p>Stacking isn't really documented in the yabai wiki, but it is in the asciidoc/man-page, and the main source is <a href="https://github.com/koekeishiya/yabai/issues/203">the conversation on this pull request</a>. I hope to contribute some information to the wiki or readme over time.</p>
<h3><a href="#keyboard-shortcuts" aria-hidden="true" class="anchor" id="keyboard-shortcuts"></a>Keyboard Shortcuts</h3>
<p>If you just want to use your mouse then you are set. Yabai's mouse movements are very intuitive.</p>
<p>I have a set of keyboard shortcuts I've been using for years that are heavily in my muscle memory. I use a <a href="https://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper Key in Hammerspoon</a> to <a href="https://evantravers.com/articles/2019/04/03/my-keyboard-setup/#hyper-hammerspoon">launch and switch applications</a> as well as move and arrange windows, so I <a href="https://github.com/evantravers/dotfiles/blob/fde5333d673e5d0d74805739e2d4386fbf39b4c2/config/hammerspoon/init.lua#L60-L144">modified my existing module to control yabai</a>.</p>
<p>The author of yabai has another program just for sending commands using keyboard shortcuts called <a href="https://github.com/koekeishiya/skhd">skhd</a>. If you don't already have a tool for launching/changing apps or sending commands to yabai you should try that.</p>
<p>Here are binds I'm finding most helpful. (I'm going to use <code>◊</code> to mean the <a href="https://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper Key</a>.)</p>
<div class="admonition">
    <div class="admonition__title">Keyboard Shortcuts</div>
    <dl>
        <dt><strong>◊+M</strong>:</dt>
        <dd>
            a leader key that enters the movement modal…
            <dl>
                <dt><strong>1</strong>:</dt>
                <dd>
                <code>yabai -m window --swap first</code></br>
                takes the focused window and swaps it with the “first” window in the tree… effectively putting it in the “main” location on the top left of the screen.
                </dd>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--toggle</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zoom-fullscreen</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/br</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">maintains</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">it’s</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">“virtual”</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">position</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tree,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">but</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zooms</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">full</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen.</span>
</div><div class="line" data-line="5">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">V</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="8">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="9">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--mirror</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">y-axis</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/br</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="10">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mirror</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vertically.</span>
</div><div class="line" data-line="11">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">X</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="14">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="15">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--toggle</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/br</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="16">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">swap</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vertical/horizontal</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tree.</span>
</div><div class="line" data-line="17">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">T</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/strong</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dt</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="20">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dd</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="21">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--ratio</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.6</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/code</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/br</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="22">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span>&#39;s split ratio to 2/3rds of the tree.
</div><div class="line" data-line="23">            &lt;/dd&gt;
</div><div class="line" data-line="24">
</div><div class="line" data-line="25">            &lt;dt&gt;&lt;strong&gt;S&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="26">            &lt;dd&gt;
</div><div class="line" data-line="27">            &lt;code&gt;yabai -m window --stack mouse&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="28">            focused window stacks itself with the window currently under the mouse cursor.
</div><div class="line" data-line="29">            &lt;/dd&gt;
</div><div class="line" data-line="30">
</div><div class="line" data-line="31">            &lt;dt&gt;&lt;strong&gt;⇧-B&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="32">            &lt;dd&gt;
</div><div class="line" data-line="33">            &lt;code&gt;yabai -m space --layout stack&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="34">            focused space (current monitor) handles all windows as a stack.
</div><div class="line" data-line="35">            &lt;/dd&gt;
</div><div class="line" data-line="36">
</div><div class="line" data-line="37">            &lt;dt&gt;&lt;strong&gt;B&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="38">            &lt;dd&gt;
</div><div class="line" data-line="39">            &lt;code&gt;yabai -m space --layout bsp&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="40">            focused space handles all windows as tiles.
</div><div class="line" data-line="41">            &lt;/dd&gt;
</div><div class="line" data-line="42">
</div><div class="line" data-line="43">            &lt;dt&gt;&lt;strong&gt;H/J/K/L&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="44">            &lt;dd&gt;
</div><div class="line" data-line="45">            &lt;code&gt;yabai -m window --swap west/south/north/east&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="46">            focused window swaps position using vim-directions.
</div><div class="line" data-line="47">            &lt;/dd&gt;
</div><div class="line" data-line="48">
</div><div class="line" data-line="49">            &lt;dt&gt;&lt;strong&gt;⌥-H/J/K/L&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="50">            &lt;dd&gt;
</div><div class="line" data-line="51">            &lt;code&gt;yabai -m window --warp west/south/north/east&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="52">            focused window warps position using vim-directions.
</div><div class="line" data-line="53">            &lt;/dd&gt;
</div><div class="line" data-line="54">
</div><div class="line" data-line="55">            &lt;dt&gt;&lt;strong&gt;⇧-H/L&lt;/strong&gt;:&lt;/dt&gt;
</div><div class="line" data-line="56">            &lt;dd&gt;
</div><div class="line" data-line="57">            &lt;code&gt;yabai -m window --display west/east&lt;/code&gt;&lt;/br&gt;
</div><div class="line" data-line="58">            focused window shifts to another space using vim-directions.
</div><div class="line" data-line="59">            &lt;/dd&gt;
</div><div class="line" data-line="60">        &lt;/dl&gt;
</div><div class="line" data-line="61">    &lt;/dd&gt;
</div><div class="line" data-line="62">
</div><div class="line" data-line="63">&lt;/dl&gt;
</div></code></pre>
</div>
<p>If you want to see <a href="https://github.com/evantravers/dotfiles/blob/c1d4d184194a75f065f97357ad656b0eece5126f/config/hammerspoon/init.lua#L60-L144">the hammerspoon code it's here</a>, thanks to @dmitriiminaev on github for <a href="https://github.com/dmitriiminaev/Hammerspoon-Yabai/blob/master/.hammerspoon/yabai.lua">the hs.task implementation</a>.</p>
<p>I have rules in my .yabairc  for programs that don't work well with yabai:</p>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rule</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--add</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;System Settings&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">manage=off</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rule</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--add</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Timery&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">manage=off</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rule</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--add</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Cardhop&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">manage=off</span>
</div></code></pre>
<p>And a few applications that I want to default open on my laptop monitor (if present):</p>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rule</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--add</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Fantastical&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">display=east</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yabai</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-m</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rule</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--add</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;OBS&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">display=east</span>
</div></code></pre>
<h2><a href="#daily-usage" aria-hidden="true" class="anchor" id="daily-usage"></a>Daily Usage</h2>
<p>I care about focus: spending my time on the main thing as much as possible, and not being distracted. Yabai has become my little window butler… when something other than my main window arrives, yabai sidles up with the window on a plate, ready for my attention.</p>
<p>Most of the time I'm focused on a single task and using one program to accomplish this: writing in Obsidian, designing in Figma, having a conversation in Teams. If I launch a browser to look up some documentation or to find a previous blog post, it opens in the previously defined split until I dismiss it.<sup class="footnote-ref"><a href="#fn-resize" id="fnref-resize" data-footnote-ref>1</a></sup></p>
<p>Opening a window to grab a link from my blog, research a topic, or send a quick message and then closing/hiding<sup class="footnote-ref"><a href="#fn-hide" id="fnref-hide" data-footnote-ref>2</a></sup> it has become second nature. If there is too much going on at once, I can always disable BSP entirely and use the <code>stack</code> <code>layout</code> to emulate my previous &quot;everything is full screen&quot; setup. It's been great. While I have a lot of tools to move and position windows… I find that I'm using them <em>much</em> less.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I'll be the first to admit that I change my digital environment easily and often… but I do think that yabai has added quite a bit to my daily workflow. 90% of the time new windows open logically in a useful place, and if I want to create some order out of the chaos it's a few natural mouse swipes away. A logical and simple scripting API means that more complex and interesting setups are possible (I'm thinking about detecting a video call window and setting some new <code>yabai -m rule</code> to match) but for now it just works.</p>
<p>Related:</p>
<ul>
<li><a href="https://bryce-s.com/yabai/">Bryce's writeup has great gifs and information I didn't know</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-resize">
<p><strike>One complaint I have is that I haven't been able to resize a window just using the <code>yabai -m</code> commands… I can hold <code>^</code> and right-click drag a window to resize it fast, but I would really like to be able to easily say &quot;I want my main window to be 2/3 of the screen.&quot; Someday soon.</strike> <a href="https://github.com/evantravers/dotfiles/commit/d3f2dc3e18d71f51a46853402fc779ab17102116">I have been able to do this</a>. I found <a href="https://github.com/koekeishiya/yabai/blob/af9d4cd3a96a7cfa02df1ff61d89414f5259b06e/doc/yabai.asciidoc?plain=1#L345-L346">the <code>window --ratio</code> options in the asciidoc</a>, that works wonderfully. <a href="#fnref-resize" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-hide">
<p>I may override the default OSX hiding animation with <code>hs.window():hide()</code> to speed that up! <a href="#fnref-hide" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>One Must Imagine Sisyphus Overwhelmed</title>
       <link>http://evantravers.com/articles/2024/02/12/one-must-imagine-sisyphus-overwhelmed/</link>
       <pubDate>Mon, 12 Feb 2024 11:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/12/one-must-imagine-sisyphus-overwhelmed/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>&quot;What's going on?&quot; My wife asked me last night. &quot;I'm not sure&quot; I replied. &quot;I can't put my finger on it, I feel like I'm forgetting something.&quot;</p>
<p>I feel asleep still not sure, roused too often by the midnight auditory hallucination of my alarm.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I get this way when I have too many irons in the fire… too many conversations, too many side projects, too many drafts brewing in my digital garden.</p>
<p>Of course, writing helps. So this morning I start a list… it's healthy, right? Admitting I get moody because I'm a mortal creature without the capability to fix everything I see. Remembering I'm not the creator of the cosmos. It won't be a todo list, it'll be a confession!</p>
<p>Between the moment I woke up and put on my jacket and grabbed my pack, here are the things that flitted through my awareness:</p>
<ul>
<li>that closet that's 75% been cataloged and reorganized, but I had to shove it all back in again and now it's 150% worse</li>
<li>Bushes that need to be cut back off my fence</li>
<li>A self hosted system for storing and syncing contacts because Google has failed me for the last time</li>
<li>a season of heavy change at the day job</li>
<li>A set of scripts and markdown queries to emulate Things in Obsidian Tasks</li>
<li>A doctors appointment for a foot injury that won't heal</li>
<li>The infernal blog transition that I've been piddling on for years</li>
<li>a fourth rewrite of my nix dotfiles<sup class="footnote-ref"><a href="#fn-dots" id="fnref-dots" data-footnote-ref>1</a></sup></li>
<li>essays on:
<ul>
<li>UX and Sin in VR/AR</li>
<li>my position on AI, surveillance capitalism, and the trust apocalypse</li>
<li>Defrauding and the ethics of LLMs</li>
<li>a Biblical position on burnout</li>
<li>Window management and Yabai</li>
<li>My current Obsidian usage</li>
<li>The miracle of nix modules</li>
<li>Half a dozen scraps of thought around creativity systems</li>
</ul>
</li>
<li>The outline of a book on journaling</li>
<li>taxes</li>
</ul>
<p>It's too much!</p>
<p>I am <a href="https://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">once again Sisyphus</a>, and you must imagine I am not happy.</p>
<p>Two things I must do… I have to wrangle all the things floating around in my head and put them somewhere safe. Then I need to ruthlessly cut this list.</p>
<p>And this little article is a start.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-dots">
<p>I did knock this over this evening: <a href="https://github.com/evantravers/dotfiles/blob/fde5333d673e5d0d74805739e2d4386fbf39b4c2/flake.nix">https://github.com/evantravers/dotfiles/blob/fde5333d673e5d0d74805739e2d4386fbf39b4c2/flake.nix</a> <a href="#fnref-dots" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Switching to nix-darwin and Flakes</title>
       <link>http://evantravers.com/articles/2024/02/06/switching-to-nix-darwin-and-flakes/</link>
       <pubDate>Tue, 06 Feb 2024 12:14:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/06/switching-to-nix-darwin-and-flakes/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2024/02/nix-darwin.jpeg"></p><p>Since my last post about <a href="https://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/">using Nix to configure my dotfiles</a>, I've since moved to using it for <em>everything</em>.<sup class="footnote-ref"><a href="#fn-cult" id="fnref-cult" data-footnote-ref>1</a></sup> (Sort of.)</p>
<p>In my pursuit of treating my computer as <a href="https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/">cattle not as a pet</a> I have had a series of increasingly complicated systems to help me set up a new computer after a reset<sup class="footnote-ref"><a href="#fn-reset" id="fnref-reset" data-footnote-ref>2</a></sup>. The earliest I can find is over a decade old… a list of tools I use so that I wouldn't lose it.<sup class="footnote-ref"><a href="#fn-list" id="fnref-list" data-footnote-ref>3</a></sup> Later on I had a git repo of common config files and a complicated README on how to set it up. As of last year, that had progressed to a combination of <code>brew bundle</code> a <a href="https://github.com/evantravers/dotfiles/blob/before-nix/Brewfile">Brewfile</a> to install applications and dependencies, <a href="https://github.com/evantravers/dotfiles/blob/before-nix/macos">macos.sh</a> to set up common settings, and a <a href="https://github.com/evantravers/dotfiles/blob/before-nix/Makefile"><code>Makefile</code></a> to run it all. (You can see <a href="https://github.com/evantravers/dotfiles/tree/before-nix">that version in git history</a>.)</p>
<p>After moving my dotfiles to nix and learning some more… I wanted to try <a href="https://daiderd.com/nix-darwin/">nix-darwin</a>. nix-darwin is a module system for configuring a Mac system.</p>
<p>Because I had embraced home-manager first, I had to do some refactoring.</p>
<ol>
<li>I wrote a nix-darwin configuration first… got that working.</li>
<li>I then refactored my home-manager to not be the &quot;entry point&quot; into my nix world.</li>
<li>I then wrote nix-darwin and nixos config to drive home-manager, so that it's a top-down configuration.</li>
</ol>
<p>It took some mangling, but it feels great. For the first time in years, if I type <code>brew</code> into my mac terminal it doesn't know what <code>brew</code> is. (It's actually still there, but more on that later)</p>
<h2><a href="#nix-darwin" aria-hidden="true" class="anchor" id="nix-darwin"></a>nix-darwin</h2>
<p>At first I just used the module in the default location of the configuration file until I got it working. Eventually I rewrote it without host-specific values and used it in the flake, which I'll show in a minute.</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> … <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>:
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">environment</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">systemPackages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Use a custom configuration.nix location.</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">environment</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">darwinConfig</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;$HOME/src/github.com/evantravers/dotfiles/nix-darwin-configuration&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Auto upgrade nix package and the daemon service.</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">services</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix-daemon</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">package</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;extra-experimental-features&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;nix-command&quot;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;flakes&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Create /etc/zshrc that loads the nix-darwin environment.</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">programs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gnupg</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">agent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="24">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zsh</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># default shell on catalina</span>
</div><div class="line" data-line="25">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="26">
</div><div class="line" data-line="27">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Used for backwards compatibility, please read the changelog before changing.</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># $ darwin-rebuild changelog</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stateVersion</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">4</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="30">
</div><div class="line" data-line="31">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Install fonts</span>
</div><div class="line" data-line="32">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fonts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fontDir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="33">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fonts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fonts</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="34">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">monaspace</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="36">
</div><div class="line" data-line="37">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Use homebrew to install casks and Mac App Store apps</span>
</div><div class="line" data-line="38">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">homebrew</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="39">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="40">
</div><div class="line" data-line="41">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">casks</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="42">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;1password&quot;</span>
</div><div class="line" data-line="43">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;bartender&quot;</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;brave-browser&quot;</span>
</div><div class="line" data-line="45">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;fantastical&quot;</span>
</div><div class="line" data-line="46">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;firefox&quot;</span>
</div><div class="line" data-line="47">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;hammerspoon&quot;</span>
</div><div class="line" data-line="48">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;karabiner-elements&quot;</span>
</div><div class="line" data-line="49">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;obsidian&quot;</span>
</div><div class="line" data-line="50">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;raycast&quot;</span>
</div><div class="line" data-line="51">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;soundsource&quot;</span>
</div><div class="line" data-line="52">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;wezterm&quot;</span>
</div><div class="line" data-line="53">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="54">
</div><div class="line" data-line="55">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">masApps</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="56">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Drafts&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1435957248</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="57">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Reeder&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1529448980</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="58">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">904280696</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="59">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Timery&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1425368544</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="60">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="61">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="62">
</div><div class="line" data-line="63">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># set some OSX preferences that I always end up hunting down and changing.</span>
</div><div class="line" data-line="64">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">defaults</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="65">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># minimal dock</span>
</div><div class="line" data-line="66">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dock</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="67">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autohide</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="68">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">orientation</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;left&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="69">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show-process-indicators</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="70">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show-recents</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="71">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">static-only</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="72">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="73">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># a finder that tells me what I want to know and lets me work</span>
</div><div class="line" data-line="74">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">finder</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="75">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AppleShowAllExtensions</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="76">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ShowPathbar</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="77">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FXEnableExtensionChangeWarning</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="78">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="79">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Tab between form controls and F-row that behaves as F1-F12</span>
</div><div class="line" data-line="80">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">NSGlobalDomain</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="81">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">AppleKeyboardUIMode</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="82">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;com.apple.keyboard.fnState&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="83">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="84">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="85"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>(source: <a href="https://github.com/evantravers/dotfiles/blob/4e9bc7a25ebc73389130567ab46b9cab78b5783e/nix-darwin-configuration/darwin.nix">darwin.nix</a>)</p>
<p>Pretty soon I could run <code>darwin-rebuild switch</code> and it'd flow right on through!</p>
<h2><a href="#flakes" aria-hidden="true" class="anchor" id="flakes"></a>Flakes</h2>
<p>I made my jump to nix-darwin a little bit more complicated by deciding to go all in on <a href="https://nixos.wiki/wiki/Flakes">nix-flakes</a>. I made this decision because I wanted the reproducability of a flake for configuring a computer. Without flakes the configuration would be at the mercy of the host system's channel configuration… and I want to be a little more careful. (and I want to learn about flakes!)</p>
<p>I used the flake generators from each project, then I modified heavily from examples I found online. (Searching google for &quot;nix-darwin examples&quot; is a lot less helpful than searching github's code search, FYI!)</p>
<p>The final flake (simplified and over-documented) looks something like this:</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Evan&#39;s darwin system&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I pinned darwin to a particular release</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;github:NixOS/nixpkgs/nixpkgs-23.11-darwin&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I then pinned home-manager so that it would not issue the mismatch error</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;github:nix-community/home-manager/release-23.11&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">follows</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;nixpkgs&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix-darwin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;github:LnL7/nix-darwin&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix-darwin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">follows</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;nixpkgs&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">outputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span>@<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix-darwin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>: <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">darwinConfigurations</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I have couple computers, but one config per</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Evans-MacBook-Pro&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nix-darwin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lib</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">darwinSystem</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="18">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;x86_64-darwin&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># alternatively &quot;aarch64-darwin&quot;</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">modules</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="20">          <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># include the darwin module</span>
</div><div class="line" data-line="21">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./darwin.nix</span>
</div><div class="line" data-line="22">          <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># setup home-manager</span>
</div><div class="line" data-line="23">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">darwinModules</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span>
</div><div class="line" data-line="24">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="25">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home-manager</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="26">              <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># include the home-manager module</span>
</div><div class="line" data-line="27">              <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evan</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">../home-manager/home.nix</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">users</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">evan</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">home</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/Users/evan&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="30">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="31">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="32">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">specialArgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inherit</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="33">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="34">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="36"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>(source: <a href="https://github.com/evantravers/dotfiles/blob/4e9bc7a25ebc73389130567ab46b9cab78b5783e/nix-darwin-configuration/flake.nix">flake.nix</a>)</p>
<p>I did some folder re-arranging. A year ago I <a href="https://github.com/evantravers/dotfiles/blob/before-nix/">had a series of folders</a> that corresponded to the programs and XDG paths I was configuring. I carried forward that mentality to the first version of nix when I used home-manager, where I symlinked the whole folder to <code>~/.config/home-manager</code>. Now, I just run the nix command against the folder in my <code>~/src</code> directory. No symlinks required.</p>
<p>I believe there is a way to <a href="https://determinate.systems/posts/nix-run">run a flake from a git repo with no installation steps</a>. It's possible that I could run something akin to <code>nix run github:evantravers/dotfiles?dir=nix-darwin-configuration</code>… but I need to do some research on that first.<sup class="footnote-ref"><a href="#fn-github" id="fnref-github" data-footnote-ref>4</a></sup> It's exciting though!</p>
<p>Besides the horde of <code>;</code> and <code>&lbrace;&rbrace;: &lbrace;&rbrace;</code> problems (read: my lack of experience with the language forms,) I ran into one issue where I needed to specify <code>users.users.&lt;name&gt;.home</code> because of a <a href="https://github.com/nix-community/home-manager/issues/4026">home-manager bug</a>.</p>
<h2><a href="#homebrew-for-apps" aria-hidden="true" class="anchor" id="homebrew-for-apps"></a>Homebrew for Apps</h2>
<p>I wrestled back and forth with this. @teoljungberg <a href="https://github.com/teoljungberg/dotfiles/blob/ffde67e8b7f650fbf1e882d2e6c699fd9ba428f6/nixpkgs/hammerspoon.nix">demo'd how to download hammerspoon from the online release</a>, but I opted for what @jonathandion did and <a href="https://github.com/jonathandion/nix-config/blob/1fde611300cf0c39664a70c544c7bb7375c3b496/darwin-configuration.nix#L42">used homebrew to install hammerspoon</a> I may write a couple of such expressions to get some of my favorite applications that neither have casks nor are on the Mac App Store, <a href="https://www.homerow.app/">Homerow</a> and <a href="https://goodsnooze.gumroad.com/l/macwhisper">MacWhisper</a> for example.</p>
<p>Homebrew is no longer in my path... but it is a <em>very</em> convenient way to get certain packages, and it'll probably stay that way. I will <em>not</em> use it to get things that home-manager can manage though. Mac-specific packages.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I did a very similar process to configure nixos as a flake, and now I have a single home-manager system that is shared equally between the two OS configurations.</p>
<p>At the moment, home-manager isn't standalone anymore. I can't run it without running a <code>darwin-rebuild switch</code> or <code>nixos-rebuild switch</code> command. That's not bugging me, but it does seem kind of weird that the only way to get <a href="https://github.com/roosta/tmux-fuzzback">a new tmux plugin</a> is to rebuild the universe from first principles.</p>
<p>It also feels very weird to no longer structure my repo based on <code>stow</code>/symlink assumptions, but it dodges <em>so</em> many headaches and simplifies rolling back changes.</p>
<p>I also want to mess with home-manager apparently has <a href="https://mipmip.github.io/home-manager-option-search/?query=accounts">options for setting up calendars and emails</a>… I want to know all about that… but I may need some extra privacy for those.</p>
<p>I'm sure that the first time I set up a new mac/PC from scratch I'll revisit this and have to change a few things, but I'm excited to have something so robust to lean on next time.</p>
<h3><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References:</h3>
<ul>
<li><a href="https://daiderd.com/nix-darwin/manual/index.html">Nix Darwin Manual</a> and <a href="https://daiderd.com/nix-darwin/manual/index.html">Options Documentation</a></li>
<li><a href="https://github.com/thexyno/nixos-config">@thexyno's configuration</a> had a lot of useful tricks.</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-cult">
<p>There's a lot of buzz about nix on the orange site and red site… and people have accurately nix a cult. I think it is suffering from <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/WhenAllYouHaveIsAHammer">&quot;new hammer&quot;</a> problems. I am persuaded that it's the best stab at solving some common problems I have in computing… so I'm drinking the koolaid. <a href="#fnref-cult" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-reset">
<p>A reset could be a catastrophic hardware failure, a new device being issued by the company, or me just munging up my paths and <code>brew update</code> so bad that it's faster to start from scratch than undo my foolishness. Ask me how I know. <a href="#fnref-reset" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-list">
<p>I <em>know</em> you are curious… <a href="https://gist.github.com/evantravers/545f9bf594cb3c79f15d14322bceaf32">here's my list from many years ago</a>. This was pre-vim, so I'm thinking ~2009? I think Square was new, and I was an early adopter. <a href="#fnref-list" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-github">
<p>I think I need to make a master flake.nix to route the command to the right place. <a href="https://github.com/nmasur/dotfiles/blob/master/flake.nix">@nmasur has an example</a>. <a href="#fnref-github" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>we&#39;ve found it folks: mcmansion heaven</title>
       <link>http://evantravers.com/articles/2024/02/02/we-ve-found-it-folks-mcmansion-heaven/</link>
       <pubDate>Fri, 02 Feb 2024 12:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/02/we-ve-found-it-folks-mcmansion-heaven/</guid>
       <description><![CDATA[ <blockquote>
<p>It is rare to find a house that has everything. A house that wills itself into Postmodernism yet remains unable to let go of the kookiest moments of the prior zeitgeist, the Bruce Goffs and Earthships, the commune houses built from car windshields, the seventies moments of psychedelic hippie fracture. It is everything. It has everything. It is theme park, it is High Tech. It is Renaissance (in the San Antonio Riverwalk sense of the word.) It is medieval. It is maybe the greatest pastiche to sucker itself to the side of a mountain, perilously overlooking a large body of water. Look at it. Just look.</p>
</blockquote>
<p>McMansion Hell is always one of my most-chuckled-over blogs, and this post is no exception. What a wild residence. What an amazing sequence of decisions.</p><p><a href="https://mcmansionhell.com/post/741171396971053056/weve-found-it-folks-mcmansion-heaven" class="u-in-reply-to  is-reply">we've found it folks: mcmansion heaven | McMansion Hell - mcmansionhell.com</a></p> ]]></description>
    </item>
    <item>
       <title>Digital Prayer Journal using Contacts</title>
       <link>http://evantravers.com/articles/2024/02/02/digital-prayer-journal-using-contacts/</link>
       <pubDate>Fri, 02 Feb 2024 10:02:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/02/02/digital-prayer-journal-using-contacts/</guid>
       <description><![CDATA[ <p>This is another one of those systems that has grown with me over the years.</p>
<p>Years ago, I began simply keeping a list of prayer requests in Reminders.app and glancing at it periodically before praying.</p>
<p>Some time later I was feeling a bit despondent. I felt the weight of the endless list of prayer requests, and lamented that I felt no answers… then I pressed the &quot;show completed tasks&quot;. I teared up as I scrolled through years of requests that I had checked off because they were answered. I was greatly encouraged… and kept the habit.</p>
<p>Some time later, I stopped using facebook. Without the universal spying CRM of facebook I had no way to keep track of who is related to whom, when were birthdays coming up, all that sort of thing. I started to diligently update my Google contacts database. This let me remember family birthdays, which of my friends was studying data science, where people work, etc.<sup class="footnote-ref"><a href="#fn-crm" id="fnref-crm" data-footnote-ref>1</a></sup></p>
<p>For the past two years I've combined both the prayer list and personal CRM in my contacts. This has grown into an evolving practice that brings me a lot of joy and purpose.</p>
<h2><a href="#what-now" aria-hidden="true" class="anchor" id="what-now"></a>What now?</h2>
<h3><a href="#recording" aria-hidden="true" class="anchor" id="recording"></a>Recording</h3>
<p>When I'm talking to someone 1:1 I'll either write in my journal (if appropriate) or afterward make a quick note in <a href="https://evantravers.com/articles/tags/drafts-app/">Drafts</a> of the form:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">Person&#39;s name
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>bullet points
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>about what we talked about
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>prayer: thinking about parenting and the future
</div></code></pre>
<p>At the end of the day as I'm cleaning my Drafts inbox I run a <a href="https://evantravers.com/articles/2021/02/02/drafts-to-cardhop/">venerable Drafts shortcut</a> to send the update to Cardhop<sup class="footnote-ref"><a href="#fn-cardhop" id="fnref-cardhop" data-footnote-ref>2</a></sup>. Cardhop's default makes it easy to find things like &quot;who did I talk to recently that is studying bioinformatics?&quot; or &quot;What was her maiden name?&quot; I have a pretty good habit of recording those &quot;things that I'd like to remember later,&quot; which is by far the hardest part of this.</p>
<h3><a href="#remembering" aria-hidden="true" class="anchor" id="remembering"></a>Remembering</h3>
<p>I don't yet have a solid system for paging through requests. Cardhop does have a &quot;recently updated&quot; page that makes it easy to see people I've talked to recently, but for a while I've been just doing a lightweight memory trick: I associate some prayer requests with common things in my life:</p>
<ul>
<li>tying my barefoot shoes reminds me to pray for my pastor friend who also likes barefoot shoes.</li>
<li>woodworking tools reminds me to pray for a friend who enjoys woodworking</li>
<li>using my Obsidian bible reminds me to pray for a friend who got me into using that tool</li>
</ul>
<p>This habit helps my memory and keeps me praying nearly the whole day.</p>
<h3><a href="#celebrating" aria-hidden="true" class="anchor" id="celebrating"></a>Celebrating</h3>
<p>Since I journal and digitally log important conversations, it's pretty easy to cruise through my 13 weekly summary pages and yank out all the answers to prayer on a quarterly basis… which can then get pushed up to a yearly page. God is not a magic machine that responds to hours spent on knees, but seeing that he has a plan and seeing his goodness is a great encouragement whenever I look through such a list.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>This practice can look different for everyone. Index cards, a bullet journal... it doesn't matter. The practice trains our minds to reach to prayer first and tunes our hearts to recognize God's power in our daily lives.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-crm">
<p>Stephen Wolfram has a really exaggerated and 40-year old version of this <a href="https://evantravers.com/articles/2019/03/31/books-and-links-march/#seeking-the-productive-life-some-details-of-my-personal-infrastructure-stephen">I blogged about earlier</a>. I'd like to move my contacts off of Google Contacts to something more stable… I don't know what that looks like yet. I wish I could track my contacts in git and use plain text… and still have access to it on my phone… hmm. <a href="#fnref-crm" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-cardhop">
<p><a href="https://flexibits.com/cardhop">Cardhop</a> is great… but I'm syncing with Google Contacts, and I feel like something sometimes gets lost in migration/translation. I <em>know</em> I lose content sometimes, and my system keeps forgetting birthdays and anniversaries.  A friend just jogged my memory about <a href="https://www.monicahq.com/">Monica HQ</a>, I'm going to see if I can get that setup on my home server. <a href="#fnref-cardhop" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Searching Amazon for A Specific Screw</title>
       <link>http://evantravers.com/articles/2024/01/13/searching-amazon-for-a-specific-screw/</link>
       <pubDate>Sat, 13 Jan 2024 20:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/01/13/searching-amazon-for-a-specific-screw/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>You can use Amazon's photo search app together with a ruler or penny to find precisely sized objects that are otherwise hard to describe.</p>
</div>
<p>In 2018 Amazon<sup class="footnote-ref"><a href="#fn-note" id="fnref-note" data-footnote-ref>1</a></sup> <a href="https://techcrunch.com/2018/07/19/amazons-new-ar-part-finder-helps-you-shop-for-those-odd-nuts-and-bolts/">released a camera search tool</a> to help homeowners and businesses identify mechanical parts.</p>
<p>Part Finder is no longer an option in the current Amazon iOS app. It's been absorbed into their fashion-focused Amazon Lens tool, primarily marketed as a slick way to figure out and purchase a copy of a garment.</p>
<p>While there is another <a href="https://www.amazon.com/s?k=screws&amp;crid=1UKGNSIGYXDUB&amp;sprefix=screws%2Caps%2C138&amp;ref=nb_sb_noss_1">custom search filter</a> for narrowing a hardware search, I think the original Part Finder code is still hidden in there and <em>very</em> useful… especially if you don't know what this doohickey is called.</p>
<p>It still works the same: take a picture of the object. While they don't instruct it anymore, it seems like adding a ruler or a common object (the original feature used US coins) helps the system size it accurately.</p>
<p>I can't tell you how many times I searched for this little doohickey. It attaches a frame (apparently called a valance) to our windows. Some of them had broken, and I was looking for a replacement… and I could <em>not</em> think of the right words to google. Finally used Amazon Lens, and I had 15 replacements the next day.</p>
<figure class="two-up">
    <img src="https://images.evantravers.com/articles/2024/01/clip_1.png">
    <img src="https://images.evantravers.com/articles/2024/01/clip_2.png">
</figure>
<p>That third option for this guy is 100% correct.</p>
<figure class="two-up">
    <img src="https://images.evantravers.com/articles/2024/01/bolt_1.png">
    <img src="https://images.evantravers.com/articles/2024/01/bolt_2.png">
</figure>
<p>Using a coin like a penny can add more accuracy. I've found it to be pretty reliable at identifying length and even diameter of bolts and screws. (In this case, the second result is 100% accurate.)</p>
<figure class="two-up">
    <img src="https://images.evantravers.com/articles/2024/01/screw_1.png">
    <img src="https://images.evantravers.com/articles/2024/01/screw_2.png">
</figure>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-note">
<p>I would prefer to support small businesses if I can… but sometimes it's easier to just use the jungle app. <a href="#fnref-note" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Quarterly Projects</title>
       <link>http://evantravers.com/articles/2024/01/08/quarterly-projects/</link>
       <pubDate>Mon, 08 Jan 2024 09:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/01/08/quarterly-projects/</guid>
       <description><![CDATA[ <p>A friend wrote…</p>
<div class="admonition chat_in">
<div class="admonition__title">Joschua</div>
<p>Unrelated: I’d love to read about your Things project setup at some point! Looks like they are more time-bound 12WY-ish areas. I’m curious.</p>
</div>
<div class="admonition chat_out">
<div class="admonition__title">Me</div>
<p>I could have sworn I wrote something about it, but it appears to be gone. Consider me prompted.</p>
</div>
<p>Projects are defined as outcomes that will require more than one action step to complete and that you can mark off as finished in the next 12 months.<sup class="footnote-ref"><a href="#fn-credit" id="fnref-credit" data-footnote-ref>1</a></sup> That makes sense and most of our work falls into this category: Write this blog post, fix the cabinets, file our taxes. In a traditional GTD<sup class="footnote-ref"><a href="#fn-gtd" id="fnref-gtd" data-footnote-ref>2</a></sup> sense we can group our Projects into the Areas of our life… traditionally location or role bound constraints where we partition our focus depending on where we are standing.</p>
<p>Where then does &quot;working on our house&quot; go? As my system has grown there's been a couple &quot;everlasting&quot; projects that require more than one action step. Progress is possible… but they are never &quot;done.&quot; Examples: Date Nights. Yardwork. House Chores. Financial Stewardship. Important stuff!</p>
<p>Things.app works better when your tasks are in Projects (Sections, searching, etc.) so I tended to have &quot;everlasting&quot; projects that were just buckets of tasks on a project that never ended.</p>
<p>As the years wore on, Projects were moving and celebrated but the Everlasting Projects felt immovable. It felt like no progress was being made. No accomplishments to celebrate, no moments to reconsider assumptions… they ballooned and swelled to an unhealthy size.</p>
<p>Sometime in early 2020 I decided to change this practice.</p>
<p>For three years now have been constraining my &quot;everlasting&quot; projects into <a href="https://evantravers.com/articles/2021/05/29/review-12-week-year/">12WY</a> style quarters. On <a href="https://evantravers.com/articles/2023/11/13/rituals-circa-2023/#12wy-every-12-weeks">my quarterly planning</a> I close each out, creating the next iteration. (<code>House Q1</code> -&gt; <code>House Q2</code>). The migration of tasks and chores between them is quite like the &quot;<a href="https://evantravers.com/articles/2021/11/02/the-bullet-journal-method-by-ryder-carroll/">bullet journal</a> migration&quot; practice, affording the moment to ask &quot;do I want to keep this?&quot; I also look back on three months of accomplished chores and tasks and celebrate that while it's never done, it was stewarded appropriately.</p>
<p>If you are bullet journaling, you are doing this already. If you have a digital project that will never go away and feels <a href="https://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">Sisyphean</a>, give this a try.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-credit">
<p>Definition from <a href="https://gettingthingsdone.com/2017/05/managing-projects-with-gtd/">gettingthingsdone.com</a> <a href="#fnref-credit" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-gtd">
<p>I still haven't read that book. 🤦 <a href="#fnref-gtd" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>iOS Homescreen 2024</title>
       <link>http://evantravers.com/articles/2024/01/05/ios-homescreen-2024/</link>
       <pubDate>Fri, 05 Jan 2024 08:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/01/05/ios-homescreen-2024/</guid>
       <description><![CDATA[ <p>The <a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022/">homescreen I described last time</a> has stayed pretty relevant for a long time, but the most recent iOS update added some new features and so it has evolved. It's essentially all the same functionality and applications, just moved around a little bit to prevent me from getting sucked into my phone.</p>
<p>The goal of previous iterations has always been the &quot;magic button:&quot; Can I set up my device so that I touch it once and then put it down? Because of iOS17's new features… I can achieve 80% of that without even unlocking my phone.</p>
<h2><a href="#lockscreen" aria-hidden="true" class="anchor" id="lockscreen"></a>Lockscreen</h2>
<p>The lockscreen now contains the layer of my device intended to &quot;quickly capture&quot; a thought, task, or event. Ideally I do one thing on this layer, then bounce back into the real world without being sucked in.</p>
<figure class="thirds">
    <img src="https://images.evantravers.com/articles/2024/01/lockscreen-empty.png" alt="lockscreen">
    <img src="https://images.evantravers.com/articles/2024/01/lockscreen-notification.png" alt="lockscreen-notification">
    <img src="https://images.evantravers.com/articles/2024/01/lockscreen-launcher.png" alt="lockscreen-launcher">
    <figcaption>
        <p>On top: Fantastical shows the upcoming calendar item.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">    &lt;p&gt;Below the clock: four &amp;quot;complications&amp;quot; left to right:&lt;/p&gt;
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">    &lt;ol&gt;
</div><div class="line" data-line="4">        &lt;li&gt;Launch &lt;a href=&quot;https://overcast.fm/&quot;&gt;Overcast&lt;/a&gt; (my podcast app)&lt;/li&gt;
</div><div class="line" data-line="5">        &lt;li&gt;Start Dictation to &lt;a href=&quot;https://evantravers.com/articles/tags/drafts-app&quot;&gt;Drafts&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="6">        &lt;li&gt;Start Writing to &lt;a href=&quot;https://evantravers.com/articles/tags/drafts-app&quot;&gt;Drafts&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="7">        &lt;li&gt;Launch &lt;a href=&quot;https://evantravers.com/articles/series/hammerspoon-headspace/&quot;&gt;Headspaces&lt;/a&gt;&lt;/li&gt;
</div><div class="line" data-line="8">    &lt;/ol&gt;
</div><div class="line" data-line="9">&lt;/figcaption&gt;
</div></code></pre>
</figure>
<p>Interactive widgets are a game-changer. I can pick up my phone, throw something into Drafts, and put it down without even seeing all the notifications, applications, or any other distractions.</p>
<p>The Headspace Launcher is the <em>same</em> shortcut I've written about <a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022/#shortcuts-launchers">using shortcuts and headspaces</a> in a new location.</p>
<p>I have noticed that (with my iPhone 13 Mini) there seems to be some kind of time out that can keep a longer running lockscreen shortcut from finishing. I don't have a clear answer, but I have noticed that if the phone is unlocked, there is no timeout.<sup class="footnote-ref"><a href="#fn-timeout" id="fnref-timeout" data-footnote-ref>1</a></sup></p>
<p>Therefore it's pretty common for me to pick up my phone, faceID unlock, I hit the launcher and then immediately swipe up to &quot;unlock&quot; the phone, but I'm really still seeing the Launcher menu and executing one thing.</p>
<p>It's not perfect, but it works. 🤷</p>
<p>As it is, 95% of the time I pick up my phone, I touch one icon on the lockscreen and never reach the next layer: the homescreen.</p>
<h2><a href="#homescreen" aria-hidden="true" class="anchor" id="homescreen"></a>Homescreen</h2>
<p>My homescreen is the simplest it's ever been.</p>
<figure class="right">
    <img src="https://images.evantravers.com/articles/2024/01/homescreen.png" alt="homescreen">
    <figcaption>
        <p>Using the giant Things widget and being able to check off items from the Homescreen has helped me stay on task.</p>
    </figcaption>
</figure>
<p>It contains only the three applications that hold the deeper database of my systems: Fantastical for time, Things for tasks, Obsidian for thoughts.</p>
<p>This layer answers the second reason I pick up a mobile device: querying into the systems that run my life. Because the previous layer of the lockscreen answers 99% of all &quot;quick actions&quot; I pretty much only unlock my phone to do that deeper query, and I rarely drift into deeper querying when my original intent was &quot;quick-add&quot;.</p>
<p>It's been <em>great</em>.</p>
<p>Removing Messages and Phone from my Dock was a weird change. However my friend group has slowly split up along the Messages/Signal/Telegram battlefronts, so I was frequently deciding where to message someone. As it is I typically start conversations using Siri anyway.</p>
<p>Because my notifications are so restricted, my Notification Center is messaging anyway, so that provides a way to re-enter conversations.</p>
<p>Obsidian continues to be more useful for me… I use it as my digital bible now that I pay for Obsidian Sync and it loads faster than most other Bible apps.</p>
<h2><a href="#widgets" aria-hidden="true" class="anchor" id="widgets"></a>Widgets</h2>
<p>The only thing left is the widget panel, which I use for a few things that don't quite fit, but are nice to have. Kind of a utilities folder of specific logging tools for on the go.</p>
<figure class="dual">
    <img src="https://images.evantravers.com/articles/2024/01/widgets.png" alt="widgets">
    <img src="https://images.evantravers.com/articles/2024/01/widgets-weight.png" alt="widgets-weight">
    <figcaption>
        <p>From top to bottom, left to right:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">    &lt;ol&gt;
</div><div class="line" data-line="2">        &lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/locket-widget/id1600525061&quot;&gt;Locket&lt;/a&gt; is photos of my loved ones.&lt;/li&gt;
</div><div class="line" data-line="3">        &lt;li&gt;Shortcut for recording my weight in the morning.&lt;/li&gt;
</div><div class="line" data-line="4">        &lt;li&gt;&lt;a href=&quot;https://chartyios.app/&quot;&gt;Charty&lt;/a&gt; Widget that shows rolling average of weight.&lt;/li&gt;
</div><div class="line" data-line="5">        &lt;li&gt;&lt;a href=&quot;https://www.foodnoms.com/&quot;&gt;Foodnoms&lt;/a&gt; for recording food/water&lt;/li&gt;
</div><div class="line" data-line="6">        &lt;li&gt;&lt;a href=&quot;https://www.ynab.com/&quot;&gt;YNAB&lt;/a&gt; for recording transactions&lt;/li&gt;
</div><div class="line" data-line="7">        &lt;li&gt;Battery Widget&lt;/li&gt;
</div><div class="line" data-line="8">    &lt;/ol&gt;
</div><div class="line" data-line="9">&lt;/figcaption&gt;
</div></code></pre>
</figure>
<p>The Weight Shortcut and Chart are an updated version of one <a href="https://evantravers.com/articles/2020/11/07/day-of-automation/">I wrote up in 2020</a>. Update Weight now calls the shortcut that builds the Chart and updates the widget, so this screen has a pretty powerful accountability tool without it being in my face all the time.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I am happy with this setup and have been using it since the update in September.</p>
<p>The &quot;layers&quot; concept has been helpful for mental organization and to keep me from floating away into the infinite expanse of digital distraction<sup class="footnote-ref"><a href="#fn-distraction" id="fnref-distraction" data-footnote-ref>2</a></sup>. The Headspaces being exactly the same system on desktop and mobile allows me have the same time-tracking tools everywhere.</p>
<p>As usual… don't copy 100% my setup. Take some principles and try them on for size. If you do nothing else, auditing and harshly restricting your notifications so that you are only buzzed for something truly important is the best thing you can do for your focus.</p>
<h2><a href="#prior-art" aria-hidden="true" class="anchor" id="prior-art"></a>Prior Art</h2>
<ul>
<li><a href="https://evantravers.com/articles/2019/06/03/minimal-ios-homescreen-2019/">2019</a></li>
<li><a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022/">2022</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-timeout">
<p><a href="https://joschua.io/">Joschua</a> linked me to <a href="https://apple.stackexchange.com/questions/147453/how-can-i-extend-the-lock-screen-timeout-in-ios/367547#367547">this stackoverflow post</a> on the same topic. Seems there's some places on the screen you can keep touching to keep the screen alive too. <a href="#fnref-timeout" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-distraction">
<p>I'm also using <a href="https://apps.apple.com/us/app/refocus-screen-time-blocker/id1645639057">Refocus.app</a> to create an additional layer of friction for websites that distract me. <a href="#fnref-distraction" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Setting Up Nix Dev Environment for Middleman and Ruby</title>
       <link>http://evantravers.com/articles/2024/01/04/setting-up-nix-dev-environment-for-middleman-and-ruby/</link>
       <pubDate>Thu, 04 Jan 2024 07:42:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/01/04/setting-up-nix-dev-environment-for-middleman-and-ruby/</guid>
       <description><![CDATA[ <p>Wanna know why I've stopped working on <a href="https://evantravers.com/articles/2022/07/26/an-ode-to-advent-of-code/">Advent of Code</a> on <a href="https://github.com/evantravers/adventofcode/blob/master/2023/elixir/lib/08-haunted-wasteland.ex">Day 8</a>? This problem right here! 🤦</p>
<p>So when I initially <a href="https://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/">switched to Nix for dotfiles</a> and setup NixOS I was able to set up the blog, but I wasn't reaaaaally using Nix. I used Nix to set up my trusty <a href="https://asdf-vm.com/"><code>asdf-vm</code></a> and used that to handle ruby and bundler to handle gem depedencies.</p>
<p>While working on more complicated projects I discovered this approach doesn't work well. It really hangs up if the ruby gem wants to build a native extension… which a <em>lot</em> of things in rails does.<sup class="footnote-ref"><a href="#fn-lazy" id="fnref-lazy" data-footnote-ref>1</a></sup></p>
<p>The More Correct Answer™️ is to let Nix handle all dependencies, including gems and NPM packages.</p>
<p>I initially went down the path of looking at <a href="https://devenv.sh/">cachix/devenv</a> and then <a href="https://www.jetpack.io/devbox/">jetpack-it/devbox</a>. Both are very nice, but I couldn't make much headway, I suspect because I didn't really understand enough about Nix yet.<sup class="footnote-ref"><a href="#fn-later" id="fnref-later" data-footnote-ref>2</a></sup></p>
<p>As it was, I fought for weeks chasing different Nix errors. Sometimes I'd get it working on one device, but not another. My &quot;lab journal&quot; note in drafts and commit logs are filled with experiments, guesses and frustrations.</p>
<p>Here's where I landed:</p>
<p>I stopped using either devenv or devbox and wrote a simple flake based on the one from the documentation.</p>
<pre class="lumis"><code class="language-nix" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;evantravers.com (middleman, ruby, node)&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;nixpkgs/nixpkgs-unstable&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake-utils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;github:numtide/flake-utils&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">outputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake-utils</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>:
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flake-utils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lib</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eachDefaultSystem</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span>:
</div><div class="line" data-line="11">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nixpkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">legacyPackages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">system</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rubyEnv</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundlerEnv</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">          <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># The full app environment with dependencies</span>
</div><div class="line" data-line="16">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;middleman-env&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inherit</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ruby</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gemdir</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Points to Gemfile.lock and gemset.nix</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildPackages</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="22">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundix</span>
</div><div class="line" data-line="23">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rubyEnv</span>
</div><div class="line" data-line="24">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rubyEnv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wrappedRuby</span>
</div><div class="line" data-line="25">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nodejs</span>
</div><div class="line" data-line="26">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="27">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="29">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">devShells</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">default</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="30">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkShell</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="31">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">env</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="32">              <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;NODE_OPTIONS&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;--openssl-legacy-provider&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="33">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="34">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildInputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildPackages</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">++</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="35">              <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pkgs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solargraph</span>
</div><div class="line" data-line="36">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="37">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="38">
</div><div class="line" data-line="39">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">packages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">default</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="40">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stdenv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkDerivation</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="41">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;build the website&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="42">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="43">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildInputs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildPackages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="44">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildPhase</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rubyEnv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/bin/middleman build&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="45">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="46">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="47">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="48"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>The way to get ruby dependencies into nix is as follows:</p>
<ol>
<li>Drop into a nix shell that has a few packages: <code>nix-shell -p bundix ruby</code>.</li>
<li>Now we have access to bundler, so run <code>bundle lock</code> to generate a Gemfile.lock.</li>
<li>That gemfile.lock describes the location and identity of dependencies: <code>bundix -l</code> translates that into a nix expression in gemset.nix.</li>
<li>In the flake you need to import a ruby with that gemset.nix expression as part of the environment (the <code>bundlerEnv</code> above.)</li>
</ol>
<p>Seems straightforward right? Well…</p>
<p>My flake can't be used to create a shell with the dependencies needed to debug until it compiles cleanly, so you need to keep using <code>nix-shell</code>. When it works, it <strong>works</strong>. But until then…</p>
<p>So what was going wrong for so long? Some of my mistakes:</p>
<h2><a href="#force-ruby-platform" aria-hidden="true" class="anchor" id="force-ruby-platform"></a>Force ruby platform</h2>
<p>For a long time I was wrestling on and off with various ruby gems that were building native extensions or had platform specific versions.</p>
<p>I didn't solve this problem, I just sidestepped it.</p>
<p>I ran <code>bundle config set --local force_ruby_platform true</code>, re-ran <code>bundle lock</code> and removed any references to individual platforms. For this simple blog, that worked fine. It won't work for a more complicated situation, so I'll learn more about that later.</p>
<h2><a href="#you-have-to-include-the-gemsetnix" aria-hidden="true" class="anchor" id="you-have-to-include-the-gemsetnix"></a>You have to include the gemset.nix</h2>
<p>For a long time I was generating the gemset.nix with bundix, but then not including it in the flake. 🤦 After I had used the <code>let</code> portion to define the <code>bundlerEnv</code>, I needed to include it in the <code>buildPackages</code> portion of the <code>mkShell</code>. I was defining all the gems… but not using them.</p>
<h2><a href="#stop-using-bundler" aria-hidden="true" class="anchor" id="stop-using-bundler"></a>Stop using bundler</h2>
<p>I kept running <code>bundle exec</code> like an idiot.</p>
<p>For <em>years</em> I have dodged <em>so many</em> ruby bullets by simply running <code>bundle exec</code> in front of every executable call and it's become muscle memory. By doing this I ensure that the local bundle calls the gems I specified in this project's gemfile, not some global copy floating somewhere else.</p>
<p>Except here… I don't want to use the local gems I pulled with <code>bundle install</code>… in fact I don't even want to install them using bundler. All bundler needs to do is describe the dependency graph to be translated by bundix into a nix expression. That's it.</p>
<p>For a bit <code>bundle exec middleman build</code> was indeed working… because the gems installed into ./vendor were sufficient to run that code. As I dug into some weird issues with <code>bundle exec middleman server</code> I saw that the stack trace included gems in ./vendor/cache <strong>and</strong> in /nix/store… whoopsie.</p>
<h2><a href="#just-match-the-mismatched-sha256" aria-hidden="true" class="anchor" id="just-match-the-mismatched-sha256"></a>Just match the mismatched sha256</h2>
<p>For a long time I was fighting an error in my flake where it was getting a sha different than what it expected. I don't know why it happened: it might be that <a href="https://github.com/rubygems/rubygems/pull/7324">my particular version of bundler wasn't handling platform-specific gems correctly</a>, or that <a href="https://github.com/nix-community/bundix/issues/109">bundix wasn't interpreting the file correctly</a>.</p>
<p>Complicated causes don't require complicated solutions. After reading <a href="https://technogothic.net/pages/JekyllOnNix/">technogothic's post</a>, I took the SHA that nix said it was expecting and put it into the gemset.nix. Problem solved.</p>
<h2><a href="#you-cant-write-to-read-only" aria-hidden="true" class="anchor" id="you-cant-write-to-read-only"></a>You can't write to read-only</h2>
<p>After all this… I could run <code>middleman server</code> and everything started! I happily opened localhost:4567 in my browser aaaaand nothing. If I interrupted the server I got a cryptic stacktrace about files, basenames, recursion… and it was slightly different every time?</p>
<p>I kept googling traces, messing with things, and remembered I'd seen this before. I ran <code>middleman build</code> and it worked <em>just fine</em>.</p>
<p>Do I learn from my mistakes? Slowly. This is the same problem that I faced when <a href="https://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/#treesitter-wants-to-compile">trying to use Lazy.nvim</a>. Nix was mounting my website's files and dependencies in the immutable nix store, and something in middleman's livereload server really hates that.</p>
<p>For now, I can run <code>middleman server --watcher-disable</code> and move on with my life.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>There's been a string of long-running late-night texts between me and friends over the past month as I fought to bring my blog into Nix.</p>
<div class="admonition chat_out">
<div class="admonition__title">Me</div>
<p>(you probably know all this crap… but it feels like a breakthru to me)</p>
</div>
<div class="admonition chat_in">
<div class="admonition__title">Friend</div>
<p>yea</p>
</div>
<div class="admonition chat_in">
<p>You've never dated a crazy girl.. but that's what it feels like</p>
</div>
<div class="admonition chat_in">
<p>the highs are high and the lows are low</p>
</div>
<div class="admonition chat_out">
<p>🤔</p>
</div>
<p>He's not <em>totally</em> wrong. Another friend, @qmx, warned me to stay away from Nix… at the moment I'm persevering through the pain. At the moment I haven't found a solution to the middleman live-reload watcher working again…<sup class="footnote-ref"><a href="#fn-direnv" id="fnref-direnv" data-footnote-ref>3</a></sup> but if I freeze the flake.lock I can guarantee that my blog will at least run for a long time even though middleman's future is in question, and that's a good feeling.<sup class="footnote-ref"><a href="#fn-feeling" id="fnref-feeling" data-footnote-ref>4</a></sup></p>
<p>I'm going to try to stand up a more complicated rails app with databases, caches, and a separate microservice… we'll see how I feel about it after that.</p>
<p>If all else fails, I can fall back to letting nix stand up services, define <code>asdf-vm</code>, and keep rolling like I always have, but I want the reproducibility… and longevity that nix promises. I started this on a WSL NixOS, worked on it on an old intel Mac, and am finishing the spellchecking on a M1 ARM Mac... and for each platform all I did was <code>cd</code> into the folder, <code>direnv</code> triggered the nix evaluation, and I could start work.</p>
<p>It's a bright promise, we'll see if it holds up to be a real future.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://github.com/nix-community/bundix">bundix reference</a></li>
<li><a href="https://nixos.org/manual/nixpkgs/stable/#developing-with-ruby">nixos wiki on ruby</a></li>
<li><a href="https://discourse.nixos.org/t/cant-use-ruby-sassc-gem-fails-at-runtime-with-ffi/4023">some discussion of gems and native extensions</a></li>
<li><a href="https://unix.stackexchange.com/questions/440569/ruby-on-nixos-ffi-gem-installation-failing-when-building-native-extensions">more stackexchange on native extensions</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-lazy">
<p>This was the same problem that I encountered using Lazy.nvim to try and install LSP grammars. Nix is evaluating everything in its read only store… so temp build files break its functional perfection. <a href="#fnref-lazy" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-later">
<p>If I go back to one, it'll probably be devenv. Devbox's decision to abstract away nix expressions and only use json means I'm not sure how to use Bundix with it. I guess I'd have to write a custom package and use that as an input in the Devbox's json? Unsure. Devbox is available as a package in home-manager, devenv has nice caching… problem for the next project that requires services and databases. <a href="#fnref-later" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-direnv">
<p>I could probably use direnv to reload the server every time change a file, but that feels heavy. I just need to dive into <code>middleman server</code>'s documentation… I could probably have it write a cache folder I control. <a href="#fnref-direnv" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-feeling">
<p>Gives me the confidence to extend <a href="https://evantravers.com/articles/2022/06/17/extending-redcarpet-for-admonition-blocks/">my custom admonition markup</a> to ape <a href="https://xeiaso.net/">Xe's cute conversations</a>. <a href="#fnref-feeling" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>2023</title>
       <link>http://evantravers.com/articles/2024/01/01/2023/</link>
       <pubDate>Mon, 01 Jan 2024 09:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2024/01/01/2023/</guid>
       <description><![CDATA[ <p>This year's theme was set as <a href="https://evantravers.com/articles/2022/12/31/review-2022/#2023"><em>Wake Up</em></a>, intending to take action, not sleep on things. It was a good guide to begin the year, and providentially took on new meanings as the Lord revealed new things for me to work on and submit myself to Him.</p>
<p>I'd say that this was a very hard year emotionally. Just a lot going on in the world<sup class="footnote-ref"><a href="#fn-news" id="fnref-news" data-footnote-ref>1</a></sup> and in my heart. At this moment I am grateful and easily resting in God's provision and faithfulness… but that has been harder at different times in the year.</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>I think this year I wrote 53 articles here, 13 more than last year. Some of my favorites:</p>
<ul>
<li><a href="https://evantravers.com/articles/2023/02/16/raycast-review-as-an-longtime-alfred-user/">Raycast Review as an Longtime Alfred User</a></li>
<li><a href="https://evantravers.com/articles/2023/08/01/sketchnoting-sermons/">Sketchnoting Sermons</a></li>
<li><a href="https://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/">MagSafe Tenting and Wearable Keyboards</a></li>
<li><a href="https://evantravers.com/articles/2023/06/26/he-who-grasps-the-heel/">He Who Grasps the Heel</a></li>
<li><a href="https://evantravers.com/articles/2023/05/21/and-there-arose-a-generation-who-knew-not/">And There Arose a Generation Who Knew Not</a></li>
</ul>
<p>I am still making a lot of unlisted videos just for friends, although now I'm using OBS and Youtube because I'm too poor to pay for Loom at the moment.</p>
<p>I touched 2303 notes in Obsidian this year. That's almost double the count from last year. There's a lot of thoughts brewing in there… some shallow research notes about camping and hobbies, but also an essay about burnout and What I Think About This AI Thing.</p>
<p>I'm going to start a new habit this year (Lord willing!) to write more. I've had some essays I really care about jammed in my gullet for months. I need to spend time on them. The two changes: a glance at my writing <a href="https://evantravers.com/articles/2022/08/30/writing-in-obsidian/">Kanban board</a> as part of Weekly Review, and morning prompt to write for just five minutes.</p>
<p>I <em>really</em> need to get off Middleman. It's been really stymieing me to do some new things I want to do, and it's pinned on Ruby 2.7.6 which is EOL.</p>
<h3><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h3>
<p>I started 20 books this year, finishing 19. 12 fiction, 8 non-fiction. Not bad, but my reading is still kind of &quot;in between&quot; things, not a set aside activity. I really would benefit from having a working hours reading habit. I may try to implement that in a later quarter. I <a href="https://evantravers.com/articles/2023/07/18/recently-reading/">wrote about some highlights here</a>.</p>
<h3><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h3>
<p>Work has been blessedly flexible during some difficult personal seasons. On a day to day basis it's sometimes hard to see the progress we make, but I have been able to cross off some years-long product goals this year. Always keep a list of things you want changed, and revisit it every once in a while. If someone fixes that thing… show them and thank them for making your wishes come true!</p>
<p>I think that this next year will hold the opportunity to take user experience to the next level of maturity at the day job. I'm excited about what that means both for my personal growth as well as our organization's ability to serve and consider the needs of our users.</p>
<p>I do really love my team, wonderful folks with some new faces and an incredible mix of skills. I'm very honored to work with such fine folks and look forward to seeing what 2024 holds.</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>I find myself rushing to the Lord for help a lot these days. I need him to not be frustrated at my kids. I need his strength to help me work as unto the Lord.</p>
<p>Being a part of a dedicated and humble small group has really helped this year. Three of you have 1:1 coffee'd with me monthly, praying with me and for me as I walked through this year. (Thank you!!)</p>
<p>I've made three habit-based adjustments to my quiet time that has helped… I track prayer requests (more on that later), I've been <a href="https://evantravers.com/articles/2023/08/01/sketchnoting-sermons/">sketchnoting sermons and sharing the notes with my kids</a> and I've also had &quot;Study&quot; spread in my Bullet Journal that contains all the notes from Quiet Time, Sunday School, and Small Group. Having the thoughts from all those spiritual conversations open in front of me in the morning sparks some thoughts and connections and helps me detach from the moment and attach to the conversation that God is having with me through his word and his people.</p>
<p>I'd say that the Lord is teaching me to rely upon him more this year than any before, and while I'm white-knuckling that reliance more than I'd like to admit, it <em>is</em> sweet to trust in Jesus.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p>This is an area that really needs attention, and my <a href="https://evantravers.com/articles/2023/03/28/obsidian-12wy-review-template/">12WY</a> goal for Q1 is starting here:</p>
<p>I've had <em>really</em> bad sleep for months. Taking magnesium and trying to see the sun rise each morning has helped the past few weeks, and I'm going to continue this. It's also been sweet time of quiet prayer and reflection to start the day. Tomorrow morning I'll be wrapped in a blanket, sitting on a camping pad in my backyard, getting my morning photonic reset.</p>
<p>I am about 20lb heavier than I should be. I've had consistent workouts, but not determined. I also stress eat and &quot;reward&quot; myself with sugar. I've also had some lingering injuries to my right knee and left foot that I need to get addressed.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>I often say it to her, but it's worth saying to the world: I don't deserve my wife. She's so kind and strong. I have come to appreciate her more and more this year as the kids grow in their ability to delight and distract. She's an amazing woman. I am so grateful to God for her.</p>
<p>This year we've had a lot more little weekend adventures. Many of them originate with my thoughtful wife, but I'm trying to &quot;join the party planning committee&quot; and bring some creative energy to our afternoons and weekends.</p>
<p>I have to give special credit to my friend Julie for the inspiration to take a PTO day for every birthday in my home. Many of the sweetest memories and meals from our year occur on those three-day weekends.</p>
<p>I want to carry forward this pattern next year… more small restful adventures create pockets of rest and togetherness throughout the year… as well as spreading the odds that our big plans get canceled by toddler-borne illness.</p>
<p>This year I've continued to measure and celebrate in my weekly/monthly summaries activities that I want to promote:</p>
<ul>
<li>meaningful and life-giving 1:1 conversations (44 of your this year, thank you!)</li>
<li>memorable meals (8 off the top of my head)</li>
<li>family outings (31 I could count)</li>
<li>serving others through hospitality (I counted 20+ families this year Sarah for whom Sarah created meals!)</li>
<li>prayer requests answered (I just started tracking this again, but I was able to find 20ish answers to prayer in my cursory reading of my journals.)</li>
</ul>
<p>Also special shout-out to those of you who text, discord, or coffee regularly with me. Thank you for your encouragement. It means the world to me.</p>
<h2><a href="#2024" aria-hidden="true" class="anchor" id="2024"></a>2024</h2>
<p>The theme that seems to resonate at the moment was providentially provided by my new friend Greg: <em>Own Up</em>. 2023 allowed me to <em>Wake Up</em> to some of the problems and realities of my life… now it's time to arise tomorrow and own up to that reality, trusting in the Lord for the result and moving in his strength.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-news">
<p>I remain unsubscribed (and blocked!) from most news sources… but there's been lot of historic things happening this year. <a href="#fnref-news" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Moving My Dotfiles to Nix</title>
       <link>http://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/</link>
       <pubDate>Tue, 28 Nov 2023 10:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/11/28/moving-my-dotfiles-to-nix/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/11/wsl.png"></p><p>I've been experimenting with <a href="https://nixos.org/">Nix</a>. I have a PC that is <em>way</em> more powerful than my older Macbook. While experimenting with Ubuntu on WSL, and porting <a href="https://github.com/evantravers/dotfiles/tree/before-nix">my existing dotfiles</a> over, I remembered my friend Tom talking about Nix and NixOS and decided to give it a whirl.</p>
<p>Two weeks later this article is being written on NixOS, in WSL, using my full dev environment. 🎉</p>
<h2><a href="#nix" aria-hidden="true" class="anchor" id="nix"></a>Nix</h2>
<p>The orange site and red site are filled with <a href="https://shopify.engineering/what-is-nix">excellent articles about Nix</a> and what it can do. For the sake of this article a brief overview.</p>
<p>The word Nix points to three things:</p>
<ol>
<li>A functional language<sup class="footnote-ref"><a href="#fn-language" id="fnref-language" data-footnote-ref>1</a></sup> for describing configurations of software.</li>
<li>A package manager using the Nix Language to handle installation and path management of software configurations.</li>
<li>A *nix OS (NixOS) that can be configured using the Nix Language.</li>
</ol>
<p>These three things provide a couple features very desirable to me:</p>
<ul>
<li>Using a strict configuration for my dev environment means that I can sync my setup between my work laptop, my personal laptop, and now this development WSL PC.</li>
<li>NixOS being a configuration-first OS means I can summon a direct copy of it without having to spend hours setting it up. This is advantageous for virtualisation or if I want to move my WSL setup to a dual-boot someday.</li>
</ul>
<h2><a href="#macos-or-wsl" aria-hidden="true" class="anchor" id="macos-or-wsl"></a>MacOS or WSL</h2>
<p><a href="https://wezfurlong.org/wezterm/">Wezterm</a> works on both my &quot;host&quot; OS. I just run the executable and put my wezterm.lua wherever it needs to be.</p>
<p>I do have <a href="https://github.com/evantravers/dotfiles/blob/010f1ab583427019b00d4a145dfc3aa435c3df3d/home.nix#L41-L46">a wild little script</a> that runs and installs the wezterm terminfo file. <em>Very</em> un-nix.</p>
<p>On my Macs I can't run NixOS but I can at least <a href="https://nixos.org/manual/nix/stable/installation/installation.html">install the Nix Package manager</a>. There's a relatively complicated install process involving a separate volume and mounting… but the installer is pretty easy to run.</p>
<p>On the Windows PC I used the <a href="https://github.com/nix-community/NixOS-WSL">WSL2 instructions</a> provided by NixOS. I also added</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">default_domain</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;WSL:NixOS&#39;</span>
</div></code></pre>
<p>to my Windows <code>.wezterm.lua</code> so that Wezterm will connect to WSL on launch.</p>
<h2><a href="#home-manager" aria-hidden="true" class="anchor" id="home-manager"></a>Home Manager</h2>
<p>After NixOS or Nix Package Manager have been installed we can install <a href="https://nix-community.github.io/home-manager/">Home Manager</a> manage our dev environment.</p>
<p>It's specifically built for this problem and replaces what I was doing with my <code>Brewfile</code>, <code>Makefile</code>, and <code>stow</code>.</p>
<p>I took it slowly over a couple of weeks. At first my home-manager consisted of <a href="https://github.com/evantravers/dotfiles/blob/a12d053cb440a0e73859c8011ba60958f0bec112/home.nix">installing some packages and moving my existing dotfiles to the right place</a>. Very un-Nix-like but it totally worked.</p>
<p>As I explored the options appendix and debugged problems I wound up <a href="https://github.com/evantravers/dotfiles/blob/010f1ab583427019b00d4a145dfc3aa435c3df3d/home.nix">here today</a>. I chose not to put <em>everything</em> into the Nix configuration and keep some of the configuration in files for backwards compatibility. In a pinch you could <code>stow</code> or <code>ln</code> those folders/files in your home just like I was before.</p>
<p>Let's explore some of the bumps in the road.</p>
<h2><a href="#neovim" aria-hidden="true" class="anchor" id="neovim"></a>Neovim</h2>
<p>I eventually moved to using the <code>programs.neovim</code> configuration provided by Home Manager. I really wrestled with getting everything setup correctly. I think part of the problem was existing executables and configuration files still in path on OSX that was confusing the universe but in the end there were two big problems:</p>
<h3><a href="#treesitter-wants-to-compile" aria-hidden="true" class="anchor" id="treesitter-wants-to-compile"></a>Treesitter wants to compile</h3>
<p>Treesitter is awesome. But it wants to run scripts and compile things. Nix's store doesn't love that… it wants each folder to be idempotent and sets them to Read Only.</p>
<p>I added <a href="https://github.com/evantravers/dotfiles/blob/010f1ab583427019b00d4a145dfc3aa435c3df3d/home.nix#L135-L145">pkgs.vimPlugins.nvim-treesitter</a> and eventually found the sequence of settings to make it work:</p>
<ul>
<li>add <code>config</code> block to configure highlight and indent on, but I got errors… set <code>type = &quot;lua&quot;;</code>.</li>
<li>use <code>withAllGrammars</code> so that it automatically gets all of them.</li>
<li>everything is installed but not loading, use <code>packadd</code> to force it to load the package.</li>
</ul>
<p>All this wasn't working and I realized that…</p>
<h3><a href="#lazynvim-takes-over-rtp" aria-hidden="true" class="anchor" id="lazynvim-takes-over-rtp"></a>Lazy.nvim takes over RTP</h3>
<p>Turns out my beloved <a href="https://github.com/folke/lazy.nvim">Lazy.nvim</a> completely takes over the <a href="https://vimhelp.org/options.txt.html#%27runtimepath%27">RTP</a>. This means that plugins loaded manually (or by Nix!) can't be found by neovim. Someone else <a href="https://discourse.nixos.org/t/neovim-cant-load-plugins/31189/6">pointed out there was a setting</a>, so <a href="https://github.com/evantravers/dotfiles/commit/6bd0928664fa4e0eb75ec18f92424256e1d6a723">I was able to disable this</a> and suddenly neovim could see plugins loaded by Nix.</p>
<p>These may be bad and wrong, if so… shoot me an email?</p>
<h2><a href="#tmux" aria-hidden="true" class="anchor" id="tmux"></a>Tmux</h2>
<p>Having learned from my Neovim mistakes Tmux was a bit easier. Like Treesitter, <a href="https://github.com/tmux-plugins/tpm">TPM</a> wants to modify it's read-only folders. I moved some settings into the configuration, install the plugins using Home Manager, and use my existing config for theming and style.</p>
<h2><a href="#fish" aria-hidden="true" class="anchor" id="fish"></a>Fish</h2>
<p>I've been using a stripped down Fish install for a while now. I almost wonder if I should use it at all. I basically just install it and use Home Manager to enable Starship.</p>
<p>I still am using <code>asdf</code> in some places. It'll likely phase out as I get better at flakes.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I'm starting to play with <a href="https://devenv.sh/">devenv.sh</a> and flakes to create my development environments. At the moment I'm still making heavy use of <code>asdf</code> to handle ruby/js package management. I am wrestling with how to manage gems that want to build native extensions. I've been warned by kind friends that it's enough to drive one crazy… but I've got the bandwidth presently for the challenge.</p>
<p>I like the idea of only enabling LSP executables and maybe even entire Neovim configurations per project using flakes and overlays. I've got a really simplistic version of this working using <code>direnv</code> at the moment.</p>
<p>All this <em>very much</em> falls under <a href="https://xkcd.com/1319/">XKCD's warning of automation addiction</a>. For me it's worthwhile to learn a little bit about Nix and to face the puzzle of *nix and pathing problems.</p>
<p>I really love that I can run <code>home-manager switch</code> and know that everything I need to start working gets automatically put in the right place. That's pretty hard to beat.</p>
<p>Now I suppose it's actually time to read Nix's actual documentation. :P</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-language">
<p>Nix <em>loves</em> the trailing <code>;</code>. Absolutely required. Really hard for my ruby/JS brain. <a href="#fnref-language" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>A weekly task list with the Alastair Method</title>
       <link>http://evantravers.com/articles/2023/11/26/a-weekly-task-list-with-the-alastair-method/</link>
       <pubDate>Sun, 26 Nov 2023 06:11:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/11/26/a-weekly-task-list-with-the-alastair-method/</guid>
       <description><![CDATA[ <p>I had never encountered the Alastair system, but I think this could work very well for me and be the secret to a weekly/monthly collection actually working for me.</p>
<p>Rach writes:</p>
<blockquote>
<p>The Alastair Method for bullet journaling is when you place some vertical columns next to your list of tasks. The columns could be anything you want to group/organise your tasks by. I choose days. So, I have Monday to Sunday as my columns next to the list. And then, if I plan to do the task on a specific day, I will add a dot to the column. If the task is done, I cross it off in the day I did it and the overall list.</p>
</blockquote>
<p><img src="https://rachsmith.comhttps://images.evantravers.com/alastair-weekly.jpg" alt="her image of the system" /></p>
<p>Do I go all in on analog for my tasks next year… tempting…</p><p><a href="https://rachsmith.com/weekly-tasks/" class="u-in-reply-to  is-reply">A weekly task list with the Alastair Method - rachsmith.com</a></p> ]]></description>
    </item>
    <item>
       <title>Rituals Circa 2023</title>
       <link>http://evantravers.com/articles/2023/11/13/rituals-circa-2023/</link>
       <pubDate>Mon, 13 Nov 2023 17:59:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/11/13/rituals-circa-2023/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/11/review.jpeg"></p><p>I have a <strong>lot</strong> of checklists and systems. Definitely too much. My friend Errin asked if he could steal the templates, so some quick thoughts.</p>
<p>Rituals help me by…</p>
<ul>
<li>Providing a sense of progression and time-pass when working remote.</li>
<li>Holding long-term goals in front of my daily thoughts.</li>
<li>Correctly balancing lead and lag measures.<sup class="footnote-ref"><a href="#fn-lag" id="fnref-lag" data-footnote-ref>1</a></sup></li>
<li>Highlighting Weak Signals<sup class="footnote-ref"><a href="#fn-weak" id="fnref-weak" data-footnote-ref>2</a></sup> before problems escalate with health or relationships.</li>
</ul>
<p>I am a crazy man. I have built this up over <em>years</em>. Don't copy this verbatim. Steal one thing that's good, but be inspired but terrified by the rest.</p>
<h2><a href="#️-daily-journaldailyyyyy-mm-ddmd" aria-hidden="true" class="anchor" id="️-daily-journaldailyyyyy-mm-ddmd"></a>🗒️ Daily: <code>journal/daily/YYYY-MM-DD.md</code></h2>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">follower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">husband</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">father</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">health</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">work</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">plan</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="10">
</div></code></pre>
<p>This is the template for the daily note. I rate myself on my intentions from 1-3 in areas of my life:</p>
<ul>
<li>1 = Didn't try.</li>
<li>2 = Showed up.</li>
<li>3 = Broke a sweat.</li>
</ul>
<p>The following becomes a sort of &quot;<a href="https://evantravers.com/articles/tags/bullet-journal/">bullet journal</a>&quot; for what happened that day. Highlights, funny things my kids said, insights from meetings at work… etc.</p>
<h3><a href="#-daily-plan-workdays--9a" aria-hidden="true" class="anchor" id="-daily-plan-workdays--9a"></a>🌅 Daily Plan (Workdays @ 9a)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># 🧩 Daily Plan
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3">In order to be effective with my day, I design my day with the right balance of focus, time, and effort.
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🙏 Pray. Wisdom to know, strength to do.
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> ⭐ Protect the [essential](things:///show?id=today&amp;filter=@Meazure%20Learning,$High).
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👨‍👩‍👧‍👦 Prioritize [family projects](things:///show?id=anytime&amp;filter=@Family).
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👨 Choose [personal tasks](things:///show?id=anytime&amp;filter=@Me).
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📅 Check schedule.
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🕊 Make room for margin.
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">Tags: Rituals: Daily
</div></code></pre>
<p>This ritual gets done 50% of the time. I mostly plan my day the previous night in the Workday Shutdown ritual. This one is designed to help me remember what's important, fill the remaining plan with useful intention, and stay healthy.</p>
<h3><a href="#-workday-shutdown-workdays--4p" aria-hidden="true" class="anchor" id="-workday-shutdown-workdays--4p"></a>🌇 Workday Shutdown (Workdays @ 4p)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># 🗃 Workday Shutdown
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3">As a faithful steward, I put my work in order to be prepared for the next day, identifying the essential task for the next day.
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Open the [Daily Note](obsidian://advanced-uri?vault=wiki&amp;commandname=Periodic%20Notes%3A%20Open%20daily%20note).
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🕰 Review [time logs](https://track.toggl.com/timer) and time blocks. Mark misspent time on Calendar blocks.
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📓 [Log tasks/projects](things:///show?id=logbook).
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📝 Process notebook.
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📨 Process [Drafts inboxes](drafts://).
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📥 Dump your brain into the Inbox. Get it all out.
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📤 Process [Things inbox](things:///show?id=inbox). (:estimate, $focus, !modality, priority)
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🗓 Time block [tomorrow](things:///show?id=tomorrow).
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 😴 Shut down. (Close. Speak. Shut. Trash. Door. Go home.)
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👨‍👩‍👧‍👦 Go live in Coram Deo this evening.
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">Tags: Rituals: Daily
</div></code></pre>
<p>This ritual is the rock of my whole system. I go through my inboxes, give all the straggling thoughts a home, log everything I intend to log, and leave the desk for the evening.</p>
<p>This I originally installed as a response to overworking after reading <a href="https://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work</a>, but it's expanded to be &quot;manager time&quot; to keep me on track.</p>
<h2><a href="#️-weekly-journalweeklyyyyy-wweek-numbermd" aria-hidden="true" class="anchor" id="️-weekly-journalweeklyyyyy-wweek-numbermd"></a>🗒️ Weekly: <code>journal/weekly/YYYY-W[week number].md</code></h2>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Goal1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Goal2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># Weekly Review: date%3Agggg-%5BW%5Dww
</div><div class="line" data-line="7"></span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!tldr] ![[journal/yearly/2023#Theme]]
</div><div class="line" data-line="9"></span>
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Planning
</div><div class="line" data-line="11"></span>
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Review
</div><div class="line" data-line="13"></span>
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### 👍:
</div><div class="line" data-line="15"></span>
</div><div class="line" data-line="16"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### 👎:
</div><div class="line" data-line="17"></span>
</div><div class="line" data-line="18"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### ✅:
</div><div class="line" data-line="19"></span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---
</div><div class="line" data-line="21"></span>​```dataviewjs
</div><div class="line" data-line="22">let p = function(b) &lbrace;
</div><div class="line" data-line="23">  switch(b) &lbrace;
</div><div class="line" data-line="24">    case &quot;&quot;: return &quot;&quot;; break;
</div><div class="line" data-line="25">    case &quot; &quot;: return &quot;&quot;; break;
</div><div class="line" data-line="26">    case 0: return &quot;⚫&quot;; break;
</div><div class="line" data-line="27">    case 1: return &quot;🔴&quot;; break;
</div><div class="line" data-line="28">    case 2: return &quot;🟡&quot;; break;
</div><div class="line" data-line="29">    case 3: return &quot;🟢&quot;; break;
</div><div class="line" data-line="30"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">  &rbrace;
</div><div class="line" data-line="31"></span>&rbrace;
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">let f = function(d) &lbrace;
</div><div class="line" data-line="34">  return `[[$&lbrace;d.obsidianLink()&rbrace;|$&lbrace;moment(d, &#39;YYYY-MM-DD&#39;).format(&quot;dd&quot;)&rbrace;]]`;
</div><div class="line" data-line="35">&rbrace;
</div><div class="line" data-line="36">
</div><div class="line" data-line="37">let start = moment(dv.current().file.name, &quot;gggg-[W]ww&quot;);
</div><div class="line" data-line="38">let end = start.clone().add(6, &#39;d&#39;);
</div><div class="line" data-line="39">
</div><div class="line" data-line="40">dv.header(2, `Dailies: $&lbrace;start.format(&quot;MM-DD&quot;)&rbrace; - $&lbrace;end.format(&quot;MM-DD&quot;)&rbrace;`)
</div><div class="line" data-line="41">dv.table(
</div><div class="line" data-line="42">  [&quot;📆&quot;, &quot;🙏&quot;, &quot;👫&quot;, &quot;👨‍👩‍👧‍👦&quot;, &quot;💪&quot;, &quot;🖌&quot;, &quot;💻&quot;, &quot;🎯&quot;], dv.pages(&#39;&quot;journal/daily&quot;&#39;)
</div><div class="line" data-line="43">    .filter(d =&gt; moment(d.file.name).isBetween(start, end, undefined, &#39;[]&#39;))
</div><div class="line" data-line="44">    .sort(d =&gt; d.file.day, &#39;asc&#39;)
</div><div class="line" data-line="45">    .map(d =&gt; [f(d.file.link), p(d.follower), p(d.husband), p(d.father), p(d.health), p(d.create), p(d.work), p(d.plan)])
</div><div class="line" data-line="46">)
</div><div class="line" data-line="47">​```
</div></code></pre>
<p>This is the weekly template where all the weekly events show up. It rolls up the <a href="https://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/#weekly">daily ratings into something digestible</a>… it's pretty common for me to spot little patterns that I need to address.</p>
<p>The Goals at the top are found in the Quarterly note and roll up there eventually.</p>
<h3><a href="#️-weekly-review-fridays--4p" aria-hidden="true" class="anchor" id="️-weekly-review-fridays--4p"></a>🗃️ Weekly Review (Fridays @ 4p)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[!info] Live _coram deo_. Plan this week in the presence of God.
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## 📓 Prep
</div><div class="line" data-line="4"></span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🙏: Pray. Ask the Lord for wisdom and clarity on what is important eternally.
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📓: Review journal and [daily notes](obsidian://advanced-uri?vault=wiki&amp;commandname=Periodic%20Notes%3A%20Open%20weekly%20note).
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> ✅: What did you [accomplish](things:///show?id=logbook)?
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 💭: What can you learn from last week?
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📈: Put logged successes in [OKR system in ADP](https://workforcenow.adp.com/theme/index.html#/Myself/MyselfTabTalentCategoryPerformanceGoals).
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📝 Get Clear:
</div><div class="line" data-line="11">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Do a brain dump. Add any tasks or projects you come up with to the Things inbox.
</div><div class="line" data-line="12">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Process your physical inbox. Create tasks in Things for each item in your physical inbox that you want to take action on.
</div><div class="line" data-line="13">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Process your email inbox. Use Mail to Things to forward emails you need or want to take action on to your Things inbox.
</div><div class="line" data-line="14">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Process your Things inbox. Assign each task to an area or to a project. Tag appropriately. (:estimate, $focus, !categorize, priority)
</div><div class="line" data-line="15"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Go through each of your projects. Use the checklist[^checklist].
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">[^checklist]:
</div><div class="line" data-line="18">    ## 📂 For Each Area:
</div><div class="line" data-line="19">    - <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(underline, underline);">[</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(underline, underline);">]</span> Are your projects in correct priority order?
</div><div class="line" data-line="20">    
</div><div class="line" data-line="21"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">    ### 📁 For Each Project:
</div><div class="line" data-line="22"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Is this project still relevant?
</div><div class="line" data-line="23"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Can I delegate this project?
</div><div class="line" data-line="24"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Should I move this project to Someday?
</div><div class="line" data-line="25"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Are there are tasks I have already completed?
</div><div class="line" data-line="26"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Are there any tasks I want to delete?
</div><div class="line" data-line="27"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Am I happy with the structure of the project? E.g., should I add or change headings?
</div><div class="line" data-line="28"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Do all tasks with deadlines have the correct deadline set?
</div><div class="line" data-line="29"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Could I add useful notes to any tasks or to the project itself?
</div><div class="line" data-line="30"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Are any new tasks for this project not yet in Things?
</div><div class="line" data-line="31"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Should I convert any tasks to separate projects?
</div><div class="line" data-line="32"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] Is there a clear &#39;next action&#39; for this project? (If not, break down your projects or tasks into smaller tasks until there is a clear next action.)
</div><div class="line" data-line="33"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [ ] How can you serve and surprise in this area?
</div><div class="line" data-line="34">
</div><div class="line" data-line="35"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## 📅 Plan
</div><div class="line" data-line="36"></span>
</div><div class="line" data-line="37"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Look ahead at the week. Using Deadlines and Upcoming, examine the week and month to find tasks that need to be done, and space them out through the week.
</div><div class="line" data-line="38"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Make time for important work. Create 4 hour strategic blocks and identify some buffer blocks.
</div><div class="line" data-line="39"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Schedule in the most important task for the day. Using [Upcoming](things:///show?id=upcoming&amp;filter=%40Meazure%20Learning%2CEstimates), schedule the important task for the day.
</div></code></pre>
<p>Besides the Workday Shutdown, this is the other ritual that keeps everything running.</p>
<p>Parts of the list came from Peter Akkies, some of it is <a href="https://evantravers.com/articles/2023/01/27/weekly-reviews-in-things-app-using-shortcuts/">automated</a> now.</p>
<h3><a href="#-family-weekly-fridays--7p" aria-hidden="true" class="anchor" id="-family-weekly-fridays--7p"></a>🫂 Family Weekly (Fridays @ 7p)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># 📖 Weekly Meeting
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Rapport
</div><div class="line" data-line="4"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🙏🏻 Prayer.
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👂 How are you in one word?
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Screen Time Check
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## What&#39;s the plan?
</div><div class="line" data-line="9"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🗓 Check [last week’s entry](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aprev-weekly-note).
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📉 Check the [Monthly Plan](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aopen-monthly-note).
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📈 Check our progress against [12WY Scoreboard](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aopen-quarterly-note).
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## What should we change?
</div><div class="line" data-line="14"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🚦 Start / Stop / Continue:
</div><div class="line" data-line="15">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🟢 What should we start?
</div><div class="line" data-line="16">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🟡 What should we continue?
</div><div class="line" data-line="17">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🔴 What should we stop?
</div><div class="line" data-line="18"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🪨 Big Rocks…
</div><div class="line" data-line="19">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Spiritual Leadership?
</div><div class="line" data-line="20">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> School?
</div><div class="line" data-line="21">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Next House?
</div><div class="line" data-line="22">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Good Vibes Only?
</div><div class="line" data-line="23">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Leaving and Cleaving?
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Follow through.
</div><div class="line" data-line="26"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> ❓ Any [questions](things:///show?id=anytime&amp;filter=@Family) to answer?
</div><div class="line" data-line="27"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📆 [What are we committed to next week](fantastical2://show?date=week)?
</div><div class="line" data-line="28"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🧱 Set aside time blocks:
</div><div class="line" data-line="29">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Groceries and errands?
</div><div class="line" data-line="30">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Family-together time?
</div><div class="line" data-line="31">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Fellowship with other families?
</div><div class="line" data-line="32">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Time to work/talk together on the Big Problems?
</div><div class="line" data-line="33">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Projects? (Walking project dictation to unpack and delegate)
</div><div class="line" data-line="34"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 💴 Budget Update.
</div><div class="line" data-line="35">
</div><div class="line" data-line="36"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Reset our purpose.
</div><div class="line" data-line="37"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> ⛰ What are you going to look forward to this week?
</div><div class="line" data-line="38"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🤗 Express gratitude.
</div><div class="line" data-line="39">
</div><div class="line" data-line="40">Tags: @Family, Rituals: Weekly
</div></code></pre>
<p>This ritual changes a good bit as my wife and I find new things to work on together. One recent adjustment is to have a <code>🪨 Big Rocks</code> header that contains nudges to check in on important conversations or projects.</p>
<h2><a href="#️-monthly-journalmonthlyyyyy-mmmd" aria-hidden="true" class="anchor" id="️-monthly-journalmonthlyyyyy-mmmd"></a>🗒️ Monthly: <code>journal/monthly/YYYY-MM.md</code></h2>
<p>(Monthly doesn't have a format at the moment.)</p>
<h3><a href="#️-family-monthly-last-friday-of-month" aria-hidden="true" class="anchor" id="️-family-monthly-last-friday-of-month"></a>🗓️ Family Monthly (Last Friday of Month)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># 📆 Family Monthly Meeting
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3">The goal is to be through this in less than thirty minutes,[^format] in addition to the [[Family Weekly]].
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👈 Review the [last month&#39;s plan](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aprev-monthly-note) and [quarterly plan](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aopen-quarterly-note).
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📆 Look ahead at schedule for the month…
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🔨 Identify this month&#39;s most important event or project?
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🏆 Define success for the month. In this month…
</div><div class="line" data-line="9">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> What is a task or routine that will help us work towards best possible week sometime this month?
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📈 What micro-adjustment do we want to make to our daily schedule?
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> ⛰ What Real Life Experience are we going to have this month?
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🧘 One way we can protect margin this month is…
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🏠 Prioritize home maintenance backlog.
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🗑️ Pick a declutter space and budget time.
</div><div class="line" data-line="15"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Pick a &quot;Deep Cleaning&quot; day.
</div><div class="line" data-line="16"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 💸 Create/adjust budget goals.
</div><div class="line" data-line="17"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🛑 Block off days to succeed at our projects…
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">Tags: @Sarah Travers, Rituals: Monthly
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">[^format]: Taken in part from Plan Your Year 2020.
</div></code></pre>
<p>Family Monthly is a touchstone for making sure we understand how crammed our current commitments are and make space for weekend projects like painting or tackling a closet.</p>
<h2><a href="#️-quarterly-journalquarterlyyyyy-qnmd" aria-hidden="true" class="anchor" id="️-quarterly-journalquarterlyyyyy-qnmd"></a>🗒️ Quarterly: <code>journal/quarterly/YYYY-Q[N].md</code></h2>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># rate your outcomes from 1 to 5 in the following roles…</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">roles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Follower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Husband</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Father</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Friends</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Work</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Hobbies</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Emotions</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Mental</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Health</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Rest</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Finances</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Plan
</div><div class="line" data-line="17"></span>
</div><div class="line" data-line="18"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Goals
</div><div class="line" data-line="19"></span>
</div><div class="line" data-line="20"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">#### Goal 1: _Goal_
</div><div class="line" data-line="21"></span>
</div><div class="line" data-line="22"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">#### Goal 2: _Goal_
</div><div class="line" data-line="23"></span>
</div><div class="line" data-line="24"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Review
</div><div class="line" data-line="25"></span>
</div><div class="line" data-line="26"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Where are you in each area of life?
</div><div class="line" data-line="27"></span>​```dataviewjs
</div><div class="line" data-line="28">// we have to sort somehow, so we convert the names to numbers and sort
</div><div class="line" data-line="29">const s = function(i) &lbrace;
</div><div class="line" data-line="30">  return Number(i.replace(&#39;-Q&#39;, &#39;&#39;));
</div><div class="line" data-line="31">&rbrace;
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">const allQuarters =
</div><div class="line" data-line="34">  dv.pages(&#39;&quot;journal/quarterly&quot;&#39;)
</div><div class="line" data-line="35">    .array()
</div><div class="line" data-line="36">    .sort(function(a, b) &lbrace;
</div><div class="line" data-line="37">      return s(a.file.name) - s(b.file.name);
</div><div class="line" data-line="38">    &rbrace;)
</div><div class="line" data-line="39">
</div><div class="line" data-line="40">let currentIndex = allQuarters.findIndex((q) =&gt; q.file.name == dv.current().file.name);
</div><div class="line" data-line="41">
</div><div class="line" data-line="42">const quarters = allQuarters.slice(Math.max(currentIndex - 3, 0), currentIndex+1);
</div><div class="line" data-line="43">
</div><div class="line" data-line="44">let datasets = [];
</div><div class="line" data-line="45">
</div><div class="line" data-line="46">let trans = function(color) &lbrace;
</div><div class="line" data-line="47">  return color.replace(&#39;, 1)&#39;, &#39;, 0.5)&#39;);
</div><div class="line" data-line="48">&rbrace;
</div><div class="line" data-line="49">
</div><div class="line" data-line="50">let colors<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"> = [
</div><div class="line" data-line="51"></span>  &#39;rgba(105,105,105, 1)&#39;,
</div><div class="line" data-line="52">  &#39;rgba(169,169,169, 1)&#39;,
</div><div class="line" data-line="53">  &#39;rgba(211,211,211, 1)&#39;,
</div><div class="line" data-line="54">]
</div><div class="line" data-line="55">
</div><div class="line" data-line="56">const purple = &#39;rgba(139,108,239, 1)&#39;;
</div><div class="line" data-line="57">let highlight = &#39;#fff&#39;;
</div><div class="line" data-line="58">
</div><div class="line" data-line="59">if (document.body.classList.contains(&#39;theme-light&#39;)) &lbrace;
</div><div class="line" data-line="60">  colors.reverse();
</div><div class="line" data-line="61">  highlight = &#39;#000&#39;;
</div><div class="line" data-line="62">&rbrace;
</div><div class="line" data-line="63">
</div><div class="line" data-line="64">colors.push(purple);
</div><div class="line" data-line="65">
</div><div class="line" data-line="66">for (let i in quarters) &lbrace;
</div><div class="line" data-line="67">  let quarter = quarters[i];
</div><div class="line" data-line="68">  if (quarter.hasOwnProperty(&#39;roles&#39;)) &lbrace;
</div><div class="line" data-line="69">    let values = quarter.roles.map(o =&gt; Object.values(o)).flat()
</div><div class="line" data-line="70">
</div><div class="line" data-line="71"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">    datasets.unshift(&lbrace;
</div><div class="line" data-line="72"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  label: quarter.file.name,
</div><div class="line" data-line="73"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  data: values,
</div><div class="line" data-line="74"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  fill: true,
</div><div class="line" data-line="75"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  backgroundColor: trans(colors[i]),
</div><div class="line" data-line="76"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  borderColor: colors[i],
</div><div class="line" data-line="77"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  pointBackgroundColor: colors[i],
</div><div class="line" data-line="78"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  pointBorderColor: highlight,
</div><div class="line" data-line="79"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  pointHoverBackgroundColor: highlight,
</div><div class="line" data-line="80"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  pointHoverBorderColor: colors[i]
</div><div class="line" data-line="81"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;)
</div><div class="line" data-line="82">  </span>&rbrace;
</div><div class="line" data-line="83">&rbrace;
</div><div class="line" data-line="84">
</div><div class="line" data-line="85">let data   = dv.current().roles
</div><div class="line" data-line="86">let keys   = data.map(o =&gt; Object.keys(o)).flat()
</div><div class="line" data-line="87">
</div><div class="line" data-line="88">const chartData<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"> = &lbrace;
</div><div class="line" data-line="89"></span>  type: &#39;radar&#39;,
</div><div class="line" data-line="90">  data: &lbrace;
</div><div class="line" data-line="91">    labels: keys,
</div><div class="line" data-line="92">    datasets: datasets
</div><div class="line" data-line="93"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">  &rbrace;,
</div><div class="line" data-line="94"></span>  options: &lbrace;
</div><div class="line" data-line="95">    scales: &lbrace;
</div><div class="line" data-line="96">      r: &lbrace;
</div><div class="line" data-line="97">        suggestedMin: 0,
</div><div class="line" data-line="98">        suggestedMax: 5
</div><div class="line" data-line="99"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">      &rbrace;
</div><div class="line" data-line="100"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">    &rbrace;
</div><div class="line" data-line="101"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">  &rbrace;
</div><div class="line" data-line="102"></span>&rbrace;
</div><div class="line" data-line="103">
</div><div class="line" data-line="104">window.renderChart(chartData, this.container);
</div><div class="line" data-line="105">​```
</div><div class="line" data-line="106">
</div><div class="line" data-line="107"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Scoreboard
</div><div class="line" data-line="108"></span>​```dataviewjs
</div><div class="line" data-line="109">let check = function(bool) &lbrace;
</div><div class="line" data-line="110">  if (bool) &lbrace; return &quot;✅&quot; &rbrace;;
</div><div class="line" data-line="111">  return &quot;⛔&quot;;
</div><div class="line" data-line="112">&rbrace;
</div><div class="line" data-line="113">
</div><div class="line" data-line="114">let quarter = parseInt(dv.current().file.name.match(/Q\d/)[0].replace(&#39;Q&#39;, &#39;&#39;));
</div><div class="line" data-line="115">let year = dv.current().file.name.match(/\d&lbrace;4&rbrace;/)[0];
</div><div class="line" data-line="116">let start = (quarter-1)*13+1
</div><div class="line" data-line="117">
</div><div class="line" data-line="118">dv.table(
</div><div class="line" data-line="119">  [&quot;&quot;, &quot;Week&quot;, &quot;Goal 1&quot;, &quot;Goal 2&quot;], dv.pages(&#39;&quot;journal/weekly&quot;&#39;)
</div><div class="line" data-line="120">    .filter(function(f) &lbrace;
</div><div class="line" data-line="121">      let num = f.file.name.match(new RegExp(`$&lbrace;year&rbrace;-W(\\d+)`));
</div><div class="line" data-line="122">
</div><div class="line" data-line="123"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">      if (!num) &lbrace; return false; &rbrace;
</div><div class="line" data-line="124"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  num = parseInt(num[1]);
</div><div class="line" data-line="125"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  return num &gt;= start &amp;&amp; num &lt; start + 12;
</div><div class="line" data-line="126"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;)
</div><div class="line" data-line="127"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.sort(w =&gt; w.file.name, &#39;asc&#39;)
</div><div class="line" data-line="128"></span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.map(w =&gt; [(parseInt(w.file.name.match(new RegExp(`$&lbrace;year&rbrace;-W(\\d+)`))[1]) - start)+1, w.file.link, check(w[&quot;Goal1&quot;]), check(w[&quot;Goal2&quot;])])
</div><div class="line" data-line="129"></span>)
</div><div class="line" data-line="130">​```
</div></code></pre>
<p>I've previously <a href="https://evantravers.com/articles/2023/03/28/obsidian-12wy-review-template/">written about this template</a>… it's pretty complicated. It rolls up the weekly reports on my 12WY goals and provides an opportunity to rate myself on my roles… and see whether my goals effected any change in those roles.</p>
<h3><a href="#-12wy-every-12-weeks" aria-hidden="true" class="anchor" id="-12wy-every-12-weeks"></a>📈 12WY (Every 12 weeks)</h3>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># 🎯 12WY Review
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Open [12WY Note](obsidian://advanced-uri?vault=wiki&amp;commandid=periodic-notes%253Aopen-quarterly-note).
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Go through week reviews in Obsidian.
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> What can you learn from 12WY?
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Rate your intentions on the Wheel of Life.
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> Talk to Sarah.
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> What are you going to do next 12WY differently?
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> What are your new goals for the new 12WY?
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">Tags: !Planning, :4h, Rituals: 12WY
</div></code></pre>
<p>This is the accompanying check list that goes with the Quarterly template. It's a work in progress. I could probably stand to re-read <a href="https://evantravers.com/articles/2021/05/29/review-12-week-year/">12 Week Year</a> and adjust.</p>
<h2><a href="#️-yearly-journalyearlyyyyymd" aria-hidden="true" class="anchor" id="️-yearly-journalyearlyyyyymd"></a>🗒️ Yearly <code>journal/yearly/YYYY.md</code></h2>
<p>No template at the moment… it keeps changing.</p>
<p>The past few years I've picked <a href="https://www.themesystem.com/">a yearly theme</a> and written it in a <code>## Theme</code> header near the top of the document. This gets referenced in the Weekly template above so that I see it all year long.</p>
<h3><a href="#-yearly-review-year-end" aria-hidden="true" class="anchor" id="-yearly-review-year-end"></a>🥂 Yearly Review (Year end)</h3>
<p>I traditionally journal, do <a href="https://evantravers.com/articles/2020/12/28/plan-your-year/">Plan Your Year</a>… just think and journal. It's come naturally to me.</p>
<p>It's funny because writing/journaling about my year is probably my first and oldest ritual. A lot of the ones above exist because I realized that the clarity of review and thinking was helping me get out of trouble… and once a year is too infrequent to stay out of trouble.</p>
<p>I try to focus on gratitude. I also try to count things that are important to me:</p>
<ul>
<li>good dinners with my wife.</li>
<li>vacations</li>
<li>weekend adventures with the kids.</li>
<li>meaningful conversations.</li>
<li>prayers answered.</li>
<li>books read.</li>
</ul>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I repeat… don't copy my setup. Find one useful idea and run away. 🏃</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-lag">
<p>There is a weird thing about measuring: you should weigh yourself daily, but pay attention to your weekly or monthly average. Most of us pay too much attention to the progress equivalent daily weight and give it more mindshare than we ought. <a href="#fnref-lag" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-weak">
<p>First encountered in <a href="https://danluu.com/wat/">Dan Luu's Normalization of Deviance</a>:</p>
<blockquote>
<p>“Pay attention to weak signals” sure sounds like good advice, but how do we do it? Strong signals are few and far between, making them easy to pay attention to. Weak signals are abundant. How do we filter out the ones that aren't important? And how do we get an entire team or org to actually do it? These kinds of questions can't be answered in a generic way; this takes real thought. We mostly put this thought elsewhere.</p>
</blockquote>
<p>Weak Signals carry the same information as a Strong Signal but they usually manifest much earlier as little ripples… long before the tidal wave.</p>
<p>Weak Signals are very hard to recognize and learn from. <a href="#fnref-weak" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>ZMK Added the Apple Globe Key</title>
       <link>http://evantravers.com/articles/2023/11/09/zmk-added-the-apple-globe-key/</link>
       <pubDate>Thu, 09 Nov 2023 17:09:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/11/09/zmk-added-the-apple-globe-key/</guid>
       <description><![CDATA[ <p>I recently noticed that <a href="https://github.com/zmkfirmware/zmk/issues/947">ZMK added the &quot;globe&quot; key</a> from the Apple ecosystem to their key codes.</p>
<p>I threw it on my <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">Corne-ish Zen</a> and now I have access to <a href="https://thesweetsetup.com/global-keyboard-shortcuts-for-multitasking-in-ipados-15/">a bunch of useful power user shortcuts</a> on iPad and iOS. I particularly like starting dictation or going to the previous app.</p>
<p>I am using it as a <a href="https://zmk.dev/docs/behaviors/sticky-key">sticky modifier</a>, so I press it once and then press the next key. That lets me tuck it up in a layer, but you can use it however you want.</p>
<p>Here's <a href="https://github.com/evantravers/zmk-config/commit/8591c1022bd578681c26dd28a5fa4099eee6ab68">my commit</a>.</p> ]]></description>
    </item>
    <item>
       <title>A blog post is a very long and complex search query to find fascinating people and make them route interesting stuff to your inbox</title>
       <link>http://evantravers.com/articles/2023/11/08/a-blog-post-is-a-very-long-and-complex-search-query-to-find-fascinating-people-and-make-them-route-interesting-stuff-to-your-inbox/</link>
       <pubDate>Wed, 08 Nov 2023 18:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/11/08/a-blog-post-is-a-very-long-and-complex-search-query-to-find-fascinating-people-and-make-them-route-interesting-stuff-to-your-inbox/</guid>
       <description><![CDATA[ <p>The title says it all.</p>
<p>The essay says more… and rings true with my experience.</p>
<blockquote>
<p>I had written an essay about Ivan Illich and systems thinking, a topic I had never found anyone else intrigued by, and which magazines thought below a rejection letter—and the internet had suddenly reshaped itself so that my keyboard hooked up to the screens of a bunch of people who wanted to talk about these topics, and a little later, their keyboards hooked up to mine.</p>
<p>I had written for 15 years, but never before had this happened. I had conjured a minor conference! And I hadn’t even known that you could do that.</p>
</blockquote>
<p>Write and publish. The more specific and true to you the better. If you have a same path of conversation twice with different friends… that would probably be a good blog post.</p><p><a href="https://www.henrikkarlsson.xyz/p/search-query" class="u-in-reply-to  is-reply">A blog post is a very long and complex search query to find fascinating people and make them route interesting stuff to your inbox - www.henrikkarlsson.xyz</a></p> ]]></description>
    </item>
    <item>
       <title>Opportunity Solution Trees</title>
       <link>http://evantravers.com/articles/2023/10/25/opportunity-solution-trees/</link>
       <pubDate>Wed, 25 Oct 2023 10:05:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/10/25/opportunity-solution-trees/</guid>
       <description><![CDATA[ <div class="admonition Summary">
<p>An expert Mental Model unpacking how an experienced Product Manager connects Solutions to Outcomes and prioritizes Experiments. The tree broadens the horizon past the first Solution found, compares Opportunity-connected Solutions, and prioritizes Experiments.</p>
</div>
<p><img src="https://images.evantravers.com/articles/2023/10/ost.png" alt="Opportunity Solution Tree" /></p>
<h2><a href="#steps" aria-hidden="true" class="anchor" id="steps"></a>Steps</h2>
<ol>
<li>Identify a clear <code>Desired Outcome</code>.</li>
<li>Product <code>Opportunities</code> to drive that outcome should emerge from user/market needs discovered during generative research.</li>
<li><code>Solutions</code> come from everywhere… but they should connect to an <code>Opportunity</code>.</li>
<li><code>Experiment</code> to evaluate and evolve <code>Solutions</code>.<sup class="footnote-ref"><a href="#fn-lean" id="fnref-lean" data-footnote-ref>1</a></sup></li>
</ol>
<h2><a href="#reframing-for-wide-discovery" aria-hidden="true" class="anchor" id="reframing-for-wide-discovery"></a>Reframing for Wide Discovery</h2>
<p>Torres was inspired by Reframing Questions<sup class="footnote-ref"><a href="#fn-reframe" id="fnref-reframe" data-footnote-ref>2</a></sup> to broaden stakeholder's mindset with an additional logic layer of the <code>Opportunity</code>. As humans we typically fixate on the first discovered <code>Solution</code>, yet we actually want as <em>many</em> to investigate and explore as possible.<sup class="footnote-ref"><a href="#fn-discovery" id="fnref-discovery" data-footnote-ref>3</a></sup></p>
<h2><a href="#prioritization-through-connection" aria-hidden="true" class="anchor" id="prioritization-through-connection"></a>Prioritization through Connection</h2>
<p>By tying the <code>Solution</code> to an <code>Opportunity</code> (the user problem it is attempting to solve) you can reason more clearly and prioritize ruthlessly.</p>
<p>Attempting a broad &quot;whether or not&quot; decision on a particular <code>Solution</code> can be a stalemate.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>4</a></sup></p>
<p>Using a Opportunity Solution Tree:</p>
<p>We can quickly discard <code>Solutions</code> that aren't tied to an <code>Opportunity</code> that drives our <code>Desired Outcome</code>.</p>
<p>Next we can bound our decision to &quot;compare and contrast&quot; <code>Solutions</code> related to the same high-value and real <code>Opportunities</code>. We then craft <code>Experiments</code> to measure the effectiveness of these <code>Solutions</code>, guided by the <code>Opportunity</code>'s framing to narrow our measurements.</p>
<p>Related:</p>
<ul>
<li>Introduced to me by Dave Masom of <a href="https://conserv.io">Conserv</a></li>
<li>From <em>Continuous Discovery Habits</em> by Teresa Torres (<a href="https://andrewclark.co.uk/product-book-summaries/continuous-discovery-habits">Amazing summary by Andrew Clark here</a>)</li>
<li>Source: <a href="https://evantravers.com/articles/2020/07/09/outcomes-over-outputs/">https://www.producttalk.org/opportunity-solution-tree/</a> and a couple related blog posts and podcasts.</li>
<li><code>Desired Outcome</code> -&gt; <code>Outcomes</code> :: <code>Solutions</code> -&gt; <code>Outputs</code> (<a href="https://evantravers.com/articles/2020/07/09/outcomes-over-outputs/">Outcomes over Outputs</a>) Opportunity Solution Trees is a lens on these related concepts. The exercises and visuals can untangle an existing concept space that may be too solution heavy and needs a tie-breaker.</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-lean">
<p>It feels like <a href="https://evantravers.com/articles/2019/07/31/books-and-links-july/#lean-ux-by-jeff-gothelf-and-josh-seiden">Lean UX by Jeff Gothelf</a> would work well here. <a href="#fnref-lean" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-reframe">
<p>Bernie Roth used a powerful question to drive past Buyers are Liars to get at the truth. After asking people what they wanted, he asked</p>
<blockquote>
<p>If you had whatever you wrote down today, what would that do for you?</p>
</blockquote>
<p>He drove past the expressed <code>Solution</code> to discover the true <code>Desired Outcome</code>. Exploring past the Output to determine the Outcome. (<a href="https://evantravers.com/articles/2020/07/09/outcomes-over-outputs/">Outcomes over Outputs</a>)</p>
<p>He then broadened that initial <code>Solution</code> by asking</p>
<blockquote>
<p>How else might you {accomplish the same goal}?</p>
</blockquote>
<p>This prevented being fixated on the first potential path and creating a tree of paths to explore. He was reframing the expressed <code>Solution</code> desire into a <code>Desired Outcome</code>… the truth of what the attendee was attempting to accomplish <a href="#fnref-reframe" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-discovery">
<p>Similar to Discovery step of Double Diamond Design Process. The Double Diamond Design Process describes a double sequence of Divergent and Convergent Thinking. It's common for people thinking about Service Design.</p>
<p><img src="https://images.evantravers.com/articles/2023/10/double-diamond.png" alt="double diamond" /></p>
<p>According to <em>Org Design for Design Orgs</em> by Peter Merholz, Kristin Skinner, the Execution step is really a series of smaller Execution steps (iteration and implementation). How the Plan is framed determines how effective the Execution step will be. <a href="#fnref-discovery" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-1">
<blockquote>
<p>We can argue all day, but we won’t make any progress if we spend all of our time debating the merits of each solution.</p>
<p>Instead, we want to consider which problem each solution solves and instead make a decision about which problem leads to a more valuable opportunity.</p>
</blockquote>
<p>Source: <a href="https://www.producttalk.org/2016/08/opportunity-solution-tree/">https://www.producttalk.org/2016/08/opportunity-solution-tree/</a> <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Ripples Across the Web</title>
       <link>http://evantravers.com/articles/2023/10/05/ripples-across-the-web/</link>
       <pubDate>Thu, 05 Oct 2023 08:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/10/05/ripples-across-the-web/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>A fun sequence of events…</p>
<ol>
<li>I saw a novel question on my For You page, <a href="https://twitter.com/evantravers/status/1688651100973375488">searched Google domains and responded</a>.</li>
<li>Over the following week I got notifications as Benten built <a href="https://footer.design">footer.design</a></li>
<li>Yesterday <a href="https://robinrendle.com/notes/footer.design-/">Robin noted it</a>. I saw it on RSS and giggled.</li>
<li>sidebar.io <a href="https://sidebar.io/date/2023-10-05">reported it today</a>.</li>
</ol>
<p>Benten did all the work, but it <strong>is</strong> fun being a tiny part of pushing it over the edge.</p> ]]></description>
    </item>
    <item>
       <title>Achievement 🔓 : Mentioned in Whitepaper</title>
       <link>http://evantravers.com/articles/2023/10/04/achievement-unlocked-mentioned-in-whitepaper/</link>
       <pubDate>Wed, 04 Oct 2023 14:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/10/04/achievement-unlocked-mentioned-in-whitepaper/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I love getting emails from y'all… but last month I got a unique one:</p>
<blockquote>
<p>I am currently investigating the presence of humor in software. […]</p>
<p>We noticed this post on your website where you mention using lolcommits for <a href="https://evantravers.com/articles/2019/11/21/making-a-book-using-ruby/">your (rather creative!) personal project</a>[…]</p>
<p>Would you be available for meeting with us online to discuss it further, and for sharing your insight on humor in software?</p>
</blockquote>
<p>I had the opportunity to chat with them… and now I'm mentioned in <a href="https://drive.google.com/drive/folders/1gtBLwHIdQ3klP4TYq0PMw9djVc4R9Frd?usp=sharing">an academic whitepaper</a>.</p>
<p>It's neat (and very random!) what can happen when you work in public.</p> ]]></description>
    </item>
    <item>
       <title>Converting H1 to Inline Notes for Evergreen Notes</title>
       <link>http://evantravers.com/articles/2023/09/29/converting-h1-to-inline-notes-for-evergreen-notes/</link>
       <pubDate>Fri, 29 Sep 2023 10:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/09/29/converting-h1-to-inline-notes-for-evergreen-notes/</guid>
       <description><![CDATA[ <p>My friend Joschua wrote recently about the <a href="https://joschua.io/posts/2023/09/16/three-tips-for-better-obsidian-notes/#2-enable-inline-titles">virtues of Inline Titles in note-making</a>. I've been solidly on the &quot;Title &amp; H1&quot; camp for a while, but I've also been manually keeping them synced.</p>
<p>I was asking Joschua what he did to migrate his notes over to inline titles… and he replied he's been manually changing them as he encounters it in his notes. So I wrote him a script:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># work through every file ending in .md</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Dir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">glob</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./**/*.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># extract the left part of the filename</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># read the file</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">read</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># split the file into an array of strings</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># find a line that matches the filename</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">matching_title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_index</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\s</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">matching_title</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># find block of empty lines</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blank_lines</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">matching_title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">while</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blank_lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blank_lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\s</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blank_lines</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19">
</div><div class="line" data-line="20">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># remove the header matching the title and following blank lines</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">matching_title</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blank_lines</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://gist.github.com/evantravers/dbe040f37c3b10fcf82f5296435a2fa1">headers.rb</a>)</p>
<div class="admonition warning">
<p>This script is destructive and changes your files without warning!</p>
</div>
<p>I would counsel only running it on a backed-up folder if you are comfortable with scripts.</p>
<p>If this transformation is something you want and you need help, you can <a href="/contact">message me</a>.</p>
<p>If there was enough interest, I'm sure the basic logic could be translated to JavaScript and turned into a plugin for folks that want to embrace inline titles in their Obsidian notes.</p> ]]></description>
    </item>
    <item>
       <title>Bug Hunting</title>
       <link>http://evantravers.com/articles/2023/09/27/bug-hunting/</link>
       <pubDate>Wed, 27 Sep 2023 11:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/09/27/bug-hunting/</guid>
       <description><![CDATA[ <p>Talking with some new colleagues at work, this old programming war story from a decade ago came to mind. My memory on all the details is fuzzy<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> but here's what I recall:</p>
<p>I was working for a web development company doing a lot of local e-commerce. Everything was on FTP, one staging server and one live server. While I was using git for personal projects (even though the computer science department in college didn't teach it!) I tried to evangelize it at work, but people thought it was needlessly complex and time-wasting. 🤷</p>
<p>I did a lot of support tickets and content changes for clients, but had somewhat specialized in a complicated wedding registry script that we often sold to e-commerce clients.</p>
<p>That day I got a familiar tasking: an older customer wanted the additional feature I had programmed for a newer client.</p>
<p>I copied the newer registry file over to the client folder, updated the client-specific IDs in the SQL queries, added the feature, refreshed my browser and clicked around to dev test my work. I logged my time, and sent the URL over to the project manager to say I was done, and moved on to the next support ticket.</p>
<p>My project manager Google Chat'd me: &quot;hey man, this isn't done.&quot; Annoyed, I dropped the task I was now working and clicked back over and sure enough the page was broken. I opened up the file, scanned through and made all the changes again. This time I browser tested in both my browser and the project manager's preferred variant, and marked it as done. After lunch I got another message: &quot;Still broken.&quot;</p>
<p>Over the next few days this loop continued. I'd fix the bug, it would work for me, I'd send it off to the PM, and he would lightly scold me for not finishing my work. I'd wrap up whatever I was then fixing, take another stab at the changes, and the cycle would continue.</p>
<p>Needless to say, my project manager and I were both getting really annoyed with each other.</p>
<p>I was encountering some kind of bug… but I was having a hard time determining what was breaking. As a junior developer there were a lot of systems at play that I didn't understand: a shared database with live and changing data, CSS and HTML bugs between browsers, and a complex homebrew CMS with no documentation. I didn't yet have the system understanding to determine what system drove what behavior… so I tried brute force for far too long.</p>
<p>Finally I sat down, stopped multitasking, and slowly worked through the problem, instrumenting the solution with print-to-screen logging and comments… until I yelled with victory and anger.</p>
<p>I walked into the next room, unplugged a computer, waited six hours, and the application was fixed permanently.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>While working on the logging I saw that the file had magically reverted back to the start of the process. Using my FTP client I inspected the file and discovered that the last modified username was from an employee that had been on vacation that week…</p>
<p>I was right, and my project manager was right. I had correctly installed the registry, but my changes had not stayed on the server.</p>
<p>It turns out that the other developer had opened the whole folder in Homesite+ on his work laptop and then left. He had set his editor to autosave his open work every five minutes or so… and therefore his sleeping computer was clobbering my work, usually right around the time I would send it to my Project Manager.</p>
<p>With permission from the boss, I unplugged his laptop, waited for the battery to die, then finished the feature in seconds… I had already written it a hundred times already.</p>
<p>After this horribleness… I learned how to use <a href="https://github.com/git-ftp/git-ftp">git-ftp</a> and never lost my work again… even though the company never used git while I was there.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I wasn't then the journaling freak that I am now… <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Export Things to Todoist</title>
       <link>http://evantravers.com/articles/2023/09/25/export-things-to-todoist/</link>
       <pubDate>Mon, 25 Sep 2023 08:30:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/09/25/export-things-to-todoist/</guid>
       <description><![CDATA[ <div class="admonition download">
<p><a href="https://www.icloud.com/shortcuts/92b5ab39f9a04548bcc393b1b9fb70e7">📥 Download Things ➡️ Todoist.shortcut</a></p>
</div>
<div class="admonition update">
<div class="admonition__title">Updates</div>
<p><ul>
<li>2024-12 I've updated the shortcut after Things' lovely API update.</li>
<li>2026-06 Lucas emailed me to tell me Todoist's API URL has changed.</li>
</ul></p>
</div>
<p>Todoist recently rolled out <a href="https://todoist.com/help/articles/5332270837276">a new version featuring task duration and therefore time-blocking</a>. 🤯</p>
<p>So I've been slaving over a crazy Shortcut to export my Things data to Todoist. 🤷 The pseudocode is basically:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Get API key
</div><div class="line" data-line="2">Make Lookup dictionary
</div><div class="line" data-line="3">For each Area in Things:
</div><div class="line" data-line="4">    Create Todoist Project
</div><div class="line" data-line="5">    Store Things ID -&gt; Todoist Project ID in Lookup
</div><div class="line" data-line="6">    For each Project in Area:
</div><div class="line" data-line="7">        Create Todoist Project with Area ID as Parent
</div><div class="line" data-line="8">        Store Things ID -&gt; Todoist Project ID in Lookup
</div><div class="line" data-line="9">        For each Header in Project:
</div><div class="line" data-line="10">            Create Todoist Section with Project as Parent
</div><div class="line" data-line="11">            Store Header Name -&gt; Section ID in Lookup
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">For each To-Do:
</div><div class="line" data-line="14">    If has a Header:
</div><div class="line" data-line="15">        Create Todoist Task using the Lookup to find Header&#39;s Section ID
</div><div class="line" data-line="16">        Set Task ID to returned Todoist Task ID
</div><div class="line" data-line="17">    Else
</div><div class="line" data-line="18">        If has a Parent:
</div><div class="line" data-line="19">            Find Parent ID -&gt; Todoist Project ID using Lookup
</div><div class="line" data-line="20">            Create Todoist Task with Parent ID
</div><div class="line" data-line="21">            Set Task ID to returned Todoist Task ID
</div><div class="line" data-line="22">        Else
</div><div class="line" data-line="23">            Create Todoist Task
</div><div class="line" data-line="24">            Set Task ID to returned Todoist Task ID
</div><div class="line" data-line="25">    If Things To-Do has Deadline:
</div><div class="line" data-line="26">        Update Task ID with Deadline
</div><div class="line" data-line="27">    If Things To-Do has When:
</div><div class="line" data-line="28">        Create &quot;Start: Task&quot; sub-task with Parent -&gt; Task ID
</div><div class="line" data-line="29">    If Things To-Do has Checklist:
</div><div class="line" data-line="30">        For each item in Checklist:
</div><div class="line" data-line="31">            Create Sub-Task with Parent -&gt; Task ID
</div></code></pre>
<p>As complex as that is... <a href="https://images.evantravers.com/articles/2023/09/shortcut.JPG">it's worse in the Shortcuts editor.</a></p>
<p>Programming in Shortcuts sometimes feels like parenting a toddler: you have to say the same things multiple times, and most of the time neither you nor the child  can remember if you've already dealt with this issue. I <em>swear</em> Shortcuts destroys or forgets a nested variable at random.</p>
<p>And the scroll-jacking! If Shortcuts would stop yanking my screen around! But I digress:</p>
<p>If nothing else… some things I learned:</p>
<ul>
<li>Don't. Copy. Actions. With. Variables. 😤</li>
<li>Use Reveal on nested variables to ensure it is pointed at the right objects.</li>
</ul>
<p>The export currently:</p>
<ul>
<li>translates Areas, Projects, and Headers into nested Projects with Sections</li>
<li>imports:
<ul>
<li>Title and Content</li>
<li><strike>Tags</strike> (For some reason, the Shortcut Export <em>wipes</em> this out every time!)</li>
<li>When (as a meta-start task)</li>
<li>Deadline</li>
<li>Checklists</li>
</ul>
</li>
</ul>
<p>It does not:</p>
<ul>
<li>save Project notes</li>
<li>handle repetition schedules</li>
<li>Reminders</li>
<li>Evening</li>
<li>import Logged projects or tasks</li>
<li>handle Headers with the same string in different Projects. I just renamed mine.</li>
</ul>
<p>It runs relatively quickly on my small-ish database of 200ish active tasks. It has to do a lot of little API calls to function, so it's possible you may run into Todoist's rate limit with a larger database.</p>
<h2><a href="#install" aria-hidden="true" class="anchor" id="install"></a>Install</h2>
<ol>
<li>Download the Shortcut here: <a href="https://www.icloud.com/shortcuts/92b5ab39f9a04548bcc393b1b9fb70e7">Things ➡️ Todoist</a></li>
<li>Be on the <a href="https://todoist.com/pricing">Pro plan of Todoist</a>.</li>
<li><a href="https://todoist.com/help/articles/find-your-api-token">Get your API key</a> for Todoist ready.</li>
<li>Run the shortcut, pasting in the API when prompted.</li>
<li>Reply &quot;Always&quot; when Shortcuts asks permission to use Things data.</li>
<li>Profit.</li>
</ol>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>Shortcuts are finicky… but if you run into any problems, <a href="/contact">drop me a line</a> and I'll try to help.</p> ]]></description>
    </item>
    <item>
       <title>The Mystery of the Bloomfield Bridge</title>
       <link>http://evantravers.com/articles/2023/09/02/the-mystery-of-the-bloomfield-bridge/</link>
       <pubDate>Sat, 02 Sep 2023 10:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/09/02/the-mystery-of-the-bloomfield-bridge/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I have never been so fascinated by a bridge in my life. Tyler's enthusiasm for local history is infectious and delightful. It's inspiring and super fun… the lengths to which he goes!</p>
<blockquote>
<p>While I am dedicated to this search, I am not about to fly down to Kansas City to dig through federal archives, especially when those documents may or may not be there...</p>
<p>...just kidding. Of course I flew down to Kansas City to dig through the federal archives!</p>
</blockquote>
<p>I miss the old internet that was mostly wonderful humans answering questions they posed themselves.</p>
<p>There's also a good warning to ask an expert early in your project… they have hard-earned heuristics:</p>
<blockquote>
<p>She told me to stop looking at old documents: &quot;no one writes down the real reason for infrastructure projects.&quot; She said I needed to look for <em>people in power</em>. Specifically, if I want to prove my theory, I should look for people who would be connected to both the church and the bridge.</p>
</blockquote>
<p>If you like ridiculous researched rants and history (with a touch of UX desire paths!) then give this a read.</p><p><a href="https://tylervigen.com/the-mystery-of-the-bloomfield-bridge" class="u-in-reply-to  is-reply">The Mystery of the Bloomfield Bridge - tylervigen.com</a></p> ]]></description>
    </item>
    <item>
       <title>You Should Use: Excalidraw</title>
       <link>http://evantravers.com/articles/2023/08/22/you-should-use-excalidraw/</link>
       <pubDate>Tue, 22 Aug 2023 11:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/08/22/you-should-use-excalidraw/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/08/cycle.png"></p><p><a href="https://excalidraw.com/">Excalidraw</a> is a free whiteboarding app I use constantly. Its expressive but simple tooling focuses on collaboration and sense-making instead of obsessing with perfection. It's simply the best.</p>
<h2><a href="#simple-tools" aria-hidden="true" class="anchor" id="simple-tools"></a>Simple Tools</h2>
<p><img src="https://images.evantravers.com/articles/2023/08/tools.png" alt="tools" /></p>
<p>If you can hold a marker, you can use a whiteboard. It's a level playing field. Excalidraw is mouse-centric but usable on a touch screen. If you have a screen you can participate.</p>
<h2><a href="#sharing" aria-hidden="true" class="anchor" id="sharing"></a>Sharing</h2>
<p>It has the simplest security model. You can share a unique link, anyone with that link can edit anything. It's straightforward and a delight after doing the permissions dance with so many other tools.</p>
<h2><a href="#keyboard-shortcuts" aria-hidden="true" class="anchor" id="keyboard-shortcuts"></a>Keyboard Shortcuts</h2>
<p>As you may know, I <a href="https://evantravers.com/articles/tags/keyboards/">love my keyboard shortcuts</a> and it has really smart shortcuts covering most of it't shortcuts covering most of it's tooling. If nothing else, <code>⌘⌥-C</code> to copy your selection to clipboard as PNG is perfect for sharing a quick thought in a chat or pasting into a Confluence wiki.</p>
<h2><a href="#open-source" aria-hidden="true" class="anchor" id="open-source"></a>Open Source</h2>
<p><img src="https://images.evantravers.com/articles/2023/08/tolerance.png" alt="obsidian" /></p>
<p>Open-source means that I can use a plugin to embed Excalidraw in my Obsidian note-taking app as editable vector illustrations for my notes… I can even modify them on my phone or iPad.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>Give it a try next time you find yourself waving your hands in the air on a video-call.</p> ]]></description>
    </item>
    <item>
       <title>Visualizing Bookworm</title>
       <link>http://evantravers.com/articles/2023/08/19/visualizing-bookworm/</link>
       <pubDate>Sat, 19 Aug 2023 09:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/08/19/visualizing-bookworm/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/08/livebook.png"></p><pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Mix</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">install</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:req</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~&gt; 0.3.0&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:floki</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~&gt; 0.34.0&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:kino_explorer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~&gt; 0.1.4&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:libgraph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~&gt; 0.16.0&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<h2><a href="#-why" aria-hidden="true" class="anchor" id="-why"></a>🤔 Why?</h2>
<p><a href="https://bookworm.fm/">Bookworm</a> is one of my favorite podcasts. Like many listeners I use it as a filter to find quality books to add to my queue. I love how the hosts don't just read but engage with the material, holding each other accountable with takeaways and challenges.</p>
<p>A recurring joke in Bookworm is how many times they refer to <a href="https://bookworm.fm/42/">Ep. 42, How To Read a Book by Mortimer Adler</a>. The last few times they've made that joke I've wanted to actually visualize that graph. I know Mike loves Obsidian, I love Elixir and have been learning <a href="https://livebook.dev/">Livebook</a>… let's play!</p>
<p>(Livebook is a markdown-based workbook system (similar to Jupyter notebooks) that uses erlang/elixir. This blog post is mostly written in Livebook and ran in Livebook. I exported the content and output, added some screenshots, and here we are! You could actually take the markdown source of this post and open it in Livebook. Pretty cool.)</p>
<h2><a href="#-scraping" aria-hidden="true" class="anchor" id="-scraping"></a>🎣 Scraping</h2>
<p>The first thing is to scrape the pages for processing and evaluation. One lovely thing about Livebook is that if you structure each code block separately, it intelligently memoizes each variable and only re-evaluates them if the structure changes.</p>
<p>Previously, I had used <a href="https://github.com/edgurgel/httpoison">HTTPoison</a> to do some downloading, but my friend <a href="http://megalithic.io">Seth</a> has recommended <a href="https://github.com/wojtekmach/req">Req</a>, so let's give that a whirl.</p>
<p>Adding the following to the setup:</p>
<!-- livebook:{"force_markdown":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Mix</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">install</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:req</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~&gt; 0.3.0&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Now I can see if I can hit the opening page:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Req</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;!DOCTYPE html&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;html lang=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">en-US</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> xmlns:og=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http://ogp.me/ns#</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> &lt;&gt; …
</div></code></pre>
<p>Success! Let's be a little more intentional.</p>
<p>Bookworm's website is structured logically. Every episode will be in the form <code>https://bookworm.fm/1/</code> up to <code>https://bookworm.fm/&lt;current&gt;/</code>. The most recent post is the top <code>&lt;h2&gt;</code> on the page.</p>
<!-- livebook:{"break_markdown":true} -->
<p>Now I can hone the CSS selector I need to get the most current link. What's really nice (again) about Livebook is that as I rerun the code over and over… I'm not pummeling my internet friends' server with requests. Livebook's cells have localized and memoized all the variables.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">most_recent_episode_number</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Req</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parse_document!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;h2 a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">List</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attribute</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;href&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">List</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">String</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trim: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">List</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">last</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">String</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_integer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">176</span>
</div></code></pre>
<p>☝️ This is a super gross way to do this, but I can fix it later.</p>
<p>Anyway. Excelsior!</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">raw_episodes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">most_recent_episode_number</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/&quot;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># going to be important later! (basically the private key for the episode)</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request: </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Req</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Req.Response</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">status: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">200</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headers: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;connection&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;keep-alive&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;content-length&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;13177&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">        …
</div><div class="line" data-line="9">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;x-fw-type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;FLYWHEEL_BOT&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;!DOCTYPE html&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;html lang=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">en-US</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> &lt;&gt; …<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">private: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/1/&quot;</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>…<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">  …
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div></code></pre>
<p>The first time I tried this, I forgot the trailing slash at the end of the URL and was getting tons of redirects (I'm guessing to the URI with the trailing slash.) 🤷</p>
<p>Let's do some cleanup on this… we don't care about all the html, just the bit inside the main area.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">raw_episodes</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episode</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parse_fragment!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;article&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="13">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attribute</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;href&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">List</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;h1&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="24">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span>
</div><div class="line" data-line="25">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;.entry-time&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attribute</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;datetime&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">List</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DateTime</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from_iso8601</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="29">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># </span><span style="color: light-dark(#ffffff, #0d1117); background-color: light-dark(#d0d7de, #7d8590); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">TODO</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> this should be a `with` block</span>
</div><div class="line" data-line="30">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="31">
</div><div class="line" data-line="32">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episode</span>
</div><div class="line" data-line="33">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:floki_article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="34">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Floki</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sep: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="35">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="36">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="37">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:published</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="38">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;1: Getting Things Done by David Allen July 7, 2016  • 1 hour 08 minutes Welcome to Bookworm! To kick things off, we’ve reread a book we both rely on heavily in our lives, Getting Things Done by David Allen. This is the best discussion either of us have had about GTD in a long time. Joe Buhlig Mike Schmitz 33: Analog vs. Digital with Mike Schmitz TPS57: Advanced OmniFocus Setup + Workflow w/ Joe Buhlig Getting Things Done by David Allen Defer Dates in OmniFocus 43 Folders – Merlin Mann SaneBox – Email Management for Any Inbox JIRA Software – Atlassian Confluence – Atlassian The Organized Mind by Daniel J. Levitin Deep Work by Cal Newport Mike&#39;s Rating: 4</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> Joe&#39;s Rating: 5 http://traffic.libsyn.com/bookworm/BW001.mp3 Podcast:  Play in new window  |  Download  (Duration: 1:08:39 — 63.0MB) Subscribe:  Apple Podcasts  |  RSS&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floki_article: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;article&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">       <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="7">         <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;class&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">         …
</div><div class="line" data-line="9">       <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://joebuhlig.com&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://mikeschmitz.me/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://joebuhlig.com/33/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://www.asianefficiency.com/podcast/057-joe-buhlig/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0143126563/ref=sr_1_1?tag=bookwormfm-20&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://discourse.omnigroup.com/t/defer-date-how-to-use/1046&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://www.43folders.com/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="15">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://www.sanebox.com/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.atlassian.com/software/jira&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.atlassian.com/software/confluence&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.amazon.com/Organized-Mind-Thinking-Straight-Information/dp/0147516315/ref=sr_1_1?tag=bookwormfm-20&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692/ref=sr_1_1?tag=bookwormfm-20&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://traffic.libsyn.com/bookworm/BW001.mp3&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://traffic.libsyn.com/bookworm/BW001.mp3&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="20">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://traffic.libsyn.com/bookworm/BW001.mp3&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="21">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://itunes.apple.com/us/podcast/bookworm/id1132102092?mt=2&amp;ls=1#episodeGuid=http%3A%2F%2Fbookworm.fm%2F%3Fp%3D12&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="22">     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/feed/podcast/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">request: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Req.Response</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="24">        …
</div><div class="line" data-line="25">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="26">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>…<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="27">  …
</div><div class="line" data-line="28"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div></code></pre>
<p>Everytime I create one of these tiny blocks, it feels wrong to my DRY-trained programming brain, but I know from experience with Livebooks that it rewards little iterative steps.</p>
<p>I've thought of a several different things I want to do with this:</p>
<ul>
<li>a table of &quot;most linked to episodes&quot;</li>
<li>a graph showing all the links</li>
<li>transformation to markdown notes that could be stuck in someone's (<em>cough</em> Mike <em>cough</em>) Obsidian.</li>
</ul>
<p>Let's go!</p>
<h2><a href="#️-graphs-and-maps" aria-hidden="true" class="anchor" id="️-graphs-and-maps"></a>🗺️ Graphs and Maps</h2>
<p>I thought that the first thing I'm going to need to do is to transform this list of raw bodies into something that we can actually work with and display as a table.</p>
<p>I started to add a Smart Cell Data Explorer, which will automatically add dependencies for all it's plugins and things… but I'm running into it freaking out over the EasyHTML/Floki structs… let's go for the throat and try the graph.</p>
<p>I've done this before for <a href="https://adventofcode.com">Advent of Code</a>, so excuse the magic… 🧙</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_edge</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">label_vertex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#Graph&lt;type: directed, num_vertices: 2201, num_edges: 4844&gt;</span>
</div></code></pre>
<p>Hey presto, we have a Graph object! We can now run lots of algorithms on the graph, see strongly connected components, find backlinks, all that good stuff.</p>
<p>But now we need to display it… the naive way with Graphviz!</p>
<p>LibGraph supplies a <code>Graph.to_dot/1</code> method that graphviz can read:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dot_output</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_dot</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dot_output</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1">…
</div><div class="line" data-line="2">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1209938012</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3153079849</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">weight</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1209938012</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3305474943</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">weight</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1209938012</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3354501824</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">weight</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1209938012</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3484679997</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">weight</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="6">    …
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="8">
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span>
</div></code></pre>
<p>Ordinarily we could paste that into something like <a href="https://dreampuf.github.io/GraphvizOnline">Graphviz Online</a> and we'd be done, but Mike and Joe have linked a <em>lot</em> of links.</p>
<p>Let's output a file for safekeeping.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/output.dot&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dot_output</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span>
</div></code></pre>
<p>The <code>output.dot</code> file is understandable by Graphviz tooling:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">System</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">shell</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/opt/homebrew/bin/sfdp -Tpng </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/output.dot &gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/sfdp.png&quot;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p><img src="https://images.evantravers.com/articles/2023/08/graph.png" alt="" /></p>
<p>This whole bit takes a long time… there's a lot of edges.</p>
<p>I spent some time staring at the initial visualization and realized a few things would need to e straightened up above:</p>
<ul>
<li><input type="checkbox" disabled="" /> I need to filter out some really common noisy URLs, like libsyn and iTunes.</li>
<li><input type="checkbox" checked="" disabled="" /> I needed to get the episode title or name of the book to label those nodes, maybe set them apart visually.</li>
</ul>
<p>Normally I'd just keep working &quot;down&quot; the workbook, but to save on network calls it's easier to get the title when I'm doing the <code>Req.get!</code>.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filtered_graph</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ep</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">put</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ep</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># one domain</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">String</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~</span>r/<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span>https:<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\/</span>bookworm<span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\.</span>fm/<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_edge</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">label_vertex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Let's see if that filtering creates a better graphviz image…</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/output2.dot&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_dot</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filtered_graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">System</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">shell</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/opt/homebrew/bin/sfdp -Tpng </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/output2.dot &gt; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/filtered.png&quot;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p><img src="https://images.evantravers.com/articles/2023/08/filtered.png" alt="" /></p>
<p>Better… somewhere I had to cut the code for labeling the bookworm vertices, unsure why that broke. Once again, I'm sure I could pass some better options to graphviz to emulate Obsidian… orrrrr…</p>
<h2><a href="#markdown-for-obsidian" aria-hidden="true" class="anchor" id="markdown-for-obsidian"></a>Markdown for Obsidian</h2>
<p>I decided to shift course and try a straightforward and explorable visualization: use <a href="https://obsidian.md">Obsidian</a> to visualize the connections.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">System</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;rm&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;--rf&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/episodes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">System</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cmd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;mkdir&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/episodes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">String</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;-&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">safe_title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">String</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;-&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;&quot;
</div><div class="line" data-line="14">  # </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">  ## Mentions:
</div><div class="line" data-line="19">  </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]]&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="20">  &quot;&quot;&quot;</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">__DIR__</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/episodes/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">safe_title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="2"> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3"> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> …<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div></code></pre>
<p>This creates a folder called <code>episodes</code> wherever the <code>.livemd</code> file lives. Open that folder as a vault in Obsidian, and you'll get something like this:</p>
<!-- livebook:{"break_markdown":true} -->
<p><img src="https://images.evantravers.com/articles/2023/08/obsidian_graph.png" alt="" /></p>
<!-- livebook:{"break_markdown":true} -->
<p>That's pretty good… but let's set up some data science-y stuff.</p>
<h2><a href="#️-data" aria-hidden="true" class="anchor" id="️-data"></a>⚗️ Data</h2>
<p>Let's quickly build a list of <code>Map</code> objects that Livebook's Explorer Dataframes can understand. We'll use a Graph function on the graph object we built earlier in the workbook to find the number of vertices (links) that have an edge to the current episode… essentially how many &quot;backlinks.&quot;</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">episodes</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published: </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DateTime</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_iso8601</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">published</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks: </span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Graph</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in_edges</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">graph</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">count</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<!-- livebook:{"output":true} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">13</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;1: Getting Things Done by David Allen&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/1/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">10</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;2: The Willpower Instinct by Kelly McGonigal&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/2/&quot;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">7</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;3: The War Of Art by Steven Pressfield&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://bookworm.fm/3/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>…<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">  …
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div></code></pre>
<!-- livebook:{"attrs":{"assign_to":null,"collect":true,"data_frame":"backlinks","data_frame_alias":"Elixir.Explorer.DataFrame","is_data_frame":false,"lazy":true,"missing_require":"Elixir.Explorer.DataFrame","operations":[{"active":true,"column":null,"data_options":{"backlinks":"integer","title":"string","url":"string"},"datalist":[],"filter":null,"operation_type":"filters","type":"string","value":null}]},"chunks":null,"kind":"Elixir.KinoExplorer.DataTransformCell","livebook_object":"smart_cell"} -->
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Explorer.DataFrame</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backlinks</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Explorer.DataFrame</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p><img src="https://images.evantravers.com/articles/2023/08/Evaluated.png" alt="" /></p>
<p>👏👏👏</p>
<p>And there's the answer: they've mentioned (linked to) <em>How To Read a Book</em> 41 times.</p>
<p>Already some interesting insights on there… but there's so much to explore:</p>
<ul>
<li>Could we see this plotted over a timeline?</li>
<li>Do references have a half-life, or do some books ring eternal in Mike and Joe's ears?</li>
<li>How does the episode book score relate to the number of backlinks in the future?</li>
<li>Could we use a transcription to find book mentions that aren't in shownotes?</li>
</ul>
<p>That's for another day…</p>
<p>Check out <a href="https://github.com/evantravers/bookworm-visualization">the repo</a> if you are interested.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://hexdocs.pm/floki/Floki.html">Floki</a></li>
<li><a href="https://hexdocs.pm/libgraph/Graph.html">Graph</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Sketchnoting Sermons</title>
       <link>http://evantravers.com/articles/2023/08/01/sketchnoting-sermons/</link>
       <pubDate>Tue, 01 Aug 2023 06:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/08/01/sketchnoting-sermons/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/08/bulletjournal-spread.jpg"></p><p>I've experimented with sketchnotes on and off since 2016. I would attempt drawing some notes, be frustrated, and forget about it for months. In each effort I would see how translating what I hear into pictures stimulated connections and built appreciation for biblical concepts. However, feeling discouraged that I couldn't quite draw cleanly or organize my thoughts, I'd throw it down until the itch to try came again.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/early-wilson.jpg">
    <figcaption>
        Here's an early attempt circa 2016. Most my traditional outline notes, but with some meaningful marginalia.
    </figcaption>
</figure>
<p>I have always doodled in the margins… and one day my 4YO child whispered in the pew &quot;Daddy, why did you draw that?&quot; I saw that not only could it help me grow but encourage my children to pay attention and be engaged. After that I decided to really commit to a season of constant practice, and I am <em>so glad</em> I did. After church it's pretty common for Sunday dinner to be going through the sermon via the pictures. I choose to draw in a notebook so that they can see what I'm doing: focusing in the present, worshiping, <em>and</em> not drifting on my phone.</p>
<figure class="dual">
    <img src="https://images.evantravers.com/articles/2023/08/streak-start.jpg">
    <img src="https://images.evantravers.com/articles/2023/08/streak-end.jpg">
    <figcaption>
        Here we have the first entry in my recent weekly streak. It's still a lot of bullets, a couple pictures, not much structure. It's not much better than 2016, but check out the growth that comes from weekly practice in the second! 💪
    </figcaption>
</figure>
<p>I continue to sketchnote every week because of how effective it is at implanting the word in my head. By constantly trying to recommunicate the spoken word into images and layouts I discover wonderful things.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/dreams.jpg">
    <figcaption>
        I love symmetry in the Bible. I realized Joseph's life is framed by three sets of two dreams while trying to draw a quick summary in the corner.
    </figcaption>
</figure>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/heel.jpg">
    <figcaption>
        The essay <a href="https://evantravers.com/articles/2023/06/26/he-who-grasps-the-heel/">He Who Grasps the Heel about Jacob's wrestling match</a> began while imagining the physical positions of the wrestlers for the sketchnote.
    </figcaption>
</figure>
<p>If you are new to the idea of sketchnoting, it's a visual note-taking practice pioneered by Mike Rohde. <a href="#resources-and-thanks">Here's a brief introduction</a>. I encourage everyone to give this practice a try to see if it fits them.</p>
<p>Here are a few lessons I've learned over the past year of sketch noting Sunday morning sermons, for both beginner or experienced sketchnoters:</p>
<h2><a href="#learn-your-pastor" aria-hidden="true" class="anchor" id="learn-your-pastor"></a>Learn Your Pastor</h2>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/pastor-points.jpg">
</figure>
<p>Practicing sketchnoting encourages listening and anticipating the structure of the sermon. This practice has helped me become more in tune with my pastor. I try to understand the outline, I anticipate the arrival of main points by learning his intonation and style. It makes me a better active listener… and helps me hide the word in my heart.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/pastor-portrait.jpg">
</figure>
<p>I like to give my pastor a little home in my sketchnote for their jokes and calls to action. I’m pretty bad at portraits, so it’s pretty much a little man in a suit. I’m still working on it!</p>
<h2><a href="#stay-simple" aria-hidden="true" class="anchor" id="stay-simple"></a>Stay Simple</h2>
<p>Mike Rohde contends that <em>everyone</em> can sketchnote. All you need is a circle, square, and some lines… he’s not wrong. Simple visuals capture complex ideas.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/stick-men.jpg">
</figure>
<p>I really like using the “box-style” stick figure as canvas for recognizable bible characters. The rectangle becomes a canvas for drawing whatever object usually represents that character on a felt-board: the diagonal sash for Jesus, stripes for Joseph’s coat of many colors, etc. I’ve developed a small library of adornments to tell characters apart: belts, swords, different collars. Just stay simple.</p>
<h2><a href="#sketch-what-matters" aria-hidden="true" class="anchor" id="sketch-what-matters"></a>Sketch What Matters</h2>
<p>Do not try to capture every point in the sermon. Just draw what really sticks out to you. It is a tool to help you remember, so record what you want to recall later.</p>
<figure>
    <img src="https://images.evantravers.com/articles/2023/08/what-matters.jpg">
</figure>
<p>It is tempting to attempt to capture the <em>whole</em> sermon. I fight this every week. Capture only what resonates and the process is <em>much</em> more enjoyable. Perhaps you’ve heard this line of thought about a passage… but you’ve never heard this one detail. Pay attention to what resonates and capture that. Maybe a sermon illustration grabs your heart… draw it.</p>
<figure>
> [!youtube] https://www.youtube.com/watch?v=5U-GwtFKE-w
    <figcaption>
        <p>This is 45m compressed into a few seconds, but some things to note:</p>
        <ul>
            <li>I spend a fair amount of time just twiddling my pen and listening.</li>
            <li>If I don't know what to to draw, I leave a space and move on until I figure it out. (I leave the seventh block unfinished for quite a while.</li>
            <li>You'll always finish feeling you could have done better… I don't love the layout of the conversation at the bottom. That's ok. We get to try again next week with that knowledge and growth.</li>
        </ul>
    </figcaption>
</figure>
<p>Two tricks to keep the “capture everything” monster at bay:</p>
<ul>
<li>Wait and listen before starting your layout. The structure may reveal itself if you just hold two thoughts in your head and choose which to draw… or maybe find a visual connection between the two.</li>
<li>Scrawl the outline on scrap paper to persuade the monster that you aren’t forgetting anything.</li>
</ul>
<h2><a href="#think-in-series" aria-hidden="true" class="anchor" id="think-in-series"></a>Think in Series</h2>
<p>Sermons exist in the context of the series, topical or exegetical. Because ideas, characters, and themes recur you can practice sketching the same concepts over and over. I have found that as I hone my images the concepts burrow deeper in my heart, and I discover meaningful connections.</p>
<figure class="thirds">
    <img src="https://images.evantravers.com/articles/2023/08/joseph-1.jpg">
    <img src="https://images.evantravers.com/articles/2023/08/joseph-2.jpg">
    <img src="https://images.evantravers.com/articles/2023/08/joseph-3.jpg">
    <figcaption>
        <p>
            Evolving Joseph's story in Genesis:
        </p>
        <ul>
            <li>
                Joseph's first appearance. He's identifiable by his coat of many colors and youthful zeal… gets him in trouble!
            </li>
            <li>
                Joseph now in different circumstances, but the "Tintin" hair keeps him consistent with his previous appearance.
            </li>
            <li>
                Joseph trading the slave collar for the vizier collar… same master, new slavery
            </li>
        </ul>
    </figcaption>
</figure>
<p>By re-using and evolving simple drawings across a whole series you can craft timelines and callbacks to enrich your sketchnote. I do my sketchnotes in <a href="https://evantravers.com/articles/tags/bullet-journal/">a Bullet Journal</a> threaded collection alongside the rest of my life. It's really cool to be able to flip backwards and see the progression and connection of these ideas and principles.</p>
<figure class="thirds">
    <img src="https://images.evantravers.com/articles/2023/08/judah-1.jpg">
    <img src="https://images.evantravers.com/articles/2023/08/judah-2.jpg">
    <img src="https://images.evantravers.com/articles/2023/08/judah-3.jpg">
    <figcaption>
        <p>And discovering a background character who becomes a foreground character: Judah. I had to find a random angry brother from the first Joseph note to represent him!</p>
        <ul>
            <li>
                Judah sorrowful for his sin against Tamar.
            </li>
            <li>
                A rare true repentance.
            </li>
            <li>
                Judah restored, blessed by Israel, ancestor of Jesus.
            </li>
        </ul>
    </figcaption>
</figure>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I hope to encourage you to try and try again. Googling for sketchnotes can be overwhelming. There are some amazing thinkers and artists out there. You may say &quot;I'm not an artist,&quot; but if you find yourself filling all the “o”s in the bulletin or doodling stick figures and geometric shapes… give sketchnoting a try. I stick with it because it helps me listen, remember, and teach my children. It has been encouraging and humbling to see how many of my sketchnotes end up with arrows pointing at a simple cross to remind me how much of scripture points to The Story of Redemption.</p>
<p>You will get a chance to try this and practice this coming Sunday… and I have sloooowly improved with practice over the past hundred or so Sundays I’ve brought my journal to the service. (I still can’t draw Holy Spirit doves… yet. I’ll get to try again Sunday.) I retain more, I encounter the ideas in my journal throughout the week, and I share it with my kids at the table Sunday night.</p>
<p>Give it a try, and <em>please</em> email me your beautiful sketches. 🙏</p>
<h2><a href="#resources-and-thanks" aria-hidden="true" class="anchor" id="resources-and-thanks"></a>Resources and Thanks</h2>
<p>Sketchnoting is a visual note-taking practice <a href="https://rohdesign.com/sketchnotes">named by Mike Rohde</a>. The following video is the best introduction:</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/39Xq4tSQ31A"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<ul>
<li>Mike Rohde's podcasts appearances and talks were super influential: <a href="https://www.youtube.com/watch?v=msWjW15Uzhk">Simple Shapes for Sketchnoting</a></li>
<li><a href="https://www.youtube.com/watch?v=loQeIuakikM&amp;list=PLJUR7mZ_BoGPjgIgO3nerWJbd-rZ_khiq">Mike Schmitz's Sermon Sketchnotes</a> are a constant drip of encouragement.</li>
<li>My friend CJ Wilson has <a href="https://sendfox.com/lp/1k75nd">an email course for Sermon Sketchnoting</a>!</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Last Mile Legalism</title>
       <link>http://evantravers.com/articles/2023/07/27/last-mile-legalism/</link>
       <pubDate>Thu, 27 Jul 2023 06:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/27/last-mile-legalism/</guid>
       <description><![CDATA[ <p>Engineers have been frustrated for centuries by the <a href="https://www.investopedia.com/terms/l/lastmile.asp">Last Mile</a> problem. No matter how careful the construction of your infrastructure (whether it is an aqueduct, railroad, phone lines, fiber-optic internet network, <a href="https://www.youtube.com/watch?v=DOWDNBu9DkU">drone-based next-day shipping system</a>…) the short distance from the distribution system to final destination is <em>expensive</em>. Building a phone line across a country to cover ten thousand homes is easy. Running individual lines from that main line to wire up ten thousand houses is <em>hard</em>.</p>
<p>The problem is more than just connection: Your city may have clean water with great pressure… but if the Last Mile is cramped by old, narrow pipes you won't experience the fullness of the water for which you paid. It doesn't matter how fast is the internet at the downtown office (where the marketing department measures speed for advertising…) how good are the wires between your house and street? The Last Mile constrains and defines the user's experience of <em>the whole system</em>.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I have last mile problem between me and the source of Living Water.<sup class="footnote-ref"><a href="#fn-caveat" id="fnref-caveat" data-footnote-ref>1</a></sup></p>
<p>My whole life I have struggled with being worthy of God's favor. It is a form of legalism masquerading as piety. Legalism is attempting to earn a place in the Kingdom through righteous actions (obeying the law) instead of leaning totally on the free gift of God. While I <em>know</em> the truth…  I struggle with feeling and behaving like I ought to &quot;pay my share.&quot; It emerges with my failures. I wrestle with my sins for a day, and I find myself praying and feeling that I ought to be extra good for two days to karmically balance the scales and put me back in God's favor.</p>
<p>This is a lie.</p>
<p>Scripture is <em>filled</em> with truth about salvation, grace, and God's love.</p>
<blockquote>
<p>For the wages of sin is death, but the free gift of God is eternal life in Christ Jesus our Lord.</p>
</blockquote>
<p>— Romans 6:23</p>
<blockquote>
<p>Come to me, all who labor and are heavy laden, and I will give you rest.</p>
<p>Take my yoke upon you, and learn from me, for I am gentle and lowly in heart, and you will find rest for your souls.</p>
<p>For my yoke is easy, and my burden is light.&quot;</p>
</blockquote>
<p>— Matthew 11:25-30</p>
<p>This truth has not changed… why do I struggle? I constrain my experience of His grace through my Last Mile Legalism. I have an inflated view of my own righteousness and a diminished understanding of the richness of Christ. The truth: His love, grace, and forgiveness is undiminished, untarnished, ever-flowing and free.<sup class="footnote-ref"><a href="#fn-lowly" id="fnref-lowly" data-footnote-ref>2</a></sup> I have to surrender my Last Mile.</p>
<p>Naming my error has helped me stop trying to earn God's approval or atone for my sins, but I still find myself thinking in this old way. Jesus, please help me. Help me to see how my righteousness is as filthy rags. You are worthy of all glory and honor. I want the conduits of grace in my life to be wide open. I'm the only one getting in the way, trying to substitute my filthy rags for your overwhelming goodness. I repent, and I want your help to repent. In Jesus' name, amen.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-caveat">
<p>I am not suggesting that my thinking can subtract one drop from God's grace. I'm just saying that I look at it the wrong way and experience less. <a href="#fnref-caveat" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-lowly">
<p><a href="https://evantravers.com/articles/2021/08/19/review-gentle-and-lowly-by-dane-c-ortlund/"><em>Gentle and Lowly</em></a> and <a href="https://evantravers.com/articles/2022/05/20/review-deeper-by-dane-c-ortlund/"><em>Deeper</em></a> by Dane C. Ortlund were very helpful to me. <a href="#fnref-lowly" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hardstuck</title>
       <link>http://evantravers.com/articles/2023/07/20/hardstuck/</link>
       <pubDate>Thu, 20 Jul 2023 09:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/20/hardstuck/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I've been <a href="https://en.wiktionary.org/wiki/hardstuck">hardstuck</a> on a bunch of essays for <em>months</em>. In no particular order:</p>
<ul>
<li>Creativity vs. Productivity Systems</li>
<li>Small Split Keyboard Demo</li>
<li>Sketchnoting Sermons</li>
<li>VR is a Bag of Holding</li>
<li>Last Mile Legalism</li>
</ul>
<p>The Creativity vs. Productivity Systems article has been gestating since… June 2022. It's embarrassing.</p>
<p>I know it's my perfectionism that is keeping me from progressing. I want them to be perfect… and they have slowly snowballed and congealed just clogging up my creative process. Instead of writing and progressing I mess with a word or two, give up on it being perfect and back away slowly. 🙇</p>
<p>I even have an unpublished short fiction or two… never published any short stories since I was in high school.</p>
<p>I am writing a lot for myself. Random hiking and camping research, some product/UX concepts, some family values documents as I try to be more intentional as a husband and father.</p>
<p>I just need to pick one of the above articles, push it through to completion, and start unclogging the drain… I just need to pick.</p> ]]></description>
    </item>
    <item>
       <title>Recently Reading</title>
       <link>http://evantravers.com/articles/2023/07/18/recently-reading/</link>
       <pubDate>Tue, 18 Jul 2023 09:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/18/recently-reading/</guid>
       <description><![CDATA[ <p>Here's a few titles that have read over the past six months.</p>
<p><em>Winter World</em> by A. G. Riddle, recommended by Josh Pigford. An ecological first contact thriller. It was popcorn, but not memorable I probably would have enjoyed it more if I had not recently read the bewildering and terrifying <em>Blindsight</em> by Peter Watts. Related: <em>Blindsight</em> and <em>Echopraxia</em> by Peter Watts for truly terrifying alien concepts, <em>Project Hail Mary</em> by Andy Weir for saving earth with limited resources, <em>Seveneves</em> by Neil Stephenson for some far-flung futurism post-catastrophe.</p>
<p><em>The Mountain in the Sea</em> by Ray Nayler. Recommended by Robin Rendle. In a near future, a nearly depleted sea is overfished by monstrous AI-automated fisheries and a mysterious organization races to study a last sanctuary that may contain an undersea intelligence… while a mysterious assassin kills everyone who has ever seen it. Fantastic and highly recommended. Related: <em>Children of Time</em> by Adrian Tchaikovsky for more strange evolution, <em>Borne</em> by Jeff VandeMeer for examining childhood trauma through post-singularity parenting.</p>
<p><em>Know No Fear</em> by Dan Abnett. Grimdark hard military sci-fi in the 41st millennium. Ultramarines are indeed kind of OP, but this was a glorious testosterone romp with heavy Tom Clancy overtones, and I loved it.</p>
<p><em>The City &amp; The City</em> by China Miéville. Recommended by Errin Larsen. A noir murder mystery in a more mysterious city. I love &quot;new weird&quot; fiction, and this is a great one. Related: <em>Gnomon</em> by Nick Harkaway for a strange detective story, <em>Neverwhere</em> by Neil Gaiman for a love letter to smoky mysterious metropolis, <em>Fall; or Dodge in Hell</em> by Neil Stephenson, for visualizations of worldview divide, and <em>Foucalt's Pendulum</em> by Umberto Eco for the creeping gaslighting of &quot;is this a conspiracy or am I the crazy one?&quot;</p>
<p><em>Rainbow's End</em> by Vernor Vinge. Fifteen years from know, high schoolers attempt to finish their senior project distracted by a nearly post-scarcity world populated by AR video gaming, genetically crafted virus warfare, and propaganda triggers intended to keep people happily consuming and not questioning what's happening around them. Should be required reading for those (like me) who are thinking about technology and education. Related: <em>Ender's Game</em> by Orson Scott Card and <em>The Gilded Age</em> by Neil Stephenson for more envisioning the pros and cons of near-real VR tech on education.</p>
<p><em>Only The Dead</em> by Jack Carr. A fun popcorn book with political overtones. Carr is best when he's weaving snide commentaries about America's empirical excesses through the inner monologues of semi-fictional enemies with slick results-based action sequences.</p>
<p><em>Built to Move</em> by Kelly Starrett and Juliet Starrett. Recommended by Tim Ferris. I <em>way</em> under-estimated the power of walking. I now understand breath a bit better. Contains simple tests (some of which I fail) to analyze where I am in stewarding a durable body.</p>
<p>Currently reading: <em>The Splendid and the Vile</em> by Erik Larson. I love Larson… and the picture of what it was like to be around Churchill as he dealt with highs and lows, developed healthy (and unhealthy!) working and communication habits… delightful lens into a well documented story.</p> ]]></description>
    </item>
    <item>
       <title>What Is ChatGPT Doing … and Why Does It Work?</title>
       <link>http://evantravers.com/articles/2023/07/16/what-is-chatgpt-doing-and-why-does-it-work/</link>
       <pubDate>Sun, 16 Jul 2023 18:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/16/what-is-chatgpt-doing-and-why-does-it-work/</guid>
       <description><![CDATA[ <blockquote>
<p>this isn’t the right conclusion to draw. Computationally irreducible processes are still computationally irreducible, and are still fundamentally hard for computers—even if computers can readily compute their individual steps. And instead what we should conclude is that tasks—like writing essays—that we humans could do, but we didn’t think computers could do, are actually in some sense computationally easier than we thought.</p>
</blockquote>
<p>I finally sat down to read this. If you have the curiosity and patience I believe it is worth the effort to complete.</p>
<p>It is both a tribute of wonder to the complexity and design of human language and a (to me) reassuring voice that AGI is much further off than some may claim.</p><p><a href="https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/" class="u-in-reply-to  is-reply">What Is ChatGPT Doing … and Why Does It Work?—Stephen Wolfram Writings - writings.stephenwolfram.com</a></p> ]]></description>
    </item>
    <item>
       <title>The New Thing Is Not New</title>
       <link>http://evantravers.com/articles/2023/07/06/the-new-thing-is-new/</link>
       <pubDate>Thu, 06 Jul 2023 08:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/06/the-new-thing-is-new/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I opened Threads for about ten seconds, realized that it was the addictive snark of Twitter, popcorn memes of Reddit, and heroin algorithm-feed of TikTok in one app.</p>
<p>I'm going to back away slowly.</p>
<p>I'm already an information-addict. I've already given away millions of my words and clicks to then ad-rev now private LLM training databases… I'm good y'all.</p>
<p>Long live blogs.</p> ]]></description>
    </item>
    <item>
       <title>The New Thing</title>
       <link>http://evantravers.com/articles/2023/07/05/the-new-thing/</link>
       <pubDate>Wed, 05 Jul 2023 21:06:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/05/the-new-thing/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I've been a serial early adopter.</p>
<p>Traditionally a new product drops and I immediately sign up, claim my name, start finding my people.</p>
<p>Between Reddit and twitter &quot;dying&quot; there's a bunch of places that want my data and attention now.</p>
<p>I'm tired.</p>
<p>I kinda want to just post to my little site, get a nice email from y'all once in a while… enjoy a quiet little internet.</p>
<p>… but the UX nerd in me wants to snoop.</p>
<p>I do hope that the scuttlebutt is true and the New Things will support fediverse protocols. I think that can only be good.</p> ]]></description>
    </item>
    <item>
       <title>16 Years Working On The Web</title>
       <link>http://evantravers.com/articles/2023/07/05/16-years-working-on-the-web/</link>
       <pubDate>Wed, 05 Jul 2023 07:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/07/05/16-years-working-on-the-web/</guid>
       <description><![CDATA[ <p>I quietly passed 16 years of working on web sites and web applications this year.</p>
<p>The first half of my career was focused on small business e-commerce and marketing. The current half has been EdTech applications with legacy (read, stable and dependable) tech-stack.</p>
<p>I started on VBScript and ASP .NET, then spent some time waffling between Wordpress and Drupal. I've spent the last decade-ish in Ruby on Rails, with some Sinatra/Middleman for side-projects. Other random one-off projects in there too… with a smattering of <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/MonsterOfTheWeek">monster-of-the-week</a> javascript tooling. Anyway. Languages and frameworks color my view on my part of the programming galaxy… so your mileage may vary.</p>
<p>I thought it'd be interesting to reflect on the changes from the perspective of a simple worker-upon-the-web:</p>
<p>I can't remember the last time I went to look at sourceforge.net. github.com has eaten up the world. Both a blessing and a curse.</p>
<p>Browser testing and labs have ceased to be a constant background murmur. I used to spend hours on browserstack.com. A combination of widely available VMs, better front end testing stacks, and WebKit's domination has changed the landscape. I haven't written a <a href="https://hsivonen.fi/doctype/">weird IE-specific doctype hack</a> in <em>years</em>.</p>
<p>Performance testing is more important than ever. When I started I was more interested with how this ran on old browsers and dial up, these days I'm testing the toxic runoff of NPM dependencies. I think my first brush against this was a <a href="https://en.wikipedia.org/wiki/Heisenbug">heisenbug</a>: a non-deterministic CSS-minifier, an early Bootstrap version, and <a href="https://learn.microsoft.com/en-us/archive/blogs/ieinternals/stylesheet-limits-in-internet-explorer">IE9's CSS rule limit</a> ate my life for a straight week. Browsers have improved but the dev stack has gotten lazy and bloated.</p>
<p>Design systems are still nascent. We've moved beyond mere pattern libraries and now have specs for tokens and starting to see tools like Storybook take over… but it's rare and still be consultant-specialty instead of being table-stakes. I argue for Design System thinking like I used to have to argue for using source control or hiring a QA team and writing tests.</p>
<p>I'm surprised it's taking this long for Web Components to become truly ubiquitous. I could be wrong, but it still feels bleeding edge.</p>
<p>People still argue about how to write CSS. BEM, SMACSS, square, semantic, now utility classes. It's all solutions for &quot;where does this rule belong,&quot; and <em>none</em> of it removes the requirement for a basic understanding on how the CSS cascade works. 🤷</p>
<p>CSS is <strong>awesome</strong> now. When I think of the evil tables, carefully sliced fireworks documents, spacer.gif, and use of non breaking spaces from before… we have such amazing tools now rolling out so fast.  Flexbox, Grid, now Container Queries? Outstanding.</p>
<p>What I used to call a &quot;web developer&quot; is now called &quot;<a href="https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development/">Front of the front end</a>.&quot; I'm finding hard to hire people with the skills I grew up on. Lots of amazing javascript developers, not many folks with a love for CSS.</p>
<p>I kinda miss the simple joys of jQuery. A one stop shop for all your interaction needs. 🤷 I flirted with Coffeescript briefly… I've written a little typescript, but I confess I've been waiting for y'all to chill and stick with one. I am eyeing <a href="https://htmx.org/">HTMX</a> to solve <a href="https://patterns.dev/posts/islands-architecture">Islands of Interaction</a> in mostly CRUD apps. I'm also hopeful for Hotwire and Elixir LiveView to make components easier.</p>
<p>I'm surprised Emscripten hasn't been a bigger deal. As Flash and Actionscript slipped into the abyss the creative animators and game makers would reach for it… I was wrong… probably partly because of the rise of the iPhone driving interactive animators to a different platform.</p>
<p>Accessibility is still arcane magicks. It is complicated like browser testing used to be: a poorly understood and documented domain with an exponential complexity coming from eccentric combinations of browser/assistive-tool. If you lived through the browser testing days, you may have the skills and disciplines (perhaps paranoia?) required. I am honestly sorry for the new folk. I don't think it's just a skill issue… as the stack deepens our applications are built on DSLs and complex stacks that don't consider and make simple things complicated.</p>
<p>It is all better than ever… it is all just as hard.</p> ]]></description>
    </item>
    <item>
       <title>The Grug Brained Developer</title>
       <link>http://evantravers.com/articles/2023/06/28/the-grug-brained-developer/</link>
       <pubDate>Wed, 28 Jun 2023 08:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/06/28/the-grug-brained-developer/</guid>
       <description><![CDATA[ <p>In the grand tradition of <a href="https://www.youtube.com/watch?v=qYodWEKCuGg&amp;pp=ygULY29kZSBtb25rZXk%3D">Code Monkey</a> and <a href="https://xkcd.com/1133/">Up Goer Five</a> this simple source of wisdom is the thing that has made me laugh the <em>hardest</em>… while agreeing vigorously.</p>
<blockquote>
<p>apex predator of grug is complexity</p>
<p>complexity bad</p>
<p>say again:</p>
<p>complexity very bad</p>
<p>you say now:</p>
<p>complexity very, <em>very</em> bad</p>
<p>given choice between complexity or one on one against t-rex, grug take t-rex: at least grug see t-rex</p>
<p>complexity is spirit demon that enter codebase through well-meaning but ultimately very clubbable non grug-brain developers and project managers who not fear complexity spirit demon or even know about sometime</p>
<p>one day code base understandable and grug can get work done, everything good!</p>
<p>next day impossible: complexity demon spirit has entered code and very dangerous situation!</p>
<p>grug no able see complexity demon, but grug sense presence in code base</p>
</blockquote>
<p>Grug has lots of wisdom. Grug quotes G.K. Chesterton. I want to buy Grug a coffee. Listen to Grug.</p><p><a href="https://grugbrain.dev/" class="u-in-reply-to  is-reply">The Grug Brained Developer - grugbrain.dev</a></p> ]]></description>
    </item>
    <item>
       <title>He Who Grasps the Heel</title>
       <link>http://evantravers.com/articles/2023/06/26/he-who-grasps-the-heel/</link>
       <pubDate>Mon, 26 Jun 2023 18:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/06/26/he-who-grasps-the-heel/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/06/jacob.jpg"></p><p>Rebekah is expecting and hurting. The violent struggle within her is so surprising she describes it as wrestling. When the twins are born the younger is pulled out still holding on to the older Esau's heel and is therefore named Jacob: &quot;he who grasps the heel.&quot; (<a href="https://www.esv.org/verses/Genesis25:26">Genesis 25:26</a>)</p>
<p>Over the years Jacob's conniving and deception shades the meaning of his name to mean &quot;the deceiver.&quot; (<a href="https://www.esv.org/verses/Genesis27:36">Genesis 27:36</a>) Continually he hides behind and seeks the admiration of women, he desperately seeks the security of worldly possessions, and he repeats his father’s mistakes of favoritism and cowardice. Through it all he uses his words as weapons, seeks even the leverage of witchcraft, and twists even the words of God. (<a href="https://www.esv.org/verses/Genesis31:12">Genesis 31:12</a>) He lives a life aligned with his name. It is a self fulfilling prophecy.</p>
<p>Jacob is waiting at the shore of the Jabbok for the brother he betrayed to bring his private army to meet him. He is brought to the end of himself: no longer hiding behind his women, bereft of his worldly goods, he is alone… and the Angel of the Lord comes down beside him again to wrestle. Scripture tells us that towards the end of the night, the Angel of the Lord struck his hip, removing Jacob's power to flee or fight. The Angel of Lord tells Jacob to let him go. Jacob desperately responds &quot;I will not let you go unless you bless me…&quot; and the Angel gently asks &quot;what is your name?&quot;</p>
<p>We can imagine Jacob's shoulders slumping at the reminder. &quot;I'm Jacob. The deceiver. He who reaches for what is not his.&quot;</p>
<p>God loves symmetry. He loves to redeem the broken. I like to imagine that in this moment Jacob is on the ground, hip destroyed. Unable to flee. Unable to fight. On his face with his hip shattered, furiously holding onto the heel of the Angel. All these years of God's kindly pursuit of him. Jacob is no longer content to leave behind the places he thinks God dwells. Jacob wants God to <em>stay with him</em>. In his mercy God brings him again to a symmetrical moment to his life's beginning: another wrestling match, another grabbing of the heel, and another Father naming his child.</p>
<p>&quot;Your name shall no longer be Jacob, but Israel,&quot; (<a href="https://www.esv.org/verses/Genesis32:28">Genesis 32:28</a>)</p>
<p>Praise the Lord.</p> ]]></description>
    </item>
    <item>
       <title>Production design of “True Detective”</title>
       <link>http://evantravers.com/articles/2023/06/11/production-design-of-true-detective-interview-with-alex-digerlando-pushing-pixels/</link>
       <pubDate>Sun, 11 Jun 2023 15:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/06/11/production-design-of-true-detective-interview-with-alex-digerlando-pushing-pixels/</guid>
       <description><![CDATA[ <blockquote>
<p>An architect designs a space for the future. Who’s going to live there? What are they going to do there? But a film designer, in my opinion, designs a space for everything that’s happened there before the point in time when the story is being told.</p>
</blockquote>
<p>This was a marvelous read. I admire the pragmatic and resilient creative process that can be devoted to details while knowing that the art exists only for the shot and then will be destroyed.</p><p><a href="https://www.pushing-pixels.org/2016/04/25/production-design-of-true-detective-interview-with-alex-digerlando.html" class="u-in-reply-to  is-reply">Production design of “True Detective” – interview with Alex DiGerlando · Pushing Pixels - www.pushing-pixels.org</a></p> ]]></description>
    </item>
    <item>
       <title>Keyboard Only Day</title>
       <link>http://evantravers.com/articles/2023/05/31/keyboard-only-day/</link>
       <pubDate>Wed, 31 May 2023 23:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/31/keyboard-only-day/</guid>
       <description><![CDATA[ <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Kinda want this personal challenge:<br><br>Disconnect my mouse for an entire work day. See if I can get by entirely using the keyboard.<br><br>Has anyone done this?</p>&mdash; Brian Casel (@CasJam) <a href="https://twitter.com/CasJam/status/1663521172485554180?ref_src=twsrc%5Etfw">May 30, 2023</a></blockquote>
<p>Brian's challenge sparked my interest… could I really put down my mouse for a day?</p>
<p>Turns out… yes. I had a few small tricks to learn first.</p>
<p>I already had a lot of the pieces: I use <a href="https://evantravers.com/articles/tags/hammerspoon/">Hammerspoon</a> to app-switch and automate a lot of tasks. I've used <a href="https://github.com/philc/vimium">Vimium</a> or <a href="https://github.com/brookhong/Surfingkeys">SurfingKeys</a> on web browsers to help me move and work.</p>
<p>As I attempted to spend a day without my mouse, I realized I didn't have good solutions for a few common computer tasks:</p>
<ul>
<li>Clicking random screen-only UI elements</li>
<li>Scrolling</li>
<li>Copying text out of web documents</li>
</ul>
<p>Enter <a href="https://homerow.app">Homerow.app</a>. 👏👏👏</p>
<p>I've been using Homerow for a bit, but the challenge showed me some fun (and <a href="https://twitter.com/dexterleng/status/1652613005392384000">relatively new</a>!) features.</p>
<p>After using Homerow.app for the day… I realized that I could drop Vimium/Surfingkeys. Those tools have <em>very</em> powerful configurations and neat tools… that I don't use. I used them to search and open links in tabs. That's it. Homerow.app can do that and be the same for every browser and app I use on my Mac.</p>
<p>Dexter also rolled out scrolling and custom keys, so that was perfect.</p>
<p>The last piece (prompted by buying Homerow and needing to put the license key into 1Password!) was copy/paste… and this is where I learned about <a href="https://support.google.com/chrome/answer/10129654?hl=en">Caret Mode</a>. Caret Mode is usually invoked with <code>&lt;F7&gt;</code>, and basically gives you an editor-style cursor that you can move around the screen. I'm a newbie, but I found the best way to place the cursor was to use <code>⌘-F</code> to find the word you want to start on, hit <code>&lt;ESC&gt;</code> to exit Find mode, then use the arrow keys while holding Shift to extend the selection.</p>
<p>I'm glad I know that it exists; it's very handy.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I commend to you Brian's challenge. Forcing yourself to learn the keyboard shortcuts in the tools you already use will make you a faster and more efficient knowledge worker.</p>
<p>If you are a developer/designer, there is an even stronger reason: you step outside of your comfort zone into the doorway of accessibility and accessibility tools. The frustrations you find, the techniques you discover, all will put you in the way of incorporating that learning into the applications upon which you work.</p> ]]></description>
    </item>
    <item>
       <title>5x3_3 Keyboard Layout</title>
       <link>http://evantravers.com/articles/2023/05/27/5x3-3-keyboard-layout/</link>
       <pubDate>Sat, 27 May 2023 13:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/27/5x3-3-keyboard-layout/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/05/full-layout.png"></p><p>I haven't made an updated post since <a href="https://evantravers.com/articles/2020/02/22/customizing-a-keyboard-layout/">my last in 2020</a>.</p>
<p>Since that post, I've been using smaller and smaller keyboards, settling on a 5x3_3 layout on all my programmable keyboards<sup class="footnote-ref"><a href="#fn-boards" id="fnref-boards" data-footnote-ref>1</a></sup>, both QMK and ZMK.</p>
<p>I'm going to illustrate the layout using the ortho style above, but it works equally well on Cornes, Atreus, or whatever you have:</p>
<p><img src="https://images.evantravers.com/articles/2023/05/ergo.png" alt="ergo" /></p>
<p>Much of the logic remains the same from the 2020 post; the main change is finding new homes for the outer keys. Most have landed on the bottom three thumb keys. There's surprising room if you are willing to be a little creative.</p>
<p>I'm interested in having small keyboards because I enjoy the challenge, and I genuinely think that the smaller hand motions are easier on my hands for long typing sessions.</p>
<h2><a href="#layers" aria-hidden="true" class="anchor" id="layers"></a>Layers</h2>
<h3><a href="#alphas" aria-hidden="true" class="anchor" id="alphas"></a>Alphas</h3>
<p><img src="https://images.evantravers.com/articles/2023/05/qwerty.png" alt="alphas" /></p>
<p>I have not abandoned QWERTY. I have too much muscle memory in Vim and other programs' shortcuts.</p>
<h3><a href="#symbols" aria-hidden="true" class="anchor" id="symbols"></a>Symbols</h3>
<p><img src="https://images.evantravers.com/articles/2023/05/symbols.png" alt="symbols" /></p>
<p><em>Actuated by holding my LH thumb Backspace.</em></p>
<p>My symbol layer started with the Ergodox/Kyria symbol layer and was combined with some Planck symbol layer logic, adjusted for comfort writing Markdown and Elixir.</p>
<p><a href="https://zmk.dev/docs/behaviors/caps-word">Capsword</a> lives in Symbols, and it's a <em>great</em> feature. It is prime real estate that could be moved, but I don't have anything that I want to put there.</p>
<h3><a href="#control" aria-hidden="true" class="anchor" id="control"></a>Control</h3>
<p><img src="https://images.evantravers.com/articles/2023/05/control.png" alt="control" /></p>
<p><em>Actuated by holding my RH thumb Spacebar.</em></p>
<p>Control is vestigial Planck usage. I find the number keys very helpful for Vim jumps, and having the arrow keys on <code>hjkl</code> is great for text-editing everywhere else.</p>
<p>There's a lot of space for activities in here… I could see mouse keys being implemented here.</p>
<h3><a href="#shortcuts" aria-hidden="true" class="anchor" id="shortcuts"></a>Shortcuts</h3>
<p><img src="https://images.evantravers.com/articles/2023/05/shortcuts.png" alt="shortcuts" /></p>
<p><em>Hold by holding LH Thumb Tab or RH thumb <code>'</code>.</em></p>
<p>Shortcuts contains software-specific keys and macros. Common key chords (especially those that require two hands) are crammed into my LH side so that I can easily mouse and work on design files. The space and enter keys were originally me bowing to the fact that I can't hold my &quot;normal&quot; spacebar… but now I use them all the time one handed to navigate Figma document trees.
Two fun features:</p>
<ul>
<li>The Screenshot key has a tapdance: press once to copy to clipboard, twice to save to desktop.</li>
<li>The <code>⌘⇧-M</code> Mute/unmute key for Microsoft Teams is a great example of a small tweak to a keymap that makes a big life difference. I can unmute with my non-mouse hand without reaching across the keyboard.</li>
</ul>
<p>The RH is mostly a numpad. This honestly rarely gets used… that's something that could be moved or adjusted, especially if Numword becomes an available feature.</p>
<h3><a href="#adjust" aria-hidden="true" class="anchor" id="adjust"></a>Adjust</h3>
<p><img src="https://images.evantravers.com/articles/2023/05/adjust.png" alt="adjust" /></p>
<p><em>Hold both LH and RH thumb at once.</em></p>
<p>Adjust contains media keys, F-keys, and keyboard-specific controls (bluetooth controls, reset, etc.)</p>
<p>I am very happy with my concise media keys. I've gotten very used to it, and it's very nice. Both Play/Pause and Next/Prev are on a <a href="https://zmk.dev/docs/behaviors/tap-dance">Tapdance</a> behavior: a single tap does the first action, and a double tap does the second action.</p>
<h2><a href="#homerow-mods" aria-hidden="true" class="anchor" id="homerow-mods"></a>Homerow Mods</h2>
<p>All the main modifiers exist on LH and RH homerow as Home Row Modifiers. It's something I've gotten used to over the past few years, and I don't think I can go back. I think Home row mods minimizes movement for the programming typist. I never do the stretch/squeeze motions required to hit modifiers on normal keyboards. If you have already moved your CTRL key to where Caps Lock was before, you are the target market to play with Home Row Mods.</p>
<p>I do have the rare moment where a save menu or something pops up when I was trying to type <code>as</code>, but it's quite rare at this point<sup class="footnote-ref"><a href="#fn-innovations" id="fnref-innovations" data-footnote-ref>2</a></sup>.</p>
<p>If you are a Readline/emacs afficianado… I can't express how good Home Row Mods are for this use case. Even if you don't it improves all normal text editing. It becomes so natural so <em>very</em> quickly. Selecting backwards by words is as easy as holding <code>sf</code> for Shift + Alt in your LH, holding the right hand space for the Control layer and pressing <code>h</code> a few times to go backwards. It's so natural so fast.</p>
<h2><a href="#misc" aria-hidden="true" class="anchor" id="misc"></a>Misc</h2>
<p>The weird F19 key powers my <a href="https://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper Key via Hammerspoon</a>. Tap for ESC, hold for F19 has been a very good pattern for me.</p>
<p>With a <a href="https://www.amazon.com/dp/B0BYV9KGPN">Lightning -&gt; USB-C OTG dongle</a> and setting:</p>
<pre class="lumis"><code class="language-c" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#define</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">USB_MAX_POWER_CONSUMPTION</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100</span>
</div></code></pre>
<p>I can type this whole post on my iPhone!</p>
<h2><a href="#future" aria-hidden="true" class="anchor" id="future"></a>Future?</h2>
<p>This layout has stayed very stable for a number of years. I'm mostly tweaking timings for homerow mods or latency settings on QMK at this point.</p>
<p>Whenever mouse keys get merged into ZMK I will be looking for a good place for them, probably on the LH of the Control layer. For now I use either Vimium or <a href="https://homerow.app">Homerow.app</a> to drive the mouse from my keyboard.</p>
<p>While I like not dipping into a layer to get at the apostrophe, some of my boards require more of  a thumb duck-under to hit that rather common punctuation. I'm considering finding a combo for it, but I haven't figured how that interacts with home row mods.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I should also mention: much of the concepts are borrowed from lots of people. A lot of the layout principles were borrowed from the tremendous and popular <a href="https://github.com/manna-harbour/miryoku">miryoku layout</a>, which deserves much credit.</p>
<p>If this keeps getting updated, I may post an evergreen essay that stays updated with my layout. I don't think that'll be necessary… unless Arley convinces me to try Colemak or Workman.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-boards">
<p>Current list:</p>
<ul>
<li>Lowprokb Corne-ish Zen (20g gChocs)</li>
<li>OLKB Preonic (67g Zealio Zilents V1)</li>
<li>Chosfox Bancouver40 (Lowprokb Sunsets)</li>
<li>Keyboardio Atreus (Kailh Speed Coppers)</li>
<li>Maple Keyboards Let's Split Eh (67g Zeal Zealio V1)</li>
</ul>
<p>Maybe I do need a <code>/uses</code> page like Seth has suggested… hmm… <a href="#fnref-boards" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-innovations">
<p>I'm interested in some of the fun innovations on the ZMK side for more intelligent Home Row Mods… at this point it's working for me and I am willing to do the extra work to make it work. I'll wait for it to hit master. <a href="#fnref-innovations" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>And There Arose a Generation Who Knew Not</title>
       <link>http://evantravers.com/articles/2023/05/21/and-there-arose-a-generation-who-knew-not/</link>
       <pubDate>Sun, 21 May 2023 13:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/21/and-there-arose-a-generation-who-knew-not/</guid>
       <description><![CDATA[ <blockquote>
<p>…And there arose another generation after them who did not know the LORD or the work that he had done for Israel.</p>
</blockquote>
<p>These are sad words repeated far too often. A season of redemption and victory dying in a whisper because the children of Israel not passing on what they have learned. Growing up I often wondered how this could be? How could someone <strong>not</strong> share the miracles and wonders they had witnessed?</p>
<p>I have come to understand… and as a young father I am even more burdened by these words.</p>
<p>The precious stories of God's providence and miracles to preserve his people were not passed on to their children… because each story must begin with a painful confession.</p>
<p>&quot;I complained in my hunger. Despite my lack of faith God sent manna.&quot;</p>
<p>&quot;I raised my voice to argue we should turn back to Egypt, and God parted the Red Sea.&quot;</p>
<p>I am just like those wandering Israelites.</p>
<p>The brightest story of God's redeeming love and providence has the backdrop of my sin and brokenness. I am not Hosea. I am Gomer.</p>
<p>But I don't have to make the same mistake. I am steeling my heart for the day in five, ten, fifteen years when the moment is right to share with my children my most shameful story… but Christ's power revealed. Providence and power all his… glorying in my weakness.</p>
<p>And there will arise a generation who <em>knew</em> the Lord and the work He has done for their father.</p> ]]></description>
    </item>
    <item>
       <title>The closing of the canon</title>
       <link>http://evantravers.com/articles/2023/05/18/the-closing-of-the-canon/</link>
       <pubDate>Thu, 18 May 2023 13:19:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/18/the-closing-of-the-canon/</guid>
       <description><![CDATA[ <p>Derek aptly names something that has been worrying me since I saw DALL•E's first low res images.</p>
<p>I've thought of it as the Content Ice Age… a moment when the forward march style, content, and artistic endeavor is more copied from behind than pushed forward, like the nostalgia-boom turned up to 11.</p><p><a href="https://derekkedziora.com/notes/20230516200529" class="u-in-reply-to  is-reply">The closing of the canon - derekkedziora.com</a></p> ]]></description>
    </item>
    <item>
       <title>Export Things to Reminders</title>
       <link>http://evantravers.com/articles/2023/05/16/things-to-reminders/</link>
       <pubDate>Tue, 16 May 2023 10:05:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/16/things-to-reminders/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/05/things-to-reminders.png"></p><div class="admonition download">
<p>[📥 Download Things ➡️ Reminders.shortcut](<a href="https://images.evantravers.com/articles/2023/05/Things">https://images.evantravers.com/articles/2023/05/Things</a> to Reminders.zip)</p>
</div>
<p>So I didn't spend all day… just all morning. 🤣</p>
<p>I've written a working export from Things 3 to Reminders in Apple Shortcuts<sup class="footnote-ref"><a href="#fn-export" id="fnref-export" data-footnote-ref>1</a></sup>. This could let you try that <a href="https://evantravers.com/articles/2023/05/16/time-blocking-in-fantastical/">new fancy Fantastical calendar blocking</a>, or just give you an escape route if you choose to <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/">use another Task Manager</a>.</p>
<p>Note: This shortcut can take quite a few minutes if you have a large Things database, be patient.</p>
<p>✅ Presently working:</p>
<ul>
<li>Tags</li>
<li>Notes</li>
<li>Checklist -&gt; Indented Reminder</li>
<li>Areas -&gt; Reminders List</li>
<li>Projects -&gt; Reminders List</li>
<li>Deadline -&gt; Reminder</li>
</ul>
<p>❌ Not exported (mostly because lack of features):</p>
<ul>
<li>Repeating Todos</li>
<li>When (Start Date)</li>
<li>Things Reminder</li>
<li>Context in Projects</li>
<li>Headings</li>
<li>Tag Hierarchy</li>
</ul>
<p>Let me know if this is helpful!</p>
<div class="admonition download">
<p>[📥 Download Things ➡️ Reminders.shortcut](<a href="https://images.evantravers.com/articles/2023/05/Things">https://images.evantravers.com/articles/2023/05/Things</a> to Reminders.zip)</p>
</div>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-export">
<p>I believe that this will also relatively simply into a Things to Todoist export… so I'll probably work on that next.</p>
<p>This isn't the first time I've written an export for Things 3:</p>
<ul>
<li><a href="https://github.com/evantravers/ThingsToOrgmode">Things to Orgmode</a></li>
<li><a href="https://github.com/evantravers/ThingsToTaskwarrior">Things to Taskwarrior</a></li>
</ul>
<a href="#fnref-export" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Time Blocking in Fantastical</title>
       <link>http://evantravers.com/articles/2023/05/16/time-blocking-in-fantastical/</link>
       <pubDate>Tue, 16 May 2023 07:32:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/16/time-blocking-in-fantastical/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/05/time-block.png"></p><div class="admonition tldr">
<p>Tasks can now have an arbitrary length on the Fantastical Day or Week view.</p>
</div>
<p>Y'all know I'm a fan of giving my Tasks a home in Daily Plan (usually my calendar) in a practice sometimes called <a href="https://www.timeblockplanner.com/">Time Blocking</a>, <a href="https://www.macsparky.com/blog/tag/hyper-scheduling/">Hyperscheduling</a>, or a <a href="https://evantravers.com/articles/2020/05/09/creating-a-focus-budget/">Focus Budget</a>.</p>
<p>There are not many tools cleanly connecting The List of things we wish to do and The Time in which we have to do them. <a href="https://flexibits.com/fantastical">Fantastical by Flexibits</a> has released a couple neat tricks to help the aspiring time steward:</p>
<ul>
<li><a href="https://thesweetsetup.com/fantasticals-duplicate-as-event-has-changed-my-time-blocking-routine/">Josh Ginter advocated Duplicate As Event</a></li>
<li><a href="https://evantravers.com/articles/2020/10/09/focus-budget-updated-implementation/">Jacob Collins showed me you can drag any plaintext object onto Fantastical</a>.</li>
<li><a href="https://thesweetsetup.com/joshs-time-blocking-adventures-in-fantastical/">Josh previously used Fantastical's Reminders Task and Calendar Blocks together</a></li>
</ul>
<p>All these techniques disconnect the Task object from its echoed representation on the Daily Plan. If you move or complete the echo on the Daily Plan it doesn't affect your Task List. Fantastical has supported displaying Tasks on the calendar for some time but with a default duration. If you want to have a different duration you have to create an echoed Event Block or duplicate the task… and at the end of the day you still have to &quot;reconcile&quot; your Tasks with your Plan.</p>
<p>Until now!</p>
<p>Last night I was casually reading App Store update notes and this jumped off the page:</p>
<blockquote>
<p>Adding [90m] to the end of a task's title will make the task appear 90 minutes long in Day and Week view (you can use any number to set the task duration)</p>
</blockquote>
<p>Oh my. 😮‍💨</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p><img src="https://images.evantravers.com/articles/2023/05/calendar.png" alt="larger image" /></p>
<p>I've been playing with it a little… it seems to work with any of the Task systems with which Fantastical syncs and only responds to the <code>[&lt;number&gt;m]</code> form. <code>[1h]</code> doesn't work, but <code>[60m]</code> does. Any automation or method you use needs to think in minutes, but that's a small gripe for what this gives you. Place the token in the &quot;title&quot; portion of your natural-language entry so that it is placed at the end of the resulting object's title, something like <code>Write the blog [35m] at 2p tomorrow /Todos</code>. If you put the <code>[35m]</code> at the end of your NLP query, it'll disappear.</p>
<p>I had been seriously considering <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/">dating other Task Managers</a> and moving off Things… and this pushes me <em>much</em> closer to the edge. If I switch from Things to Reminders or Todoist I can give my Tasks a home on my Daily Plan. I can work from either my Daily Plan, checking things off and adjusting or from my Task List interchangeably without worrying about either getting out of sync.</p>
<p>Pardon me while I try to avoid spending the entire day writing a nested-loop shortcut to move my Things database into Reminders. 😬</p> ]]></description>
    </item>
    <item>
       <title>Imagining AccessibilityGPT</title>
       <link>http://evantravers.com/articles/2023/05/09/imagining-accessibilitygpt/</link>
       <pubDate>Tue, 09 May 2023 11:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/05/09/imagining-accessibilitygpt/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/05/accessibility-gpt.jpeg"></p><p>In my years of accessibility research and development work, one tool has dominated the landscape. A technique so powerful, it transcends technology, application, or industry.</p>
<p>&quot;Hey Dave, can you come here and help me with this?&quot;</p>
<p>Every application I've worked on, no matter how WCAG compliant, has some accessibility hole in it where the only solution for a differently-abled person is to reach out and have someone help them complete a task, summarize a screen, or find the way out.</p>
<p>In a world gone mad over the possibilities and threats of LLM and AI-adjacent technologies, I've slowly become excited about what a text-based, connected system could mean for my friends who need that extra boost getting around on a klugey web.</p>
<p>I know OpenAI has <a href="https://openai.com/customer-stories/be-my-eyes">Be My Eyes</a> as a tool for navigating meatspace, but imagine an extension to NVDA that can interpret a browser screen, move the cursor, or perform a series of actions like AutoGPT. LLMs have already demonstrated an ability to navigate, reformat, and modify structured datasets. This makes them uniquely capable of responding to natural language requests and handling the web.</p>
<h2><a href="#1" aria-hidden="true" class="anchor" id="1"></a>1</h2>
<p>Trying to fill out a government ID form, a person is faced with a really long form with over a hundred inputs. They finish, tab to the submit button, and nothing happens.</p>
<blockquote>
<p>Hey AX-GPT, place my cursor on the first input that's in an error state.</p>
</blockquote>
<p>The model uses a combination of visual matching and DOM exploration to find a bunch of fields with red text and an <code>error</code> class nearby in the DOM and places the cursor on the first, notifying the user there are three more.</p>
<h2><a href="#2" aria-hidden="true" class="anchor" id="2"></a>2</h2>
<p>A person is scrolling through a social media site and gets a message from a friend containing only an image and a laughing emoji.</p>
<blockquote>
<p>Hey AX-GPT, describe the image on my cursor.</p>
</blockquote>
<p>AX-GPT assumes that it's a joke based on the proximity of the laughing emoji and matches the image meme against databases like Know Your Meme, which allows it to <a href="https://astralcodexten.substack.com/p/janus-simulators">simulate</a> telling the joke in the friend's writing tone.</p>
<h2><a href="#3" aria-hidden="true" class="anchor" id="3"></a>3</h2>
<p>A person is looking at their bank statement, and the screen reader tells them there's an image describing their account balance.</p>
<blockquote>
<p>Hey AX-GPT, can you describe the trend line of the account balance? Explain it as a list of current balances by month and add the positive or negative difference. End with the difference between the first balance and the last balance.</p>
</blockquote>
<p>AX-GPT responds with an ordered table in an extension modal. The user can listen to the whole table, explore the data, or dismiss the modal.</p>
<h2><a href="#etc" aria-hidden="true" class="anchor" id="etc"></a>Etc.</h2>
<p>Some more for fun…</p>
<blockquote>
<p>Hey AX-GPT, can you add up all the totals on the bank statement?</p>
</blockquote>
<blockquote>
<p>Hey AX-GPT, did I get a refund from Amazon this week?</p>
</blockquote>
<blockquote>
<p>Hey AX-GPT, can you find the tracking number and copy it to my clipboard?</p>
</blockquote>
<blockquote>
<p>Hey AX-GPT, click on the link to Customer Support live chat.</p>
</blockquote>
<h2><a href="#when" aria-hidden="true" class="anchor" id="when"></a>When?</h2>
<p>At the pace things are going, I didn't write this for weeks because I assumed it would already exist by the time I posted it. 🤷</p>
<p>I think that a simple assistant like this will be a boon. It won't negate the importance of writing semantic and accessible HTML... it'll make it even more important. Consistent and semantic HTML is easier to process and crawl for an LLM-based assistant like the one we've imagined.</p>
<p>(And if you are working on this, let's talk!)</p> ]]></description>
    </item>
    <item>
       <title>Playing With AI</title>
       <link>http://evantravers.com/articles/2023/04/30/playing-with-ai/</link>
       <pubDate>Sun, 30 Apr 2023 12:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/30/playing-with-ai/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I've been reluctant to start working with the AI tools available today. I've played with DALL-E a good bit, but not to make anything of worth.</p>
<p>Today I used DALL-E through Bing to generate the image for the last post, and ChatGPT to proof and suggest changes to the text of the post.</p>
<p>I am scared it's here to stay.</p>
<p>I've got more thoughts I'm still synthesizing on this strange time… perhaps I'll share soon. Perhaps I'll end up asking an AI assistant to help me proof an essay on how AI is dangerous. What a time.</p> ]]></description>
    </item>
    <item>
       <title>Advice for Remote Work</title>
       <link>http://evantravers.com/articles/2023/04/30/advice-for-remote-work/</link>
       <pubDate>Sun, 30 Apr 2023 11:01:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/30/advice-for-remote-work/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/octowork.jpeg"></p><p>I no longer believe in a &quot;work/life balance&quot;… there's just life. Here's some (late) advice that has helped me work from home.</p>
<h2><a href="#create-a-separate-space-for-work" aria-hidden="true" class="anchor" id="create-a-separate-space-for-work"></a>Create a separate space for work.</h2>
<p>Our bodies and minds are created to associate desired activities with specific environments. <a href="https://www.youtube.com/watch?v=snAhsXyO3Ck">Spaceship You by CGP Grey</a> does a great job of explaining this strategy. Setting aside a space that's 100% dedicated to work can jumpstart your focus and help you leave work behind at the end of the day. A simple starting point: always dress for work. Just putting on my &quot;work shoes&quot; really helps me. I also take off my work shoes like Mr. Rogers at 5 p.m.</p>
<p>I strongly recommend an &quot;end of work&quot; tear down ritual to teach your brain, &quot;this is the end, I don't need to carry it around all evening.&quot; I think my ritual was inspired by <a href="https://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/"><em>Deep Work</em> by Cal Newport</a>.</p>
<h2><a href="#be-present-with-your-work-and-absent-from-workplace-distractions" aria-hidden="true" class="anchor" id="be-present-with-your-work-and-absent-from-workplace-distractions"></a>Be present with your work and absent from workplace distractions.</h2>
<p>At work, you see people you want to catch up with after the weekend, friends whose kids go to school with yours, someone who just got a new dog… opportunities for fellowship and communication are constant and expected. Sadly, organic interactions are much harder in remote work. Intentionally build relationships and schedule time to spend with people. It feels weird at first, but the practice is critical. Many people I work with online have never had a conversation with me other than giving me work or providing feedback on how my work isn't good enough… How will that shape my subconscious opinion of them?</p>
<p>Because of that aspect, make sure to put <a href="https://evantravers.com/articles/2021/01/20/remote-work-and-submarine-warfare/">up your information periscope</a>. Be aggressively proactive in obtaining and sharing information about what is going on in your part of the business.</p>
<p>Don't succumb to constantly monitoring feeds or allow others to put you in that spot. Find systems and practices to track and make work visible without always &quot;greendotting&quot;<sup class="footnote-ref"><a href="#fn-green" id="fnref-green" data-footnote-ref>1</a></sup>.</p>
<p>Recognize that when working from home, there are fewer distractions... making it easier to overwork due to guilt. Remember how much valuable time you spent at the office in conversation, helping someone move their desk, or assisting with a company event. You have the same expectations and time at home... but your guilty brain won't accept that at first.</p>
<p>Consider tracking your time to be a good steward of how you are spending your time... and to help your guilty brain recognize that you are indeed working hard enough.</p>
<h2><a href="#enjoy-the-benefits-of-remote-work" aria-hidden="true" class="anchor" id="enjoy-the-benefits-of-remote-work"></a>Enjoy the benefits of remote work.</h2>
<p>Move around your house, work outside the house. I've built <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">my entire mobile office to fit inside a bag</a> so I can bike to a coffeeshop. Use &quot;thinking with your body&quot; (Take a walk, ride a bike, work on some household chores, from <a href="https://bookworm.fm/129/"><em>The Extended Mind</em> by Annie Murphy Paul</a>) to break focus funks.</p>
<h2><a href="#invest-in-community" aria-hidden="true" class="anchor" id="invest-in-community"></a>Invest in community.</h2>
<p>Honor your home relationships as critical to your work success and love on your home &quot;coworkers&quot; during the day. I find myself feeling guilty about helping my wife move furniture during the work day (&quot;babe, I'm working right now!&quot;) but while I was in the office someone would ask me to help them move a desk and I'd drop whatever I was doing to go help. Hypocritical! Don't be like me.</p>
<p>Set up regular time to work with friends who aren't coworkers. I meet an array of people once a week at the same coffeeshop and time. Sometimes we visit, sometimes we get straight to work and calls and don't really do more than nod. Even as an introvert it's hugely important for morale and joy to be in community.</p>
<h2><a href="#take-care-of-yourself" aria-hidden="true" class="anchor" id="take-care-of-yourself"></a>Take care of yourself.</h2>
<p>Remember that at home your company isn't spending any money keeping you warm and safe as you work. If you are going to be in it for the long haul, ensure that your home working space is as ergonomic and comfortable as possible… and see if your company will help pay for it. You can <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/#working-out-of-the-bag">creatively hack a standing desk</a>. I like fancy keyboards, but <a href="https://evantravers.com/articles/2019/09/09/mechanical-keyboards-won-t-fix-your-rsi/">RSI is often caused by bad desk/monitor height</a>. Having a monitor with wide range of vertical adjustment is wise, if you can mount it on a <a href="https://www.amazon.com/Ergotron-4290-Mxv-Desk-Monitor/dp/B076T39VLV/ref=sr_1_8?crid=3JJRCX03P6G57&amp;keywords=ergotron+arm&amp;qid=1680530117&amp;sprefix=ergoptro+arm%2Caps%2C88&amp;sr=8-8&amp;ufe=app_do%3Aamzn1.fos.18ed3cb5-28d5-4975-8bc7-93deae8f9840">Nextron arm</a> or similar that's even better. I also really like the <a href="https://www.therooststand.com/">Roost stand</a> for lifting a laptop to the right height. (There are amazon knock-offs of all these items if you are on a budget.)</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>Working from home has been a big blessing for me and my family. I recognize it's not for everyone, and I heartily agree with Cal Newport that it's a communal productivity problem… the organization itself needs to be set up for success, you can't out-smart out-work a badly organized company. I definitely recommend it if you can make the adjustment and enjoy the benefits.</p>
<p><em>Image: Dall-E: <a href="https://www.bing.comhttps://images.evantravers.com/create/remote-worker-at-home-the-worker-has-eight-arms-/644e960ba79446688728936da46bc7c2?id=YbX4b5SwbQvsKVr69JJJ0w%3d%3d&amp;view=detailv2&amp;idpp=genimg">remote worker at home. The worker has eight arms</a></em></p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-green">
<p>Since the advent of workplace chat, there is huge pressure to always be available to be contacted (a glowing, friendly green dot). I have some <a href="https://evantravers.com/articles/2020/01/14/configuring-slack-for-focus/">advice for setting up Slack for focus</a>… but I also recommend teaching your organization to allow turning off chat for focus. <a href="#fnref-green" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Drafts Bookmarks and File Actions</title>
       <link>http://evantravers.com/articles/2023/04/08/drafts-bookmarks-and-file-actions/</link>
       <pubDate>Sat, 08 Apr 2023 11:49:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/08/drafts-bookmarks-and-file-actions/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/post.png"></p><p>I've been a little behind on Drafts releases… but I finally started reading about the new <a href="https://docs.getdrafts.com/docs/settings/bookmarks">Bookmarks feature</a>.</p>
<p>Some of my most used Actions just make plaintext files… especially these days with the Mac version. I decided to give some of my classic Actions a revamp with the new features.</p>
<p>The new Bookmarks feature allows you to make a shortcut name for a folder you often access. You can set the same bookmark to be different locations on different devices.</p>
<p><img src="https://images.evantravers.com/articles/2023/04/bookmarks.png" alt="bookmarks dialog" /></p>
<p>At first I thought I'd have to continue to use Callback URLs on iOS but I underestimated Bookmarks. Both my most used actions have settled into a simple pattern: use a Script Action to transform the Draft, make, decisions, and set variables to be used by a File Action pointed at a Bookmark that's different on each device. Super simple.</p>
<h2><a href="#blog" aria-hidden="true" class="anchor" id="blog"></a>Blog</h2>
<p><img src="https://images.evantravers.com/articles/2023/04/blog.png" alt="blog action" /></p>
<p>Before I had a single complex Script action with a conditional for whether the script was running on Mac or iOS. If iOS, it constructed and opened a URL scheme to <a href="https://apps.apple.com/app/id896694807">Working Copy</a>. On Mac I scripted up a messy shell script that <code>echo</code>d the file to the right location.</p>
<p>Using the new File Action in conjunction with the Bookmarks made this <em>so</em> much simpler.</p>
<p>The Script step is now only responsible for transforming the Draft into the style of markdown my blog consumes and setting up Drafts variables for the filename and file content. The File Action places the file in the right place. Done.</p>
<h2><a href="#obsidian" aria-hidden="true" class="anchor" id="obsidian"></a>Obsidian</h2>
<p><img src="https://images.evantravers.com/articles/2023/04/obsidian.png" alt="obsidian action" /></p>
<p>I also simplified my Obsidian Action. I had written a <a href="https://github.com/evantravers/smz-drafts-actions">very complex set of actions</a> that set up book notes, linked to those notes, and relied on some of the state staying in Drafts and some in Obsidian. I'm not doing that anymore. 🤷 My workflow is more straightforward: I make a zettel, send to Obsidian, and work on it there. All the Obsidian related automation is moving into Obsidian.</p>
<p>Just like Blog Action there's a Script Action that translates the Draft object into a Simple Markdown Zettelkasten file and sets up variables. Because I use iCloud to sync Obsidian the <em>same</em> File Action can work on both Mac and iOS.</p>
<p>The File Action is a blessing. Before the File Action I had been using a Callback URL to send the data to Obsidian… and it was <em>extremely</em> buggy. Obsidian's long load times sometimes causes it to forget the reason I asked it to load in the first place. Very frustrating. Now it works instantly and every time. If you want to use a Obsidian command or any part of Obsidian Advanced URLs to place the file you still need to use a Callback URL but for simple file creation the File Action is very clean.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>In the future I need to refactor Blog and Obsidian to use the same YAML API shared action… they have two separate but nearly identical implementations of Drafts -&gt; Markdown+YAML.</p>
<p>I've very happy with Greg's updates to my favorite application. I know it's impossible… but I wish it worked on other platforms. It's a large part of what's tying me to Apple's ecosystem.</p> ]]></description>
    </item>
    <item>
       <title>I&#39;m Still Afraid to be Weird</title>
       <link>http://evantravers.com/articles/2023/04/07/i-m-still-afraid-to-be-weird/</link>
       <pubDate>Fri, 07 Apr 2023 20:49:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/07/i-m-still-afraid-to-be-weird/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>That last post is very silly. I will forever treasure my wife's look of delight and disbelief as I shyly showed her the bizarre thing I was trying.</p>
<p>It's also <em>very</em> cool. I've been thinking about something like that and wanting to try something along those lines since I first saw <a href="https://www.youtube.com/watch?v=NbVOEKKcLgU">Loren's video on the Atreus</a> and read about <a href="https://atreus.technomancy.us/deck">Technomancy's Atreus Deck</a>. I've seen people attaching corne keyboards to the sides of VR headsets, and I think I found something better and kinda new. I feel like I'm adding something to the computing-on-the-go cyberdeck conversation with my silly magnets.</p>
<p>But I am disheartened at the sheer number of puerile jokes about where I'm going to put the joystick.</p>
<p>I suppose I ought to have predicted that. I should have steeled my mind for it. I thought I had… but nope. 🤷</p>
<p>I made the post for the four people I knew would find it equally hilarious and cool. I stand by that. I just wish I could shut out the four hundred people hoarding karma by tearing others down.</p> ]]></description>
    </item>
    <item>
       <title>MagSafe Tenting and Wearable Keyboards</title>
       <link>http://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/</link>
       <pubDate>Thu, 06 Apr 2023 11:32:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/06/magsafe-tenting-and-wearable-keyboards/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/tented-zen.png"></p><p>I've been anxiously following the progress of #zen-custom-mods on Lowprokb.ca's discord… people doing some very clever 3d printed stands for my beloved <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">Zen keyboard</a>.</p>
<p>The previous solutions all required hot-gluing some magnets to the Zen, or 3D-printing a custom shelf to mount the magnets in and then place your Zen into.</p>
<p>A month or so ago I came across <a href="https://github.com/SethMilliken/swept-corne-zmk/blob/magsafe-mount/README.md">Seth Millikin's gist</a> on using MagSafe for keyboard mounts. This seemed perfect… with the advent of MagSafe there were lots of options, and I decided to invest and see how it works.</p>
<p>Man is it <em>awesome</em>.</p>
<p>Here's the build list:</p>
<p><img src="https://images.evantravers.com/articles/2023/04/stickers-and-tripods.png" alt="build list" /></p>
<ul>
<li><a href="https://www.amazon.com/dp/B0BPLW4ZTZ">QKOO Magnetic Tripod Adapter</a></li>
<li><a href="https://www.amazon.com/dp/B00HCAB8MU">Manfrotto Pocket Tripod MP3-BK</a></li>
<li><a href="https://www.amazon.com/dp/B08S6XQFDM">cheap MagSafe stickers</a>… I had to buy two packs so that I could get the black ones to match my A E S T H E T I C.</li>
<li><a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">3x5 Corne-ish Zen</a></li>
</ul>
<p>All I had to do was eyeball a position for the sticker that both seemed like a natural balance point and didn't interfere with the screw placement on the baseplate. I screwed the puck on the tripod… and that's it. Job done. The magsafe sticker is thinner than the already small bump-ons on the baseplate so it doesn't interfere at all with the normal usage of the Zen. The quality of the products (and my matte-black aesthetic) means that it even feels like it was designed for each other.</p>
<p>I put it together and was amazed at the strength of the magnetic bond. The QKOO magnetic pucks have a light rubber-ization on the contact points and are quite strong. Together with my all black Zen it becomes a very natural object and it's solid. It actually takes some hand strength to break the tripod and board apart. The extra weight is actually really nice on the desk. The tripod has an inch of play back and forth for the screw… given the strength of the bond you could probably shift the sticker more outboard and achieve some extreme tents with the Manfrotto, or just <a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/123hfrl/tent_system_using_magnets/">buy a different stand like bastardkb</a>.)</p>
<p>After using it happily for the past few weeks… I started googling for a MagSafe adapter on a strap… ever since reading the <a href="https://mgsloan.com/posts/supine-computing/">post on supine computing</a> I've wanted to have a setup that would work in a hammock. 🤷 After searching fruitlessly for an hour, I wondered if the existing magnet pucks would work just sitting in my pocket.</p>
<p><img src="https://images.evantravers.com/articles/2023/04/on-pocket.png" alt="on pocket, on fleek" /></p>
<p><strong>Oh they do</strong>. And not just in flimsy gym-pants, but in normal work pants<sup class="footnote-ref"><a href="#fn-pants" id="fnref-pants" data-footnote-ref>1</a></sup>. I can walk, pace, jump, and stomp. You have to be careful not to &quot;brush&quot; the board off the contact point laterally while moving around, but it's pretty secure.</p>
<p>After playing with it for a day, I recommend flattening the tripod's supports before placing in your pocket. By conforming the tripod supports to your leg you can create a more stable platform upon which to type. You can adjust the keyboard's height by positioning the magnet in pocket prior to attaching the keyboard to the outside.</p>
<p>If your pockets are deeper than your arms are long, this may be a solution that could work for you. This opens up a whole bunch of silly options for working… and if the fabled Apple VR Headset is truly <a href="https://www.apple.com/newsroom/2023/03/apples-worldwide-developers-conference-returns-june-5/">around the corner</a> then wearable typing like this may be still more important. I started out doing this as a silly experiment… but after using it for a day I could see myself actually choosing this in certain circumstances… even if it does make my wife double over with laughter.</p>
<p><img src="https://images.evantravers.com/articles/2023/04/torso.png" alt="showing neutral arm position" /></p>
<p>Related:</p>
<ul>
<li><a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/128lx5k/typing_on_keyboard_attached_to_magic_arms/">/u/vagabionda on Reddit using MagSafe with A/V &quot;magic arms&quot; for a HOTAS style setup</a></li>
<li><a href="https://www.reddit.com/r/ErgoMechKeyboards/comments/123hfrl/tent_system_using_magnets/">/u/bastardkb using a different pocket tripod and building a magnetic plate into the bottom of a larger keyboard</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-pants">
<p>Tested in Lululemon cotton twill pants. <a href="#fnref-pants" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Run Lua in Shortcuts</title>
       <link>http://evantravers.com/articles/2023/04/05/run-lua-in-shortcuts/</link>
       <pubDate>Wed, 05 Apr 2023 09:34:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/05/run-lua-in-shortcuts/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/lua-in-shortcuts.png"></p><blockquote>
<p>Hammerspoon provides an action for use in the Shortcuts app. The action is called &quot;Execute Lua&quot; and if it is passed a text block of valid Lua, it will execute that Lua within Hammerspoon.</p>
</blockquote>
<p>How in the <em>world</em> have I not read <a href="https://www.hammerspoon.org/docs/hs.shortcuts.html">this paragraph</a> before? 🤯 I still stand by my decision to have <a href="https://evantravers.com/articles/2023/02/17/headspace-v2-0-simple-and-headless/">Headspace work via URLs</a>, but this feature unlocks a whole bunch of big-boy automation.</p>
<p>For instance…</p>
<p>Something I've missed in my transition from 100% Hammerspoon to <a href="https://evantravers.com/articles/2023/02/20/raycast-shortcuts-headspace/">driving Shortcuts via Raycast</a> is that my <a href="https://github.com/evantravers/hammerspoon-config/blob/f764fe88353fc9169e9fd28466d7852c248e90f7/spaces/shutdown.lua#L14-L22">old version</a> would close every running app when I ran the space.</p>
<p>I like the practice of knowing that I'm &quot;laying down all my work&quot; at the end of the day, but I haven't found a way to find and kill running application using pure Shortcuts. Using this newly discovered Lua action I can now directly copy my old code into the Shortcut… hey presto!</p>
<p>* scurries off to rewrite a bunch of automation *</p> ]]></description>
    </item>
    <item>
       <title>Wezterm and Neovim Dark Mode Synced to OSX</title>
       <link>http://evantravers.com/articles/2023/04/04/wezterm-and-neovim-dark-mode-synced-to-osx/</link>
       <pubDate>Tue, 04 Apr 2023 07:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/04/wezterm-and-neovim-dark-mode-synced-to-osx/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/lightdarktransition.png"></p><p>This is honestly the main reason that I'm sticking with Wezterm for the moment over Kitty. I've been trying to have OSX, my terminal, and my editor all have the same synced theme for ten years… since iTerm days!</p>
<p>I switch my OS appearance between light and dark mode quite a bit. While I'm chiefly dark mode only, I choose light mode to present on a projector or because I'm in a coffee shop with an early morning glare, or just because I want a change. Because Wezterm is live evaluates its configuration table it can live switch between the two, and I finally found a way to keep Neovim synced. I can change between light and dark and everything on my computer changes flawlessly. <em>* chef's kiss *</em></p>
<p>Wezterm provides <a href="https://wezfurlong.org/wezterm/config/lua/wezterm.gui/get_appearance.html">an example function for following the OS appearance rules</a>. It was shockingly easy. In Kitty I was running a Fish command to send the Kitty server a command. This is much easier.</p>
<p>Now Neovim… I started by trying to set an environment variable, but that won't affect already open editors. I found <a href="https://github.com/cormacrelf/dark-notify">@cormacelf's dark-notify</a> which watches for OS changes on OSX <em>and</em> has a Lua based Neovim plug-in. Now every instance of Neovim shifts along with the OS!</p>
<p>The whole <a href="https://github.com/evantravers/dotfiles/commit/44ca7f4878fb0d8a52a3fdc4e0726e63a6359889">commit for Neovim is here</a>… I just made sure that it gets installed on new boxes, it works, and I'm really happy with it.</p>
<p>Check it out!</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/rghc3_h-PGo"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div> ]]></description>
    </item>
    <item>
       <title>Trying Wezterm From Kitty</title>
       <link>http://evantravers.com/articles/2023/04/03/trying-wezterm-from-kitty/</link>
       <pubDate>Mon, 03 Apr 2023 07:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/04/03/trying-wezterm-from-kitty/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/04/wezterm.png"></p><p>When my friend <a href="https://megalithic.io/">Seth</a> told me he was trying <a href="https://wezfurlong.org/wezterm/index.html">Wezterm</a>, I paid attention.</p>
<p>I've been using <a href="https://sw.kovidgoyal.net/kitty/">Kitty</a> as my terminal for <a href="https://github.com/evantravers/dotfiles/commit/4eff48dd809d166e7c29207eb210e7fe776fea3c">at least five years</a>. I honestly didn't have much of a reason to change, but I trust Seth so I dug into the docs.</p>
<p>I'm still a weirdo when it comes to modern terminals: I use none of the nifty tab and window features <a href="https://coderwall.com/p/_g2vpq/workflow-in-tmux">because I mostly use tmux</a>. Therefore I didn't read much about Wezterm's session and pane features, but they seem up to snuff. I require a very minimal UI, fast refresh and response rate, and plaintext config.</p>
<p>The Lua API is expressive and very complete with good documentation. I was able to find all the random features I cared about and set them easily because Wezterm live reloads its own config! No more making a config file change and wondering what changed. Very handy for debugging colors and such.</p>
<p>Speaking of colors, Wezterm prepackages <a href="https://github.com/mcchrish/zenbones.nvim">my favorite color scheme</a> and <a href="https://www.jetbrains.com/lp/mono/">font</a> which means that cross platform configuration is much easier and has no dependencies. It even has fallback fonts for emojis and <a href="https://www.nerdfonts.com/">NerdFont icons</a> so you don't have to run a font patch.</p>
<p>Wezterm supplies <a href="https://wezfurlong.org/wezterm/faq.html?h=terminfo#how-do-i-enable-undercurl-curly-underlines">a patched terminfo</a> supporting curl underlines and italics to which I've become accustomed. I just <a href="https://github.com/evantravers/dotfiles/commit/d26d1e58cd3c328024e1c193e78285b0402cd016">made a small Makefile update</a> to ensure that it gets auto installed.</p>
<p>I'm still exploring all the features. I keep finding really nice things to play with like <a href="https://wezfurlong.org/wezterm/cli/record.html?h=record">record to asciicast and replay</a> and <a href="https://wezfurlong.org/wezterm/config/lua/config/hyperlink_rules.html?h=url">custom URL handlers for clicking on ticket references</a>.</p>
<p>I'm trying Wezterm as my daily driver for a bit. Live editing the config is quite pleasant, and bundling the color and font with the terminal means that getting my dev environment aesthetics in linux should be <em>much</em> easier… and there's one more feature I'm quite excited about that deserves it's own post.</p> ]]></description>
    </item>
    <item>
       <title>Obsidian 12WY Review Template</title>
       <link>http://evantravers.com/articles/2023/03/28/obsidian-12wy-review-template/</link>
       <pubDate>Tue, 28 Mar 2023 13:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/03/28/obsidian-12wy-review-template/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/03/graph_dark.png"></p><p>It's the 13th week of the year… I'm supposed to use this time to consider my goals, review my intentions, and <a href="https://evantravers.com/articles/2021/05/29/review-12-week-year/">plan the next twelve weeks</a>.</p>
<p>Instead, I've been staying up till midnight automating the Quarterly template. 🤷</p>
<p>I've been using this template for <a href="https://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/">quite some time</a>… but each quarter required some setup. I had to choose a color, set the start week, and (if required) update the year everywhere it appeared in the code. No more!</p>
<p>Here's <a href="https://gist.github.com/evantravers/448be97bde47e71f341da1e1d4fe5021">the whole thing in a gist</a>, but let's walk through it!</p>
<p>Let's make sure you have all the dependency plugins:</p>
<ul>
<li><a href="https://github.com/liamcain/obsidian-periodic-notes">Periodic Notes</a> to handle quarterly and weekly notes.</li>
<li><a href="https://github.com/SilentVoid13/Templater">Templater</a> to insert the template.</li>
<li><a href="https://blacksmithgu.github.io/obsidian-dataview/">Dataview</a> to do data magic with YAML frontmatter.</li>
<li><a href="https://github.com/phibr0/obsidian-charts">Obsidian Charts</a> for visualizations.</li>
</ul>
<p>Periodic Notes is configured to enable quarterly notes and weekly notes.
The paths for those notes are <code>/journal/quarterly</code> and <code>journal/weekly</code>.
You could put them anywhere, but you'd have to rewrite some of the
following dataviewjs.</p>
<p>Now let's look at the &quot;bones&quot; of our template in markdown, named <code>&lbrace;year&rbrace;-Q&lbrace;number&rbrace;</code>.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># rate your intention from 1 to 5 in the following roles…</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">roles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Follower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Husband</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Father</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Friends</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Work</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Hobbies</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Emotions</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Mental</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Health</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Rest</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Finances</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># &lbrace;&lbrace;date:YYYY&rbrace;&rbrace;-Q&lbrace;&lbrace;date:Q&rbrace;&rbrace;
</div><div class="line" data-line="18"></span>
</div><div class="line" data-line="19"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Plan
</div><div class="line" data-line="20"></span>
</div><div class="line" data-line="21"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Goals
</div><div class="line" data-line="22"></span>
</div><div class="line" data-line="23"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">#### Goal 1: _Goal_
</div><div class="line" data-line="24"></span>
</div><div class="line" data-line="25"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">#### Goal 2: _Goal_
</div><div class="line" data-line="26"></span>
</div><div class="line" data-line="27"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Review
</div><div class="line" data-line="28"></span>
</div><div class="line" data-line="29"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### How do you rate your intentions in each area of life?
</div><div class="line" data-line="30"></span>( dataview visualization of intentions over quarters )
</div><div class="line" data-line="31">
</div><div class="line" data-line="32"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Scoreboard
</div><div class="line" data-line="33"></span>( dataview visualization of accomplishing 12WY goals in Weekly notes )
</div></code></pre>
<p>You can remove and add <code>roles</code> from the YAML frontmatter if you want, they are automatically pulled into the visualizations.</p>
<p>Let's look at that first visualization, in a <code>dataviewjs</code> block:</p>
<p>All <code>s/1</code> does is convert the string representing a quarter into a number: <code>s(&quot;2023-Q1&quot;) = 20231</code> which can be easily sorted<sup class="footnote-ref"><a href="#fn-wat" id="fnref-wat" data-footnote-ref>1</a></sup>… by the next function. Unfortunately when I first wrote the compare function, I used <code>&lt;</code> instead of <code>-</code> and got very unpredictable results. The compare for a sort is supposed to return an integer, not a boolean.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// we have to sort somehow, so we convert the strings to numbers and</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// sort the numbers</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Number</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;-Q&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allQuarters</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// get all files in &quot;journal/quarterly&quot;</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&quot;journal/quarterly&quot;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">array</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// ensure they are in sequential order, not last-modified</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// find the current file in the list</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">currentIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allQuarters</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">findIndex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">q</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">q</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// slice the list of all quarters into the current and previous three.</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarters</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allQuarters</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Math</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">max</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">currentIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">currentIndex</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Now that we have our data sources, it's time to build the actual visualization!</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datasets</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// make an rgba color transparent</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trans</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;, 1)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;, 0.5)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// declaring some monochrome grays</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;rgba(105,105,105, 1)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;rgba(169,169,169, 1)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;rgba(211,211,211, 1)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// this purple is the highlight color from the default Obsidian theme.</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">purple</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;rgba(139,108,239, 1)&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#fff&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// if we are in light mode, invert the color scheme.</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">document</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">classList</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;theme-light&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reverse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#000&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">purple</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="26">
</div><div class="line" data-line="27"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarters</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarters</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hasOwnProperty</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;roles&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="30">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// this line gets an array of all the roles you specified in this quarter&#39;s YAML.</span>
</div><div class="line" data-line="31">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">values</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">roles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Object</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">values</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flat</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datasets</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">unshift</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="34">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">label</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="35">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">values</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="36">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fill</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="37">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backgroundColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trans</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="38">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">borderColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="39">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pointBackgroundColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="40">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pointBorderColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="41">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pointHoverBackgroundColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="42">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pointHoverBorderColor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">colors</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">i</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="43">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="44">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="45"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="46">
</div><div class="line" data-line="47"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span>   <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">roles</span>
</div><div class="line" data-line="48"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span>   <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Object</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">flat</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="49">
</div><div class="line" data-line="50"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">const</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chartData</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="51">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;radar&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="52">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="53">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">labels</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keys</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="54">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datasets</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datasets</span>
</div><div class="line" data-line="55">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="56">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">options</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="57">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scales</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="58">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">r</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="59">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">suggestedMin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="60">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">suggestedMax</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">5</span>
</div><div class="line" data-line="61">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="62">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="63">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="64"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="65">
</div><div class="line" data-line="66"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">renderChart</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chartData</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">container</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Cool!</p>
<p><img src="https://images.evantravers.com/articles/2023/03/graph_light.png" alt="light mode" /></p>
<p>The second visualization is a simpler table with <em>more</em> gross JS that shouldn't be stared at too long.</p>
<p>I believe the math computing the quarters holds up… but it hurts my head nonetheless.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// quick function to display the results as emoji</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bool</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bool</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;✅&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;⛔&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parseInt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Q</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Q&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">4</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// I&#39;m _pretty_ sure this math works out correctly.</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// I work on my goals for 12 weeks, plan/rest for one, repeat.</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarter</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">13</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Week&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Goal 1&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Goal 2&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pages</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&quot;journal/weekly&quot;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">RegExp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-W(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\\</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d+)`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parseInt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;asc&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parseInt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">RegExp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-W(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\\</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d+)`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Goal1&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Goal2&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>The resulting visualization looks like this!</p>
<p><img src="https://images.evantravers.com/articles/2023/03/table.png" alt="I've been a good boy" /></p>
<p>This is nearly identical to the old version. The main change is using <code>new RegExp</code> instead of the Regex literals to build the regex. By switching to the constructor I can use a literal string to interpolate in the current year so that I don't have to update my template every year.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>I hope this inspires you to consider some visual accountability for your next quarter's journaling and planning. As for me, now that I've written this post I can get back to planning my next 12WY.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-wat">
<p>To explain this, let me show you a <a href="https://www.destroyallsoftware.com/talks/wat">wat</a>.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">❯</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">node</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Welcome</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Node</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">js</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">v19</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.6</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Type</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;.help&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">more</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">information</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarters</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q4&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q2&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q3&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q1&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q4&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q2&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q3&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q1&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quarters</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q4&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q2&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2022-Q3&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;2023-Q1&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> # <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wat</span>
</div></code></pre>
<a href="#fnref-wat" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Is This Where I Want To Be?</title>
       <link>http://evantravers.com/articles/2023/03/13/is-this-where-i-want-to-be/</link>
       <pubDate>Mon, 13 Mar 2023 13:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/03/13/is-this-where-i-want-to-be/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/qjBbnwDJHOg"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>I'm distraught that I'm going to miss the closest Nickel Creek show to me. This track feels so poignant. A band defined by the tightness of harmony that has been apart for almost a decade, musically musing whether there is something to which is worth returning.</p>
<p>I get emotional at the subtle turn when the repetitive wondering motifs slide from despairing minors to hopeful majors. As someone who grew up with the band the same whirling questions about old habits, hobbies, and communities often play in my head. Maybe this song will inspire me to keep shoveling at the bottom of old dry wells.</p>
<p>See them live if you can, and pick up the new album on the 24th.</p> ]]></description>
    </item>
    <item>
       <title>Hot Take: Elecom Bitra Finger Trackball</title>
       <link>http://evantravers.com/articles/2023/03/06/hot-take-elecom-bitra-finger-trackball/</link>
       <pubDate>Mon, 06 Mar 2023 15:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/03/06/hot-take-elecom-bitra-finger-trackball/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/03/bitra.png"></p><p>I've got an Elecom Bitra Finger trackball sitting in front of me. Here's some thoughts after a two weeks of usage:</p>
<h2><a href="#why" aria-hidden="true" class="anchor" id="why"></a>Why</h2>
<p>I've been <em>very</em> happy with my <a href="https://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/">perfect travel mouse</a>. As spring approaches I have found myself at a rustic picnic table and finding that even the best mouse is useless without a relatively flat surface. I'm interested in cutting the mousepad out of my <a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">office in a bag</a> and using a trackball also supports <a href="https://mgsloan.com/posts/supine-computing/">unusual working positions</a>… and my hammock is calling my name.</p>
<p>I honestly think the correct answer for most people here is an Apple Magic Trackpad. It's rechargeable, simple, and <em>just works</em>. Much of my daily pointer usage is dragging rectangles. Holding the trackpad tension with my thumb<sup class="footnote-ref"><a href="#fn-injury" id="fnref-injury" data-footnote-ref>1</a></sup> and moving my fingers on a trackpad for extended periods of time has been the primary causes of RSI for me. I could attempt a different position or gesture, or I could buy a new toy! 🤷</p>
<h2><a href="#elecom-bitra" aria-hidden="true" class="anchor" id="elecom-bitra"></a>Elecom Bitra</h2>
<p>The <a href="https://elecomus.com/web/product/2-4ghz-wireless-finger-operated-compact-size-trackball-mouse-m-mt2drsbk/">Bitra</a> is the smallest of Elecom's trackball offerings and marketed as a travel device. It comes in both a finger and thumb trackball version, I chose the finger one to try and avoid aggravating the thumb injury<sup class="footnote-ref"><a href="#fn-injury" id="fnref-injury-2" data-footnote-ref>1</a></sup>. It's about 60% of the size of the Steelseries Prime Mini. It's not a primo device but it doesn't feel cheap, and it comes with a nice soft case.</p>
<p>The first copy that arrived from Amazon I used for a week. I could see moments of greatness… but the tracking was awful and the ball was scratchy. I returned it for another after <a href="https://www.reddit.com/r/Trackballs/comments/vvzsd4/elecom_bitra_might_have_lost_the_qc_lottery/">reading Elecom's quality can be hit or miss</a>… and the second was much smoother and had that &quot;inertia&quot; feeling to it. I still have this one in front of me.</p>
<p>It's powered by a single AAA battery that seems to drain about 10% a day. There are <a href="https://www.amazon.com/Lithium-Rechargeable-Battery-Capacity-Constant/dp/B08C7SJLSL/ref=sr_1_3_sspa?keywords=usb+c+aaa+battery&amp;qid=1678135056&amp;sr=8-3-spons&amp;psc=1&amp;smid=AFMJJSYH6EAW8&amp;spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyV1NUSUJRSDVGSkdDJmVuY3J5cHRlZElkPUEwMjI0ODE1MjI3QVlJMDJIWEpUOSZlbmNyeXB0ZWRBZElkPUEwNjAzMTAzUTZJOFpCRVFHVEI3JndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==">USB-C batteries</a> out there, but I wish it had a built in battery pack that lasted for longer.</p>
<p>The Bitra comes as both a Bluetooth only and a model with a USB-A dongle. In the name of simplicity (and no more USB-A!) I chose Bluetooth. It works well enough with the slight lag that BT introduces.</p>
<h2><a href="#using-it" aria-hidden="true" class="anchor" id="using-it"></a>Using It</h2>
<p><img src="https://images.evantravers.com/articles/2023/03/picnic.png" alt="picnic" /></p>
<p>That's all well and good… but what is it like to use?</p>
<p>I have medium hands, so the Bitra falls into a various &quot;claw-style&quot; grabs. The primary click has several planes for your thumb to rest so it is very friendly to holding in different styles.</p>
<p>The layout weirdly makes sense to me, but it basically takes every element of a normal mouse and moves the responsibility to a different part of your hand.</p>
<ul>
<li>LMB -&gt; thumb</li>
<li>RMB -&gt; pinky</li>
<li>Scrollwheel -&gt; thumb</li>
<li>pointing -&gt; fingers</li>
</ul>
<p>I find it relatively natural. (I have been 100% on the trackball for work, but switching to a mouse for games.) I especially like scrolling with my thumb rather than the weird wrist twerk usually required to get your fingers to scroll a wheel.</p>
<p>I have found that I need to be careful to relax my fourth and fifth fingers. I typically run a &quot;claw&quot; grip on mice, so I am accustomed to applying pressure to the outside edge of the mouse with those fingers. Because the Bitra is so small, that habit can cause some hand strain as my hand holds onto something it's not moving at all. I am retraining my hand to use fourth finger on top and dangle the fifth with no pressure.</p>
<p>I haven't been able to get any of the Elecom software to run on my M1 Mac, although there are reports on Reddit of it working. The default buttons solve everything I want to do.</p>
<h1><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h1>
<p>I'll likely keep this Bitra as a cheap and useful option. It's a great tool to have: RSI can be avoided by changing up inputs to avoid the titular repetitive stress. It's something I can grab headed out the door to have an ergonomic environment on the go, and most likely will be stationed semi-permanently in the Mobile Office. At home, I don't see myself going all in on the trackball. Mousing doesn't seem to be a source of RSI for me… and while I have to be intentional about manipulating the trackball I don't even think about using a mouse. Things just happen.</p>
<p>For fun I ran <a href="https://mouseaccuracy.com/">mouseaccuracy.com</a> on my mouse<sup class="footnote-ref"><a href="#fn-mouse" id="fnref-mouse" data-footnote-ref>2</a></sup>, my trackpad<sup class="footnote-ref"><a href="#fn-trackpad" id="fnref-trackpad" data-footnote-ref>3</a></sup>, and the trackball<sup class="footnote-ref"><a href="#fn-trackball" id="fnref-trackball" data-footnote-ref>4</a></sup>. The results are pretty much as you would expect, although I was impressed at how quickly I was able to pick up the trackball.</p>
<p>If someone wants to make a small USB-C chargeable travel<sup class="footnote-ref"><a href="#fn-travel" id="fnref-travel" data-footnote-ref>5</a></sup> trackball… lemme know. 😄</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-injury">
<p>My thumb injury is also aggravated by the scrolling gesture on my phone. <a href="#fnref-injury" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a> <a href="#fnref-injury-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1-2" aria-label="Back to reference 1-2">↩<sup class="footnote-ref">2</sup></a></p>
</li>
<li id="fn-mouse">
<p><img src="https://images.evantravers.com/articles/2023/03/mouse.png" alt="mouse" /> <a href="#fnref-mouse" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-trackpad">
<p><img src="https://images.evantravers.com/articles/2023/03/trackpad.png" alt="trackpad" /> <a href="#fnref-trackpad" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-trackball">
<p><img src="https://images.evantravers.com/articles/2023/03/trackball.png" alt="trackball" /> <a href="#fnref-trackball" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-travel">
<p>Maybe Keychron (who keeps releasing <a href="https://www.keychron.com/pages/m4-wireless-mouse">very capable and affordable looking USB-C and bluetooth capable mice</a>) will take on that challenge. <a href="#fnref-travel" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Middle-Aged Reactions to Teenaged TikTok Filter</title>
       <link>http://evantravers.com/articles/2023/02/25/middle-aged-reactions-to-teenaged-tiktok-filter/</link>
       <pubDate>Sat, 25 Feb 2023 08:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/25/middle-aged-reactions-to-teenaged-tiktok-filter/</guid>
       <description><![CDATA[ <p>I was sucked in to this stream of reaction videos for at least thirty minutes. The videos are emotionally compelling… a bittersweet mixture of loss or catharsis… often mixed with a desire to re-live or comfort their past self.</p>
<p>These reactions are really interesting and sweet… but I can't help wonder if we were given the choice to have everyone's reality goggles see the 3rd gen version of this where we are forever young and beautiful… would we as a culture choose reality or lies?</p>
<p>Kind of a Tower of Babel kinda thing… no one will ever forget us and we will reach the heavens.</p>
<p>But for now… we apparently have a magic time-travel mirror. Do with it what you will.</p>
<p>Found on <a href="https://waxy.org/2023/02/reactions-to-the-face-age-filter-on-tiktok/">waxy.org</a></p><p><a href="https://twitter.com/memotv/status/1628758590033993728" class="u-in-reply-to  is-reply">Middle-Aged Reactions to Teenaged TikTok Filter - twitter.com</a></p> ]]></description>
    </item>
    <item>
       <title>My Terrible Car I Bought With Data</title>
       <link>http://evantravers.com/articles/2023/02/24/my-terrible-car-i-bought-with-data/</link>
       <pubDate>Fri, 24 Feb 2023 17:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/24/my-terrible-car-i-bought-with-data/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/02/googlesheet.png"></p><p>Data-driven decisions are vulnerable to a dangerous fallacy, a version of The Map Is Not The Territory fallacy: optimizing for maximum value given the factors you can measure will give an answer… but you risk choosing a faulty local minimum because of factors you forget or can't measure.</p>
<p>Anyway, I now own a terrible car that will last forever. 🤷</p>
<p>Years ago my first car (A trusty Honda Civic) finally perished. I spent a week of nights scouring Craigslist, clicking on <em>every</em> link with the words &quot;civic,&quot; &quot;accord,&quot; &quot;corolla.&quot; Mind numbingly boring. That listing was far away. That one was dirty. Too expensive. Too scary. It's the least fun game of Goldilocks I've ever played.</p>
<p>While googling &quot;How to buy a car&quot; I learned that certain years tend to be more reliable: roughly the last two years of a body-style. Every four to five years car companies give their car a makeover. The first few years of that new style have teething problems and the last years of that generation are the statistically more reliable.</p>
<p>I also wanted to buy one that was mechanically sound and didn't rely on expensive computer parts… usually cheaper to repair with the mechanics I was using. That (and my limited budget) ruled out some of the newer models. At that time that meant searching for years between 2006 and 2012.</p>
<p>This… sounds like a heuristic! I was bored, so I rolled up <code>nokogiri</code> and started <a href="https://gist.github.com/evantravers/754c4e1084edf55e2f358e679f2a29d6">breaking TOS with a webscraper</a>.</p>
<p>If you aren't a rubyist: I wrote a program that clicked on every link in Craigslist that matched my criteria, copied the values out of the years, location, and mileage, and made a spreadsheet of only vehicles that interests me.</p>
<p>At first, it was great! I ran the script on my lunch break I saved myself thirty minutes of scrolling and used the list of links to shop quickly and efficiently.</p>
<p>I was still overwhelmed. How could I spot the diamond in the rough? I could ask someone for help… or I could use made-up napkin math! (I chose made up math. 👨‍🔬)</p>
<p><img src="https://images.evantravers.com/articles/2023/02/graph.png" alt="graphing" /></p>
<p>I threw the CSV into Google Sheets and decided that a good way to narrow the field was to assume that all these cars had a lifespan of 250k miles. My napkin math formula was the <code>(250k Miles - Current Mileage) / Current Price = Price per Prospective Mile</code>. It's a good enough theory, and the data seemed to confirm it: Normalized for price per prospective mile most of the cars had an average value. Newer cars had lower mileage and high price, older cars had higher mileage and low price, and the price per mile was about the same across all six years and all models. I started graphing, prodding, and playing with the data… and a couple days into using this system The Outlier jumped off the graph.</p>
<p>It seemed too good to be true.</p>
<p>The Outlier was a 2006 Honda Accord. Towards the end of its body style, and desirable because it has a rare chain drive. I test drove The Outlier with my wife, the car seemed fine, seemed ok… I felt victorious and validated. I can solve adult problems without help and with code!</p>
<p>I drove it home and the next day whatever they had sprayed in The Outlier to deaden the smoke odor had disappeared and my new commuter car revealed the power to instantly grant me migraine headaches. Several large payments and three ozone treatments later… you can't smell the smoke except on very hot and humid days. I live in a very hot and humid place. 😓</p>
<p>Over time I learned some other quirks of The Outlier.</p>
<p>It's got a broken computer programmed by Fremen: blinkers and windshield wipers are strange, they toggle without rhythm to avoid attracting the worm.</p>
<p>It's got a slick, weird stain that will <em>not</em> come out no matter how I scrub.</p>
<p>The cabin has humidity issues from <em>somewhere</em>, so the cabin fabric is dropping away from the roof.</p>
<p>I kinda wonder if someone died in it.</p>
<p>But it is low mileage and has a chain drive so it's likely I'll be driving my data-driven Outlier decision for far longer than I would wish. It will remain in my garage with its key in my pocket to remind me of my hubris: I optimized for two valuable factors… but in my cleverness I forsook wisdom… and forgot all the ways humans can disguise a lemon. 🍋</p>
<p>Be careful with your data-driven decisions, you could be stuck driving them.</p> ]]></description>
    </item>
    <item>
       <title>Struggling to Write</title>
       <link>http://evantravers.com/articles/2023/02/20/struggling-to-write/</link>
       <pubDate>Mon, 20 Feb 2023 14:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/20/struggling-to-write/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<blockquote>
<p>I like to write about small things.</p>
</blockquote>
<p>– David Byrne, <em>Stop Making Sense Interview</em></p>
<p>I think I'm getting hung up on my &quot;big ol' essay&quot; standard. My blog used to have small thoughts… prayers… links. I probably need to get back to that. It's easy scope-creep my standards until I can't meet my own requirements.</p>
<p>I need a reset.</p>
<p>Like this little post.</p>
<p>Thanks for reading. 🫶</p> ]]></description>
    </item>
    <item>
       <title>Raycast, Shortcuts, Headspace</title>
       <link>http://evantravers.com/articles/2023/02/20/raycast-shortcuts-headspace/</link>
       <pubDate>Mon, 20 Feb 2023 06:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/20/raycast-shortcuts-headspace/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/02/raycast_headspaces.png"></p><p>Ok. We have <a href="https://evantravers.com/articles/2023/02/16/raycast-review-as-an-longtime-alfred-user/">Raycast</a>. We have <a href="https://evantravers.com/articles/2023/02/17/headspace-v2-0-simple-and-headless/">Headspace 2.0</a>. How am I using it?</p>
<p>The original user story for Headspace was born out of a desire to transform my computer usage into a more focused &quot;monotasking&quot; environment. I've adopted a few practices to enable monotasking:</p>
<ul>
<li>I set an intention for <a href="https://evantravers.com/articles/2020/05/09/creating-a-focus-budget/">each block of time</a></li>
<li>I close all applications that distract me from my intention</li>
<li>I set up a task-specific work environment</li>
<li>I track my time spent on that task</li>
</ul>
<p>With that in mind, my computing &quot;headspace&quot; is as follows:</p>
<ul>
<li>a rule describing applications I use for this task</li>
<li>an intention for the next block of time saved as a Toggl timer description</li>
<li>a classification of the next block or time saved as a Toggl timer project</li>
<li>some scripted behavior for this kind of work (open a project folder, align my windows, etc.)</li>
</ul>
<p>For the past two and a half years, <a href="https://evantravers.com/articles/2020/06/19/hammerspoon-headspace/">Headspace v1.0</a> handled <strong>all</strong> of this in lua using a from scratch UI built in hammerspoon. <a href="https://evantravers.com/articles/2023/02/17/headspace-v2-0-simple-and-headless/">Headspace v2.0</a> only handles blocking, so let's implement the other parts!</p>
<h2><a href="#raycast" aria-hidden="true" class="anchor" id="raycast"></a>Raycast</h2>
<p><img src="https://images.evantravers.com/articles/2023/02/raycast_interface.png" alt="Raycast's Shortcuts Interface" /></p>
<p>As I mentioned in my Raycast discussion, if a Shortcut accepts text input, Raycast can treat that Shortcut like a little function with an argument. This text argument handles the &quot;set an intention&quot; UI<sup class="footnote-ref"><a href="#fn-simple" id="fnref-simple" data-footnote-ref>1</a></sup>.</p>
<p>Raycast's Shortcuts extension gives you the ability to turn Shortcuts on or off for the default search, so I've turned most of my &quot;utility functions&quot; off and only enabled Headspace or similar Shortcuts.</p>
<h2><a href="#shortcuts" aria-hidden="true" class="anchor" id="shortcuts"></a>Shortcuts</h2>
<p>I'm driving the automation with Shortcuts. While I prefer to write plaintext code stored in git, but Shortcuts has one huge advantage: it syncs to my mobile devices and runs there too. I can use the same interface and scripts for both <a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022">my homescreen</a>  and my desktop. I've enjoyed grabbing my phone and notebook to sketch UIs outside, knowing that I can track my time just the same as if I were at my computer. This means that each Headspace Shortcut should be compatible on Mac and iOS.</p>
<p>I wish I had been aware that the <a href="https://support.apple.com/guide/shortcuts-mac/use-if-actions-apd83dcd1b51/mac#:~:text=Simply%20put%2C%20the%20If%20action,input%20meets%20a%20certain%20condition"><code>If</code> Shortcut Action</a> has a built-in <code>Device Type == Mac</code> conditional. It would have saved me a lot of time! To setup If this way, add an <code>If</code> Action and change the Input to <code>Device Details</code>:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/choose_device_details.png" alt="showing the input options for a raw If action" /></p>
<p>Then click/touch the newly selected Device Type <em>again</em> to select Device Type:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/choose_device_type.png" alt="Showing the sub-selections for Device Details" /></p>
<p>This unlocks conditionals for <code>is</code>, <code>is not</code>, and Direct Objects for all the Apple ecosystem. 🍏</p>
<p>While Raycast is the UI on desktop, on iOS or iPadOS I'm using the same <a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022/#shortcuts-launchers">launcher trick I've been using for a year</a>.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_headspaces_launcher.png" alt="Raycast launching a shortcut" /></p>
<p>Let's take a tour through some of the Spaces I've built.</p>
<h3><a href="#planning" aria-hidden="true" class="anchor" id="planning"></a>Planning</h3>
<p><em>Planning</em> is part of <a href="https://evantravers.com/articles/2020/06/19/hammerspoon-headspace/#how-headspace-came-to-be">the origin of the Headspace story</a>. Every day I was laying out the same windows the same way and starting a timer. Then a lightbulb came on. Repeatable steps is a program.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Start a timer labeled planning
</div><div class="line" data-line="2">Split my screen between Things and Fantastical
</div><div class="line" data-line="3">Change my Fantastical Calendar Set to Focus Budget
</div><div class="line" data-line="4">Close applications tagged Communication and Distraction.
</div></code></pre>
<p>Where before I would run some wild UI-manipulating lua<sup class="footnote-ref"><a href="#fn-lua" id="fnref-lua" data-footnote-ref>2</a></sup> now I can use built in Shortcuts Actions like this:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_planning.png" alt="Showing shortcuts UI for Planning" /></p>
<p>Thanks to the magic of Shortcuts, the layout and timer work 100% the same on all Macs and on my iPad. 👏</p>
<p>Things and Fantastical kindly provide Shortcuts Actions to manipulate and change them.</p>
<p>The lovely <a href="https://timeryapp.com/">Timery by Joe Hribar</a> has the best Shortcuts support, so where I was maintaining a from-scratch UI and <a href="https://evantravers.com/articles/2020/06/13/hammerspoon-toggl-api-calls-and-secret-tokens/">network script in lua for Toggl</a>, now I'm letting Joe do the heavy lifting. Thanks Joe!</p>
<p>Let's look at that final <code>Run Shortcut</code>  controlling Hammerspoon at the end of <em>Planning</em>:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_clear_headspace.png" alt="Shortcut: clear headspace" /></p>
<p>That's it. All it does is call the URL, and provide it a convenient handle to be shared across Shortcuts. As I was rebuilding my spaces, I realized there were only a couple types of Headspace rules in my system. Nearly all of them just &quot;Block apps tagged distraction and communication,&quot;  so there's a Shortcut now for that. Use <code>Open URLs</code>  instead of <code>Open X-Callback URL</code>. Callback doesn't return because Headspace isn't that smart yet.</p>
<h3><a href="#shallow" aria-hidden="true" class="anchor" id="shallow"></a>Shallow</h3>
<p><em>Shallow</em> is the opposite of <a href="https://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work</a>: distracted, un-focused multitasking. (Maybe I should rename it Distracted… I might use it less!)</p>
<p><em>Shallow</em>'s logic is very declarative but there's some hidden complexity. 🤷</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Determine Intention from User or Front window
</div><div class="line" data-line="2">Start Timer with that Intention (using Timery -&gt; Toggl)
</div><div class="line" data-line="3">Turn off Do not Disturb
</div><div class="line" data-line="4">Disable Headspace application blockers
</div></code></pre>
<p>And in Shortcuts:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_shallow.png" alt="showing the shortcuts app with Shallow opened" /></p>
<p>A common theme as we go along as that any moderately complex logic shared between Shortcuts gets extracted and maintained separately. (I'm a software developer, I can't help it!)</p>
<h4><a href="#get-input-or-frontmost-window" aria-hidden="true" class="anchor" id="get-input-or-frontmost-window"></a>Get Input or Frontmost Window</h4>
<p>Let's look at that first nested Shortcut. Every Headspace shortcut that can take an intention needs to have an Action that accepts text input. This can be <code>Get Text from Input</code> action, but here we use a nested shortcut called <em>Get Input or Frontmost Window</em>.</p>
<p>Here's the basic logic:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">IF Shortcut has input (the Intention) passed to it
</div><div class="line" data-line="2">  RETURN Intention
</div><div class="line" data-line="3">ELSE
</div><div class="line" data-line="4">  IF Device Type is Mac
</div><div class="line" data-line="5">    GET the Title of the frontmost window
</div><div class="line" data-line="6">  ASK user what is their intention, with the Window Title (if available) as default.
</div><div class="line" data-line="7">  RETURN Intention
</div></code></pre>
<p>And here's what that looks like in Shortcuts.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_get_input_or_title.png" alt="Screen showing the shortcut for Get Input or Frontmost Window" /></p>
<p>Most of this follows the above logic exactly except… Yep. That's another nested shortcut shared by other Shortcuts. Let's quickly glance at <em>Get Frontmost Window Title</em>.</p>
<h4><a href="#get-frontmost-window-title" aria-hidden="true" class="anchor" id="get-frontmost-window-title"></a>Get Frontmost Window Title</h4>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_get_window.png" alt="Get Frontmost Window Title" /></p>
<p>Simple except for the &quot;guard clauses&quot; that keep certain strange windows from being &quot;frontmost.&quot; That's largely why this Shortcut is broken out and shared as OSX and my applications change some other conditions may need to be added and it's nice to change it in one place.</p>
<h3><a href="#deep" aria-hidden="true" class="anchor" id="deep"></a>Deep</h3>
<p>With some of the main functions explained, let's look at a meaty Headspace Shortcut: <em>Deep</em>. <em>Deep</em> represents the work I ought to be doing: focused, uninterrupted, intentional work.</p>
<p>In my day jobby-job I work as a User Experience Designer. I balance a couple of roles and tasks, so I'm interested in tracking how much time I spend on different design activities.</p>
<p>Here's the logic:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Determine Intention from User or Front window
</div><div class="line" data-line="2">IF Intention contains &quot;Design&quot;
</div><div class="line" data-line="3">  Start Design Timer with that Intention
</div><div class="line" data-line="4">ELSE IF Intention contains &quot;Research&quot;
</div><div class="line" data-line="5">  Start Research Timer with that Intention
</div><div class="line" data-line="6">ELSE
</div><div class="line" data-line="7">  Start Deep Timer with that Intention
</div><div class="line" data-line="8">OPEN Things to my list of $High focus items
</div><div class="line" data-line="9">Close and Block Distractions and Communications
</div></code></pre>
<p>You can see the family resemblence to Shallow's logic. They share a structure, but there's some extra time tracking logic here.</p>
<p>And here's how it looks in Shortcuts (a little longer than the last two…)</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_deep.png" alt="Shortcut: Deep" /></p>
<p>The <code>Run Shortcut</code> target <em>Block Distraction and Communication</em> looks exactly like you may predict:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_block_distraction.png" alt="Shortcut: Block Distraction" /></p>
<p><em>Block Distraction and Communication</em> is shared between several of my Headspace Shortcuts. Very common. I should use it more. 😜</p>
<p>I realized while writing this Shortcut that it could absorb and contain two or three of the options I was maintaining before: I used to have a Design, Deep, and Writing spaces in lua, just to have different Projects in Toggl. Now I can just have one master <em>Deep</em> shortcut.</p>
<h3><a href="#wasted" aria-hidden="true" class="anchor" id="wasted"></a>Wasted</h3>
<p>Sadly, I'm not as focused as I make myself appear on the internet. I often find
myself some way into a block and realize I'm lost in the weeds, ignoring the original Intention.</p>
<p>Since I want to be a good steward of my God-given time, I typically track each wasted block just to nudge me towards better behavior.</p>
<p>I have been manually adding a wasted block until I realized there is repeatable logic here:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Stop the current time entry
</div><div class="line" data-line="2">Add a time block categorized Unintentionality for that same time
</div></code></pre>
<p>So now it's a Shortcut called <em>Wasted</em> ☠️:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/shortcut_wasted.png" alt="Shortcut: Wasted" /></p>
<p>If Timery supported deleting a Time Entry, I'd probably delete the duplicate entry, but this works great. I'm excited to see how showing the report of wasted time each time I run the Shortcut will hopefully change my behavior.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>As long as this madhouse epic is, you would be surprised how much I cut out of this post. I only covered three of my (at present) eleven Headspace Shortcuts… there is still a lot to share.</p>
<p>While I would like to share the actual Shortcuts with you, but they require Timery, Things, Fantastical, other things specific to my workflow. My hope was that these examples will spark your creativity to help you craft monotasking environments for your devices, applications, and purpose.</p>
<p>Think about what is the simplest expresssion of &quot;how do I set myself up for my best work?&quot; and start tinkering to see if its scriptable, build from there!</p>
<p>Let me know how I can help!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-simple">
<p>Before I had two different chooser UIs, and occasionally would get frustrated when I was trying to launch a space from Alfred or an app from Headspace. Glad to have that gone. <a href="#fnref-simple" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-lua">
<p>Taken from a <a href="https://github.com/evantravers/hammerspoon-config/blob/44cedaf4273ec3d389d164255d3d621231ece940/spaces/schedule.lua">previous implementation</a>:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focus_budget</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tonumber</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%H&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">15</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Sun&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Sat&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Fri&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=upcoming&amp;filter=%40Proctoru%2CEstimates&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=tomorrow&amp;filter=%40Proctoru%2CEstimates&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=today&amp;filter=%40Proctoru%2CEstimates&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.flexibits.fantastical2.mac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">upcoming</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">upcoming</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Hide Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Hide Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Focus Budget&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;By Week&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">teardown</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.flexibits.fantastical2.mac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Show Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Daily Focus&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="29"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<a href="#fnref-lua" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Headspace v2.0: Simple and Headless</title>
       <link>http://evantravers.com/articles/2023/02/17/headspace-v2-0-simple-and-headless/</link>
       <pubDate>Fri, 17 Feb 2023 08:30:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/17/headspace-v2-0-simple-and-headless/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p><a href="https://github.com/evantravers/Headspace.spoon/tree/2.0">Headspace V2</a> is a simple Hammerspoon script that responds to URL schemes and blocks applications based on file-system tags or names.</p>
</div>
<h2><a href="#inspiration" aria-hidden="true" class="anchor" id="inspiration"></a>Inspiration</h2>
<p>My <a href="https://evantravers.com/articles/2023/02/16/raycast-review-as-an-longtime-alfred-user/">experiments with Raycast</a> revealed a mighty cool feature: Raycast lets you send text as input to a Shortcut. This little UX affordance was the last domino for a long-promised project: <a href="https://github.com/evantravers/Headspace.spoon/releases/tag/2.0">Headspace v2</a>.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/deep_shortcut.png" alt="Showing the Raycast UI passing input to a Shortcut" /></p>
<p>I've been dreaming for a long while about breaking apart <a href="https://evantravers.com/articles/series/hammerspoon-headspace/">Headspace</a>. A few of you have kindly reached out, interested in the concept of managing your focus… but discovering quickly that if you can't program, use another automation tool, or don't want to do <em>everything</em> I do, it didn't fit. 🤷</p>
<p>I eventually realized that the <em>only</em> thing that Headspace did that other OSX automation tools didn't was block applications from launching. I decided to rewrite it without the UI, without the Toggl tracking, autolayout, or script automation features to focus on app blocking and leave the rest to you. By surfacing the controls of Headspace as URL schemes you could control your focus from whatever application you already use!</p>
<h2><a href="#testing-tags" aria-hidden="true" class="anchor" id="testing-tags"></a>Testing Tags</h2>
<p>The remaining question: how to give the end-user control over the blocklist without writing code? After some musing I realized that MacOS already has a system for creating collections: <a href="https://support.apple.com/guide/mac-help/tag-files-and-folders-mchlp15236/mac">Filesystem Tags</a>. Could that work? I tagged my favorite terminal emulator with <code>coding</code>, and threw this into the Hammerspoon console:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inspect</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagsGet</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Kitty&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2023</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">02</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">16</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">15</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">16</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">03</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Loading extension: inspect</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;coding&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Let's go! 👏</p>
<p>There is a catch… if you download from the Mac App Store, you have to put in an admin password to tag that application. Worse, you <a href="https://apple.stackexchange.com/questions/441485/help-mac-finder-constantly-asks-for-password-when-i-add-remove-tags">can't tag <em>any</em> built-in mac applications</a>. Booh. I tried to <a href="https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection">fight with SIP</a>, but it didn't help at all. After some frustration I settled on simply allowing the user to also block by name… and we were off to the races! 🏇</p>
<h2><a href="#refactoring" aria-hidden="true" class="anchor" id="refactoring"></a>Refactoring</h2>
<p>I started by <a href="https://github.com/evantravers/Headspace.spoon/commit/af48bfed4ebf6c6bb66c0ed302ed9fd3bb0fc791">stripping out toggl, the UI chooser element, autolayout, and even the concept of Spaces</a>. I wanted to focus entirely on the goal of blocking applications.</p>
<p>I re-used the <code>hs.application.watcher</code> and <code>hs.notify</code> (alert for letting you know something had been blocked,) but added to the <code>m:start</code> function some listeners for URL events:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Module:start() is a convention for starting a Spoon</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- m.watcher fires every time an application event occurs</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appName</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- but we only care about applications launching!</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launched</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- this conditional is the *soul* of the program.</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- show a nag alert</span>
</div><div class="line" data-line="10">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="11">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;🛑: &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moduleStyle</span>
</div><div class="line" data-line="13">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kill</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- configure the URL events and tie them to the right callbacks.</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;setBlacklist&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;setWhitelist&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;stopHeadspace&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stopHeadspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">
</div><div class="line" data-line="24">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>There are corresponding tear-down functions in the <code>m:stop()</code> method.</p>
<p>I decided to greatly simplify the interface by simplifying the data-model: the rules now only support either a whitelist or a blacklist, but not both. They both are stored in <code>hs.settings.set(&quot;headspace&quot;)</code>, so setting a new one wipes out the old. Much easier!</p>
<p>For example:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_eventName</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- parse out the tags and apps, potential params to the URL.</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;tags&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;tags&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;tags&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;apps&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;apps&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;apps&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- set the settings variable to the parsed table</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;headspace&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;whitelist&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">list</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- listen for a special parameter and (if true) kill apps that match</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- the rule based on the settings variable we just saved.</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">params</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;kill&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">killBlockedDockedApps</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="21">
</div></code></pre>
<p>The tricky part is defining <code>m.allowed(app)</code>, the soul of the application.</p>
<p>To be honest, I wound up in guess-driven development for a good long while. If my re-reading of my sleep deprived commit history is any indication, I neglected to set the base condition for whitelist to be &quot;all apps are blocked&quot; <em>and</em> blacklist's base condition as &quot;all apps are allowed.&quot; Rookie mistake.</p>
<p>Here's where I landed after some refactoring:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- get the tags on the filesystem for this app</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagsGet</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if it has the tag `whitelisted`, allow!</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;whitelisted&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- assume the app **is blocked** by tag and name</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appAllowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagAllowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apps</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if the apps list contains this app&#39;s name, allow!</span>
</div><div class="line" data-line="18">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appAllowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apps</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="21">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if there&#39;s an intersection between application tags and rule tags, allow!</span>
</div><div class="line" data-line="22">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagAllowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">some</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWhitelist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="26">
</div><div class="line" data-line="27">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- whitelist allows if the tag is allowed or the name is allowed.</span>
</div><div class="line" data-line="28">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagAllowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appAllowed</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="30">
</div><div class="line" data-line="31">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="32">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- assume that this app is **not blocked** by tag or name</span>
</div><div class="line" data-line="33">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appBlocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="34">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagBlocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="35">
</div><div class="line" data-line="36">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if the rule contains application names</span>
</div><div class="line" data-line="37">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apps</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="38">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if the name matches, block!</span>
</div><div class="line" data-line="39">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appBlocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apps</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="40">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="41">
</div><div class="line" data-line="42">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="43">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if there&#39;s an intersection, block!</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagBlocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">some</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getBlacklist</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="45">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="46">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="47">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="48">
</div><div class="line" data-line="49">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if the app is not blocked by name or tags… true.</span>
</div><div class="line" data-line="50">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appBlocked</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagBlocked</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="51">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="52">
</div><div class="line" data-line="53">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="54"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Phew! That was definitely some logic I should have slept on and revisited in the morning… and indeed that's what happened. I could <em>not</em> see it after midnight. Funny how that works. <em>Anyway…</em> it works now.</p>
<p>After using this for a while, I realized a critical part of changing my &quot;space&quot; was the clearing of distractions on each step. Before, I only killed applications specified in a configuration table… which kept Hammerspoon from naively <code>kill -9</code>ing Finder, Hammerspoon… well everything. I re-implemented the <code>kill</code> parameter using a simple heuristic: kill applications that match rules <em>and</em> have a dock icon.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dockedAndNotFinder</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;com.apple.finder&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">killBlockedDockedApps</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dockedAndBlocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">runningApplications</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dockedAndNotFinder</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dockedAndBlocked</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kill</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p><img src="https://images.evantravers.com/articles/2023/02/headspace_things_project.png" alt="Image showing Things project for rewriting Headspace" /></p>
<p>Man it feels good to check off this project…</p>
<p>All together (and after a lot of debugging of previous versions of <code>m.allowed(app)!</code>) it's been working fabulously. I have been driving Headspace through the <a href="https://support.apple.com/guide/shortcuts/intro-to-url-schemes-apd621a1ad7a/ios"><code>Open URLs</code> action in Shortcuts</a>, but you could type it into a browser, <a href="https://bunchapp.co/docs/bunch-files/opening-web-pages/">launch using Bunch</a>, or however you automate your life<sup class="footnote-ref"><a href="#fn-hs" id="fnref-hs" data-footnote-ref>1</a></sup>.</p>
<p>The latest version is <a href="https://github.com/evantravers/Headspace.spoon/tree/2.0">available on github</a>, let me know what you think of the concept or the code. 🙏</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-hs">
<p>You can also drive it manually through <code>hs.ipc</code>: you could call</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;hs.ipc&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- install somewhere your user has control and on its path</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ipc</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cliInstall</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/opt/homebrew&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>And then whenever you want to use it, you could call it directly from a bash/shell script:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">hs -c &quot;Spoon.Headspace.setBlacklist(nil, &lbrace;[&quot;tags&quot;] = &quot;communication,distraction&quot;&rbrace;)&quot;
</div></code></pre>
<a href="#fnref-hs" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Raycast Review as an Longtime Alfred User</title>
       <link>http://evantravers.com/articles/2023/02/16/raycast-review-as-an-longtime-alfred-user/</link>
       <pubDate>Thu, 16 Feb 2023 06:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/16/raycast-review-as-an-longtime-alfred-user/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/02/raycast.png"></p><div class="admonition tldr">
<p>Raycast presents a lot of power for a free application, including some surprising integrations I've paid money for before. I recommend it… if only for the Calendar Extension.</p>
</div>
<p>Software launchers have been part of my workflow for a long time. I first encountered Quicksilver <em>years</em> ago when Merlin talked about the <a href="https://www.youtube.com/watch?v=d4LkTstvUL4">original Google talk by a1cor</a>… and then I immediately bought a mac. There've been a couple different applications in use, but for over ten years it's been <a href="https://www.alfredapp.com/">Alfred</a>.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Wow, anybody else have usage this high? RT <a href="https://twitter.com/evantravers?ref_src=twsrc%5Etfw">@evantravers</a>: Ya’ll, I like <a href="https://twitter.com/alfredapp?ref_src=twsrc%5Etfw">@alfredapp</a> a *lot*. <a href="http://t.co/iGprUtKh">pic.twitter.com/iGprUtKh</a></p>&mdash; Alfred App (@alfredapp) <a href="https://twitter.com/alfredapp/status/266911640392437760?ref_src=twsrc%5Etfw">November 9, 2012</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>When I first started using Alfred it answered all my automation needs for a <em>long</em> time… until a while back I played with Hammerspoon and discovered it was <a href="https://evantravers.com/articles/2020/06/08/hammerspoon-history/">almost immediate for my hotkeys</a>.</p>
<p>Since I moved Hyper Hotkeys from Alfred to Hammerspoon I have further diversified my automation. I use Alfred daily for the following:</p>
<ul>
<li><a href="https://www.alfredapp.com/help/features/clipboard/">Clipboard history and search</a></li>
<li>Starting searches online and <a href="https://www.alfredapp.com/help/features/web-search/">custom search engines</a></li>
<li>Snippets, mostly Slack style <code>:emoji:</code> expansion</li>
<li>Launching applications (rarely)</li>
<li>Finding and moving files (rarely, but useful)</li>
<li>Some <a href="https://evantravers.com/articles/2020/09/03/automating-blog-images-using-alfred-file-actions/">small file automations</a></li>
<li>Switching out of Dark Mode for bright environments.</li>
</ul>
<h2><a href="#enter-raycast" aria-hidden="true" class="anchor" id="enter-raycast"></a>Enter Raycast</h2>
<p>Raycast has been on my radar for a while, but <a href="https://www.relay.fm/automators/120">automators.fm</a>, <a href="https://www.macstories.net/stories/raycast-adds-deeplinking-of-commands/">a macstories post</a>, and a new M1 mac for work finally pushed me to check it out.</p>
<h2><a href="#initial-adjustments" aria-hidden="true" class="anchor" id="initial-adjustments"></a>Initial Adjustments</h2>
<p>While Raycast and Alfred share a similar look and purpose they have a slightly different feel based on a core interface principle: Alfred uses sentences, Raycast uses menus.</p>
<p>It took some getting used to. As an avid fan of OSX's readline features, I was used to modifying queries in Alfred by modifying the plain text sentence. Raycast doesn't work that way… you choose an item and <em>enter</em> a mode or menu… not continue to type a sentence. If you delete everything in the Input box, it doesn't cancel your current tool… you need to hit <code>ESC</code> to back out of it. This is annoying at first, and then powerful… you don't have to retype the main command each time.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/spotify.png" alt="Spotify UI, showing a search for the amazing band &quot;Relient K&quot;" /></p>
<p>Raycast's decision is more expressive for certain custom interfaces (it's <em>amazing</em> Spotify extension is a shining example) and I imagine it is much easier for an extension developer to parse a &quot;query.&quot;</p>
<p><img src="https://images.evantravers.com/articles/2023/02/websearch.png" alt="Searching for a &quot;needle in a haystack&quot;, displaying web search as the fallback result" /></p>
<p>I was also accustomed to web search being the default fallback, but that was a <a href="https://manual.raycast.com/fallback-commands">quick command away in Raycast</a></p>
<h2><a href="#everything-is-an-extension" aria-hidden="true" class="anchor" id="everything-is-an-extension"></a>Everything is an Extension</h2>
<p>Alfred has a core feature-set with optional and expressive <a href="https://www.alfredapp.com/workflows/">Workflows</a> that you can put on top. A command that you can type into the interface can be part of the core features, or added by a workflow or snippet. It sometimes can be hard to determine where a command is configured or changed. Without a distribution or update path, its been up to sites like the fan-made packal.org, the official Alfred forums, or the relatively new <a href="https://alfred.app/">Alfred Gallery</a>) to distribute workflows with no clear and universal update path.</p>
<p>Raycast learns from this weakness with a simple and strong Extension Store. In fact Raycast is merely a UI for navigating and controlling Extensions. The core settings control Raycast's appearance and that's pretty much it. All other configurations, hotkeys, and settings are located with their Extension. It's consistent and simple.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/extensions.png" alt="An image of Raycast's Extension Settings" /></p>
<p>While Raycast ships with some impressive built in extensions to answer most of your launcher needs, Raycast's Store (predictably itself an extension) has a ton more. A couple extensions really jumped out to me:</p>
<p><img src="https://images.evantravers.com/articles/2023/02/calendar.png" alt="Calendar Events" /></p>
<p><a href="https://raycastapp.notion.site/Calendar-b4bdcf402a024c37940e46e8dcf2da91">Calendar</a> is <strong>incredible</strong>. It lets you join upcoming meetings with a single <code>Enter</code> keystroke. I more or less paid for Fantastical <em>just</em> for this feature… here you can have it for free.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/joshua.png" alt="Spotify UI, showing a search for the amazing band &quot;Relient K&quot;" /></p>
<p><a href="https://www.raycast.com/mattisssa/spotify-player">Spotify</a> is <em>very</em> good. I've used a Spotify workflow for Spotify, and it was endlessly difficult to set up. This is amazing.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/things.png" alt="Things Plugin" /></p>
<p><a href="https://www.raycast.com/loris/things">Things</a> has a plugin that puts your top task in your menubar… which is kind of nice.</p>
<p><a href="https://www.raycast.com/FlohGro/drafts">Drafts</a> (always <a href="https://evantravers.com/articles/tags/drafts-app/">one of my favorites</a>) has all the quick-add options you could want… or <a href="https://www.raycast.com/marcjulian/obsidian">Obsidian</a> lets you quickly append to your Daily Note.</p>
<p>The list goes on! <a href="https://www.raycast.com/devahschaefers/fantastical">Fantastical</a>, <a href="https://www.raycast.com/thomas/elgato-key-light">Elgato Key Lights</a>, Emoji search, <a href="https://manual.raycast.com/core#block-626bf0ed87344e67ba362a591e512146">Clipboard History</a>… it's probably already there!</p>
<p>I haven't dived into the documentation for making my own Extensions because the Shortcuts extension makes it easy to run Shortcuts: even allowing passing in input from Raycast to the Shortcut. More on that later…</p>
<h2><a href="#filed-for-later" aria-hidden="true" class="anchor" id="filed-for-later"></a>Filed For later</h2>
<p>File search and tools don't compare to Alfred. Alfred has built-in queries to search by filename or content. While I don't use the <a href="https://www.alfredapp.com/help/features/universal-actions/#buffer">buffer feature that lets you select several files</a> that much I do miss it on principle. Far more, I miss the <a href="https://www.alfredapp.com/help/features/universal-actions/#using">Selection Hotkey Universal Action</a> that let you grab your selection in the Finder and act upon it.</p>
<p>As it turns out this shortcoming doesn't hurt me that much. I don't deal with that many local files that I'm not interacting with in a terminal. Much of my work is in a cloud somewhere or through some application or other.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>While I was worried about Raycast's speed it seems to be fast enough for all my uses. I'm able to quickly find any of my notes or documents.</p>
<p>The key to Raycast's success is the Extension architecture and store. Keeping the interface consistent and putting the tools in the hands of creative folk worldwide means that the tool is ever growing and changing.</p>
<p>If you have web programmer skills you can make your extensions. I was concerned about missing Alfred's Workflows<sup class="footnote-ref"><a href="#fn-workflow" id="fnref-workflow" data-footnote-ref>1</a></sup>… but I quickly realized that if I need visual programming… I can use Shortcuts<sup class="footnote-ref"><a href="#fn-shortcuts" id="fnref-shortcuts" data-footnote-ref>2</a></sup>. I'm writing a ton of shortcuts now, in fact it's upending my whole automation/productivity stack.</p>
<p>If you don't have a launcher or are on lots of calls, give Raycast a try. It has <a href="https://github.com/evantravers/dotfiles/commit/81bd5971deda1dc0390a7670116ee8da5295d767">replaced Alfred</a> for me.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-workflow">
<p>The only <a href="https://evantravers.com/articles/2020/09/03/automating-blog-images-using-alfred-file-actions/">custom plugin I wrote</a> I rewrote as a shortcut, and now it works <em>everywhere</em>.</p>
<p><img src="https://images.evantravers.com/articles/2023/02/myshortcut.png" alt="my shortcut" /> <a href="#fnref-workflow" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-shortcuts">
<p>This move was unavailable to Alfred when they started, but it's the right one now. Alfred Workflows struggled to find the balance between power and flexibility and ended up with neither. As a developer I would immediately shell out to get full programming power, and as a power user I was frustrated by the interface and API. <a href="#fnref-shortcuts" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The Mystery of the Dune Font - fontsinuse.com</title>
       <link>http://evantravers.com/articles/2023/02/04/the-mystery-of-the-dune-font-fontsinuse-com/</link>
       <pubDate>Sat, 04 Feb 2023 14:12:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/02/04/the-mystery-of-the-dune-font-fontsinuse-com/</guid>
       <description><![CDATA[ <p><img src="https://assets.fontsinuse.com/static/use-media-items/157/156296/upto-700xauto/63d294da/@2x/frank-herbert-brian-herbert-kevin_1_b70b102c38038158d3494984b705a13e.webp" alt="dune covers" /></p>
<blockquote>
<p>words set in Davison Art Nouveau ranges from sober to discreetly flowery to full-blown carnivalesque. That’s one reason this face isn’t easy to track down – it can take on so many different appearances. The other reason is that it was exclusive to PLINC. And PLINC was a service provider, not a font retailer. You couldn’t buy or license a copy of Art Nouveau. If you wanted to have some text set in this font, you had to place an order at their Manhattan office at 216 East 45th Street, in person or by phone or post.</p>
</blockquote>
<p>At the cross-section of science-fiction and literary history is this fun investigation into the secret identity of one of the most iconic book covers of all time. Fun read.</p><p><a href="https://fontsinuse.com/uses/43515/the-mystery-of-the-dune-font" class="u-in-reply-to  is-reply">Mystery of the Dune Font - fontsinuse.com</a></p> ]]></description>
    </item>
    <item>
       <title>Weekly Reviews in Things.app Using Shortcuts</title>
       <link>http://evantravers.com/articles/2023/01/27/weekly-reviews-in-things-app-using-shortcuts/</link>
       <pubDate>Fri, 27 Jan 2023 21:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/01/27/weekly-reviews-in-things-app-using-shortcuts/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/01/things-hero.png"></p><div class="admonition download">
<p>[📥 Download Weekly Review.shortcut](<a href="https://images.evantravers.com/articles/2023/01/Weekly">https://images.evantravers.com/articles/2023/01/Weekly</a> Review.shortcut)</p>
</div>
<p>Cultured Code released a version of <a href="https://culturedcode.com/things/blog/2023/01/shortcuts-reloaded/">Things with Shortcuts support</a>. I've had a bunch of emails with folks who wanted to be able to use <a href="https://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/">my Weekly Review script</a> on iOS apps. While watching Kate &amp; Leopold I thumb-programmed away in the Shortcuts app and was happy to find that I can 100% replicate the .jxa version in Shortcuts. 🎉</p>
<p>The download is above, but if you want to understand it a bit so you can modify it, read on.</p>
<p>First we create a project based on today. We use the Magic Variable associated with it in all following <code>Create To-Do</code> and <code>Create Heading</code> Actions to make sure that the To-dos are added to the Project instead of the Inbox.</p>
<p><img src="https://images.evantravers.com/articles/2023/01/make-project.png" alt="" /></p>
<p>Using that Project we can add a couple setup To-dos, in this case the ones related to &quot;getting clear.&quot;</p>
<p><img src="https://images.evantravers.com/articles/2023/01/add-to-dos.png" alt="" /></p>
<p>We then have a nested loop that first loops through all the Areas and then all the Projects within each Area to create a To-do for each Project. I embedded a modified version of Peter Akkie's checklist in a Text object at the top of the Shortcut for easy modification if you want to add or remove some of the items.</p>
<p><img src="https://images.evantravers.com/articles/2023/01/loop-through-projects.png" alt="" /></p>
<p>There is a few To-dos created at the bottom to help you plan your week. Feel free to modify for your particular needs.</p>
<p>Here's what mine looks like with a little obscuration:</p>
<p><img src="https://images.evantravers.com/articles/2023/01/results.png" alt="" /></p>
<p>Reach out if you need any help!</p>
<div class="admonition download">
<p>[📥 Download Weekly Review.shortcut](<a href="https://images.evantravers.com/articles/2023/01/Weekly">https://images.evantravers.com/articles/2023/01/Weekly</a> Review.shortcut)</p>
</div> ]]></description>
    </item>
    <item>
       <title>Quick Tip: Searching YouTube Video for a Word</title>
       <link>http://evantravers.com/articles/2023/01/10/quick-tip-searching-youtube-video-for-a-word/</link>
       <pubDate>Tue, 10 Jan 2023 06:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2023/01/10/quick-tip-searching-youtube-video-for-a-word/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2023/01/stuffmadehere.png"></p><p>YouTube has auto-transcribed all videos for quite some time. This transcript includes links to time stamps, so you can use it to find any word said in the video.</p>
<p><img src="https://images.evantravers.com/articles/2023/01/moreactions.png" alt="more actions button" /></p>
<ol>
<li>Click the <code>…</code> &quot;More Actions&quot; button near the Share and Like actions.</li>
<li>Click <code>Show Transcript</code>.</li>
<li>Use your browser's built-in page search (CMD-F or CTRL-F) to find a word.</li>
<li>Click the time stamp… presto!</li>
</ol>
<p>This does not change the URL in the navbar of your browser. If you want to share the video at that moment in time you'll have to right click the video and select <code>Copy video URL at the current time</code> or manually craft the URL by adding the timestamp to the existing URL like this: <code>&amp;t=10m5s</code>.</p>
<p>This only works on desktop web version of YouTube. You can reach the transcript from the mobile app, but you can't search the transcript. If you want to try this on mobile, you can <a href="https://appleinsider.com/articles/21/11/03/how-to-request-desktop-versions-of-websites-in-safari-on-iphone-and-ipad"><code>Request Desktop Version</code></a> in Safari and it kinda works.</p>
<p>I've already used this a few times: Once finding a specific technique in a tutorial, and again to find and link a friend to a joke I heard in the audio-version of a podcast.</p>
<p>I suspect that the ability to search a video's words (And maybe images someday soon!) is going to transform the formerly linear nature of video<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>. If you can explore a long video or audio by search, catchphrases and unique words become the explorable landmarks in the content. Being articulate and having good vocabulary is now super power… it future-proofs videos because it means more people will be able to find your highest value moment inside your content. Almost like an atomic note…</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>While longer videos have become more exportable, the TikTok/YouTube monetization juggernaut will continue to incentivize short videos. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>2022</title>
       <link>http://evantravers.com/articles/2022/12/31/review-2022/</link>
       <pubDate>Sat, 31 Dec 2022 17:13:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/12/31/review-2022/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/12/pano.jpg"></p><p>My <a href="https://www.themesystem.com/">yearly theme</a> for this year was <em>Follow Hard</em>.<sup class="footnote-ref"><a href="#fn-theme" id="fnref-theme" data-footnote-ref>1</a></sup> It was intended to remind me:</p>
<blockquote>
<p>To have direction, momentum, and break a sweat. A follower doesn't have to be perfect, they just have to follow.</p>
</blockquote>
<p>I think my theme did help me stay on target, although like many years it took searching over my journals to see the theme manifest itself.</p>
<p>A large part of my dissatisfaction with this year was a little out of my control: a six-month funk from May to October. I'm still processing the reasons for it, but I'm grateful to God for my loving family to help nourish me out of it. Seeing discipline and momentum slowly restored over the last few months has been encouraging. However, the Funk of May shows up a lot over the next few sections.</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>This year I wrote 40 posts to this blog, 10 less than last year. Half of the 40 2022 posts were written before the Funk of May, and it tapers off dramatically after that.</p>
<p>Part of the issue was the lower energy and motivation in the Funk, but another aspect was a newfound joy in making private <a href="https://www.loom.com/">loom.com</a> and youtube videos for my friends.</p>
<p>I fell in love with loom as a tool in 2020: the power to quickly &quot;let me just show you&quot; with a keypress is intoxicating, but I couldn't stomach the price just for me showing off weird Obsidian and vim things. I wound up jury rigging a similar setup using OBS and have been using it almost daily since. I plan to try and move some of the better concepts for videos into blog posts… or perhaps to start making public youtube videos. Unsure yet.</p>
<p>Another reason that I've written less for y'all is that I've written more for me. <code>git</code> says that I've created, moved, or worked on 1205 notes in my personal wiki this year. 400ish of those are <a href="https://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/">journal entries</a>, but that's still a lot of thoughts, saved links, and in-progress thought chains.</p>
<p>Some of those bubbled out into actual blog posts. Here are some of my favorite essays of the year:</p>
<ul>
<li><a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">Review: Corne-ish Zen</a></li>
<li><a href="https://evantravers.com/articles/2022/04/20/frustrated-with-11ty/">Frustrated with 11ty</a></li>
<li><a href="https://evantravers.com/articles/2022/05/03/indieweb-replies/">Indieweb Replies</a></li>
<li><a href="https://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/">A Micro Office in a Tech Pouch</a></li>
<li><a href="https://evantravers.com/articles/2022/11/14/the-road-goes-ever-on-and-on-tolkiens-creative-journey/">The Road Goes Ever On and On: Tolkien’s Creative Journey</a></li>
</ul>
<p>While I am proud of these, I need to stop pursuing perfection and getting hung up on these <em>giant</em> posts.</p>
<h3><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h3>
<p>I read 20 books this year, up from 15 last year. I've found a couple places in my schedule where reading can happen regularly. I find this encouraging. Looking at my list, I do need to read more fiction. It's freeing and inspiring and I think I overwhelm myself with my non-fiction pile until it becomes a chore and not a joy.</p>
<h3><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h3>
<p>My day-job has been a combination of hurry-up-and-wait and a lot of individual contribution. It continues to provide a problem set that is easy to get passionate about and wonderful people to work with. I'm hopeful that this year will allow me to be more strategic about how we serve folks, and do a bit more leadership and research than specific UI design.</p>
<p>The Funk of May means that there's a good bit more Unintentionality recorded. I also got a lot more strict about what Unintentionality means: it's anytime I set out with one intention and found myself doing <em>anything</em> else. That includes a lot more than true goofing off. Now that I have a more accurate picture I want to be a lot more intentional in 2023</p>
<p>I probably am due for a rethink about how I track time: I don't want to just record, I want to encourage and protect the most important use of my time. I could stand to recategorize a little bit to protect and encourage more strategic thinking over tactical contributions.</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>Hopefully I'll never be satisfied with this, but this year is no exception. 🤷‍♂️</p>
<p>Many of my goals for the quarters were slowly building back discipline in my spiritual practices. In Q3, this was my Goal 1, and I was relatively faithful.</p>
<p><img src="https://images.evantravers.com/articles/2022/12/goals.jpg" alt="goals" /></p>
<p>I can report with the time spent in prayer and in the word that I only find that I need more. I am more aware of my faithlessness, my impatience… in short how much I need the savior that has chosen to call me to himself. Investing time with godly men and investing in a small group at church has helped.</p>
<p>Praise the Lord. He will carry to completion what he has begun.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p><img src="https://images.evantravers.com/articles/2022/12/strava-overall.jpeg" alt="strava health" /></p>
<p>Health was stable the last two years… and took a nose dive (from a measurement perspective) this year.</p>
<p>I intentionally put health on the backburner to focus on family and spiritual life. I don't know that I used that time as wisely as I ought (too many video games!) the main reason for the decreased numbers was that six month funk from May to October. Strava was nice enough to visualize it for me.</p>
<p><img src="https://images.evantravers.com/articles/2022/12/strava-map.jpeg" alt="strava health" /></p>
<p>I also don't remember being quite this sick this many times any previous year. Cost of having toddlers I suppose.</p>
<p>To give praise to God: I haven't gained significant weight. I was able to run 2x 10k runs in a week recently. I had my first checkup in a long time, and all my tests and bloodwork came back good.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>One deeply meaningful measurement this year was that I started a spot in my weekly reviews for meaningful conversations and meals. I've been able to count over 35+ people who have encouraged me in person or on the phone in a one on one conversation. I reached out in thanks to as many of you as I could remember… if I forgot I'm sorry. Y'all have really built me up this year. It's been neat to see how many of you were blessed in return.</p>
<p>We had some fun trips and times with the family. I'm planning on tracking yearly &quot;good meals&quot; alongside trips and memories to try to increase that. What gets measured gets better.</p>
<h2><a href="#2023" aria-hidden="true" class="anchor" id="2023"></a>2023</h2>
<p>I always reserve the right to change my mind, but my current choice for 2023's theme is <em>Wake Up</em>. For me it means to stop dreaming about what I want to do and make it reality, as well as the daily discipline to literally wake up and start with the most important things.</p>
<p>May God be glorified. Happy new year!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-theme">
<p>I did set this <a href="https://evantravers.com/articles/2022/01/04/review-2021/#2022">last year</a>. <a href="#fnref-theme" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The Road Goes Ever On and On: Tolkien’s Creative Journey</title>
       <link>http://evantravers.com/articles/2022/11/14/the-road-goes-ever-on-and-on-tolkiens-creative-journey/</link>
       <pubDate>Mon, 14 Nov 2022 09:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/11/14/the-road-goes-ever-on-and-on-tolkiens-creative-journey/</guid>
       <description><![CDATA[ <p><img alt="Minas Tirith by Alan Lee" src="https://images.evantravers.com/articles/2022/11/minas_tirith.jpg"></p><p>When I first found The Fellowship of the Ring on the shelves at my dad’s classroom I thought it was a book I wouldn’t be allowed to read… a brightly colored cover depicted wizards, dwarves, and strange little people<sup class="footnote-ref"><a href="#fn-cover" id="fnref-cover" data-footnote-ref>1</a></sup>. I gave it to my dad, informing him someone had slipped a strange book in his library. He shook his head slowly, took it from me, and handed me another book with peaky looking handdrawn mountains. He smiled and said “You should start with the first one.”</p>
<p>I opened the pages of <em>The Hobbit</em> and began to read. I was enthralled.</p>
<p>Taking my kids to the local library I still get little happy shivers passing the spot where I finally located my precious: all three Lord of the Rings novels. The shelf is now home to a horde of magical children YA novels of various mythologies and questionable longevity, but when I was twelve the bottom shelf held a glorious triptych of heavy hardback editions with illustrations by Alan Lee. Those words and images embedded themselves in my mind, and all my boyish daydreams were filled with castles, swords, riddle-games, and mithril mail.<sup class="footnote-ref"><a href="#fn-lee" id="fnref-lee" data-footnote-ref>2</a></sup></p>
<p><img src="https://images.evantravers.com/articles/2022/11/moria.png" alt="The Hobbit by Alan Lee" /></p>
<p>I’m going to <em>entirely</em> skip discussing the miraculously faithful Jackson trilogy or the recent TV show. If you want to playfully argue about them, <a href="https://evantravers.com/contact">shoot me an email</a> and we can discuss. Today, I want to talk about how how I believe Tolkien became Tolkien… and for that I have to tell another story in another library.</p>
<p>My mid-teens were a wonderful time to be a fan of old fiction. Online libraries like Gutenberg.org allowed me to binge wildly through every Edgar Rice Burroughs novel, to sneak peeks into the mounting madness of H. P. Lovecraft, even extending to weird fiction mentioned in the footnotes of other works… like <em>Voyage to Arcturus</em> by David Lindsay (from which C. S. Lewis borrowed ideas for <em>The Screwtape Letters</em>.) I of course had re-read my now personal copies of Tolkien every year, but there was one Tolkien book I could not obtain: <em>The Father Christmas Letters</em>. There were no scans that I could find… and this was before Amazon broke the ebook market. My only choice was to phone up the central library system and place a hold on the <em>only</em> copy in Alabama.</p>
<p>If memory serves, it took a couple tries before both the book was available and I was able to get a ride to the downtown Birmingham library. I remember waiting on the mezzanine level, surrounded by a battery of beige microfiche viewers until the librarian returned with my prize: the last Tolkien book I had not yet read.</p>
<h2><a href="#the-father-christmas-letters" aria-hidden="true" class="anchor" id="the-father-christmas-letters"></a>The Father Christmas Letters</h2>
<p><img src="https://images.evantravers.com/articles/2022/11/cover.jpg" alt="Father Christmas Letters, first edition" /></p>
<p>The Father Christmas Letters is not a novel… it's barely a book. It's a curated collection of artifacts… in this case little hand-scrawled letters from Santa created by a loving J.R.R. for his children. Every year the Tolkien children would rush to the hearth to find a little scroll… a newsletter of sorts from the big man himself. Each missive updated the children on what folks at the North Pole had been up to that year and answered the child-like questions they had left in their letters to Santa.</p>
<p><img src="https://images.evantravers.com/articles/2022/11/letter.jpg" alt="An Example of Tolkien's Letters" /></p>
<p>The joyful mess and effort in this creation is inspiring… especially now that I have become a father to some imaginative little ones of my own. As I paged through <em>The Father Christmas Letters</em> as an early teen I realized <em>The Lord of The Rings</em> didn't emerge fully formed out of nothing: The later master-work contains moments, themes, names, and concepts that evolved slowly over repetitive tinkering and reworking until they they culminate in a legendarium<sup class="footnote-ref"><a href="#fn-legend" id="fnref-legend" data-footnote-ref>3</a></sup> that still fascinates millions.</p>
<p>The Father Christmas Letters begin as simple, hand-lettered letters to Tolkien's children starting in 1920. Over the next twenty-three years the story evolves from a single note to a symphony of details and hand-drawn illustrations that delight and intrigue:</p>
<p><img src="https://images.evantravers.com/articles/2022/11/santa.jpeg" alt="Santa" /></p>
<p>Santa's workshop is filled with elves who help make the toys, play and dance, and defend the workshop from the goblins. Over the years, the elves contribute major characters: chief among them is Ilbereth who helps Santa as a secretary and defender of the workshop. They have yearly adventures repelling the pesky goblins… exploring the caves, shooting off fireworks, and eventually calling upon the great <a href="https://tolkiengateway.net/wiki/North_Polar_Bear">North Polar Bear</a> to help.</p>
<p><img src="https://images.evantravers.com/articles/2022/11/1932.avif" alt="Adventures in the Caves" /></p>
<p>Ilbereth and the Polar Bear introduce the Arctic lanaguage and a goblin pictograms, and become regular commentators on the letters with their own distinct handwriting in their messages to the Tolkien children. Every year the wrongs are righted, the toys are recovered, the sleigh is loaded, and everyone dances for joy.</p>
<p>Santa is depicted as a tall, rather thin grey-bearded man in a pointy hat that delights to make lovely things for children. He's also a master of fireworks… which he often uses to scare off the goblins that live in the caves below the pole and are always scheming to steal the toys and ruin Christmas. His joy in caring for the Elves and for the children in his care combined with his love of fireworks and fighting goblins seem to suggest the beginning sketches of Gandalf.</p>
<p>I can't think of a reason <em>not</em> to read The Father Christmas letters. Even if you care nothing for Tolkien it is full of joyful childlike wonder and tangible fatherly love.</p>
<p>For teenaged Evan, Father Christmas was the missing piece connecting one of Tolkien's stranger works into his creative journey: <em>Roverandom</em>.</p>
<h2><a href="#roverandom" aria-hidden="true" class="anchor" id="roverandom"></a>Roverandom</h2>
<p>I had read <em>Roverandom</em> before <em>The Father Christmas Letters</em>. At the time I could see the parallels to The Hobbit, but the story is largely estranged from the larger Legendarium.</p>
<p>Roverandom is a little zany.</p>
<p><img src="https://images.evantravers.com/articles/2022/11/moondragon.jpg" alt="Roverandom by JRR Tolkien" /></p>
<p><em>Roverandom</em> is about a dog named Rover. He's cursed by a wandering mischievous wizard, and seeks out another magician to lift the curse… and ends up running from a dragon. It's in a similarly child-like vein to The Father Christmas Letters. You could imagine it just emerging half-baked out of the tired brain of a father trying to woo his children to sleep with another tale of magic and adventure, sprinkled with things they already knew and loved… and secretly starring one of his own children.</p>
<p>Roverandom takes the animal friends, mischievous magicians, and magical world of The Father Christmas Letters and translates into a Lewis Carroll-esque fantasy world… but it begins to feel familiar. In particular the wizard Ataxerxes feels like a proto Gandalf: concerned with bigger things in the world, and ultimately sending a humble protagonist on a grand journey against his will for his own good.</p>
<h2><a href="#the-hobbit" aria-hidden="true" class="anchor" id="the-hobbit"></a>The Hobbit</h2>
<p>Now we return to the beginning of my experience with Tolkien… but near the end of his creative journey. The pieces of <em>The Lord of The Rings</em> are nearly all in place but thematic echoes of the previous iterations remain: another quest prompted by a wizard prank and ending in a journey to a dragon. It still is aimed at children: much of the peril is very non-violent, even the showdown with Smaug is largely another fairy-tale-esque riddle game.</p>
<p>I used to wonder why Gandalf is such a sort of tricksy antagonist in the start of The Hobbit in comparison with the wise and mysterious figure we meet in The Lord of the Rings. I now feel that the archetype is still in flux: flowing slowly and changing from the fireworks and toys Santa through the rune-cursing journey-starting Ataxerxes through the not totally formed Gandalf of the Hobbit to the fully fleshed Mithrandir of the Lord of the Rings.</p>
<p>Besides the wizard pranking the hero into a journey to a dragon, there are other elements of The Hobbit that continue to echo that “fairy story” mood from Roverandom. For example: The Hobbit's forest elves are more fae and capricious than the noble Eldar of The Lord of the Rings. As Tolkien's children grew and he continued to iterate on his great work the elements that feel timeless and mythic prevailed.</p>
<h2><a href="#the-lord-of-the-rings" aria-hidden="true" class="anchor" id="the-lord-of-the-rings"></a>The Lord of the Rings</h2>
<p>The Lord of the Rings is a well deserved classic… but it doesn't stand alone. It's the shining peak standing on a body of imagination and work for decades… starting with a Santa letter and ending in a trilogy that stands atop a genre and inspires imaginations for sixty years. Gandalf isn’t the only concept first prototyped in <em>The Father Christmas Letters</em> and slowly reworked over time:</p>
<p><img src="https://images.evantravers.com/articles/2022/11/links.jpg" alt="links between the works" /></p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>![The Grey Havens by Alan Lee](<a href="https://images.evantravers.com/articles/2022/11/gray">https://images.evantravers.com/articles/2022/11/gray</a> havens.jpg)</p>
<p>This essay is a love letter. Tolkien inspired me to write and create worlds. My little box of boyhood memories is filled with my own maps, currencies, dossiers of fictional generals and kings. The Lord hasn't led me to publish any of my halfbaked fictions… but it defined my childhood in a way very few other things did.</p>
<p>My perspective on Tolkien's legacy has matured as I move into adulthood. I appreciate not only the mastery of his magnum opus but I marvel at the loving, meticulous, patient and disciplined creativity that evolved over almost two decades. What began as a love letter from a father to his young children is a full-fledged world of heroism and myth <em>almost</em> real enough to live in.</p>
<p>This is why I’m obsessed with <a href="https://evantravers.com/articles/tags/creativity-systems/">Creativity Systems</a>. Sifting through Tolkien's creative journey helps me defeat my inner perfectionist: recognizing that I can simply create that which brings me joy and the repetitive process will improve the quality of my results. Tolkien had a Creativity System… a desk filled with thoughts he was working and reworking, and a yuletide tradition that ensured he revisited the concepts and stories for years to come. Any system that allows you to work, rework, recombine and connect your ideas…  that's what grabs me. Digital linked markdown files of atomic notes is <em>just a strategy</em>. The goal is the constant recombination and cultivation of slow hunches that blossom into the right moment for creation. This essay itself was a draft written over a year ago, coalesced from years of rants with fellow Tolkien fans, pushed by discussions of the creative process with my writing friends, combined with notes on books like <em>The War of Art</em>, and pushed to completion by predicting and reacting to the final nudge of a season finale.</p>
<p>Like Bilbo’s roadsong, the creative process goes ever on and on. The trick is to keep walking. Thank you Mr. Tolkien. 🙏</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-cover">
<p>I've identified that cover as <em>The West Door of Moria</em> by Darrell Sweet (<a href="https://arthive.com/artists/63738~Darrell_Sweet/works/334728~The_West_door">Arthive</a>) <a href="#fnref-cover" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-lee">
<p>Lee's interpretations of the character and &quot;high fantasy&quot; mood of the world is well known… but I'll never forget the feelings of deja vu watching the Jackson trilogy as moving pictures on screen slid seamlessly into the images that had been in my brain since I was twelve. <a href="#fnref-lee" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-legend">
<p>Tolkien was apparently fascinated in that the British Isles had no depth of mythology like the Greeks or Persians because the Romans wiped out the early Britons. His <a href="https://en.wikipedia.org/wiki/Tolkien%27s_legendarium">legendarium</a> was intended by him to be a sort of imagining of a mythology for England… as well as being a playground for his love of languages and perfectionism. <a href="#fnref-legend" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Working Backwards from Magic</title>
       <link>http://evantravers.com/articles/2022/10/03/working-backwards-from-magic/</link>
       <pubDate>Mon, 03 Oct 2022 19:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/10/03/working-backwards-from-magic/</guid>
       <description><![CDATA[ <blockquote>
<p>Put simply: working backwards from magic is an approach to creative problems by using the suspension of belief and any limiting factors to unlock new value.</p>
</blockquote>
<p>I've been a big fan of this thinking since Jordan introduced me to the phrase. In a product/UX world dominated by <a href="https://evantravers.com/articles/2022/07/19/doordash-and-pizza-arbitrage/">aggressive and often predatory data-driven design</a> it is a breath of fresh air.</p>
<p>What if?</p>
<p>The <a href="https://evantravers.com/articles/2020/12/14/sketchnotes-ux-vision-intensive/">UX Vision exercise</a> that Jared Spool promotes is something close to this method. In particular the &quot;<a href="https://articles.uie.com/despicable-design-when-going-evil-is-the-perfect-technique/">despicable design&quot; exercise</a> frees minds imprisoned by the cult of &quot;it's how we've always done it.&quot;</p>
<p>In so many ways, this is the role of good sci-fi… and <a href="https://evantravers.com/articles/2021/04/14/scifi-drives-the-future/">the line blurs often</a>.</p>
<p>If anyone asks… I heard it from Jordan Moore first.</p><p><a href="https://jordanm.co.uk/2022/09/18/working-backwards-from-magic.html" class="u-in-reply-to  is-reply">Working Backwards from Magic - jordanm.co.uk</a></p> ]]></description>
    </item>
    <item>
       <title>Journaling and Reviews in Obsidian</title>
       <link>http://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/</link>
       <pubDate>Mon, 12 Sep 2022 09:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/09/12/journaling-and-reviews-in-obsidian/</guid>
       <description><![CDATA[ <p>In <a href="https://evantravers.com/articles/2022/06/30/dating-other-task-managers/">Dating Other Task Managers</a> I identified a class of tasks I call Rituals. Rituals are recurring checklists that help shape my day and often have an output in the form of journaling.</p>
<p>I split the “Prompt” and the “Checklist.” The Prompt lives in my current Task Manager, and the Checklist lives in Obsidian. While they are all specialized, my rituals<sup class="footnote-ref"><a href="#fn-rituals" id="fnref-rituals" data-footnote-ref>1</a></sup> all have a family resemblance:</p>
<ul>
<li>review the previous period</li>
<li>ask appropriate questions</li>
<li>log measurable goals and habits</li>
<li>summarize and plan</li>
</ul>
<h2><a href="#review" aria-hidden="true" class="anchor" id="review"></a>Review</h2>
<p>My review is simple. Depending on how I'm feeling I'll usually write some <a href="https://evantravers.com/articles/2021/11/02/the-bullet-journal-method-by-ryder-carroll/">quick bullet journal-style entries</a>, or go freeform with paragraphs if it deserves it. usually has some prompts to guide me through the sources of information I ought to check: journals, task managers, time trackers.</p>
<h2><a href="#question" aria-hidden="true" class="anchor" id="question"></a>Question</h2>
<p>Observing your life in a review is useful. In order to grow and change you have to reflect and detach. If you can adopt only one habit to grow as a person, it should be some form of review with useful questions.</p>
<p>I typically have a few appropriate questions I ask myself at different time scales… it's possible to introspect <em>too</em> much, so I move the questions up and down the time-scales depending on what I'm working on.</p>
<p>Some randomized examples of questions I've found useful:</p>
<ul>
<li>What is truly essential today?</li>
<li>What can you do to protect margin?</li>
<li>Are there any tasks I should delete?</li>
<li>Where are we going to block off time to spend outdoors as a family?</li>
<li>What adventure are you going to have this week?</li>
</ul>
<p>I'm always collecting questions now. If you are looking for a way to invigorate your review/reflection process a great source of questions is <a href="https://baronfig.com/products/personal-socrates">The Personal Socrates by Marc Champagne</a>. If you want a quick overview, <a href="https://bookworm.fm/139/">Bookworm.fm did a great podcast</a> on it.</p>
<h2><a href="#log" aria-hidden="true" class="anchor" id="log"></a>Log</h2>
<p>Because I interact with my &quot;digital journal&quot; at different times, it's useful to make some details of a day, week, month, or year easier to parse at longer time scales.</p>
<p>I log details at each review appropriate to that time… depending on the change I'm trying to make in my habits and thinking. For discrete quantitative entries I am really enjoying using the <a href="https://github.com/blacksmithgu/obsidian-dataview">Dataview plugin</a>. Some examples of how this works:</p>
<h2><a href="#summarize" aria-hidden="true" class="anchor" id="summarize"></a>Summarize</h2>
<p>Going through the exercise of review, questions, and logging usually has me well prepared to summarize and plan a new season. I'm usually entering new tasks or ideas as I move through the ritual, but I typically give myself space to plan and change here. There's usually some appropriate prompts and questions to help me be successful here. Some examples from my scattered Rituals:</p>
<ul>
<li>Pray. Start humbly before the Lord.</li>
<li>Prioritize Family projects for this evening.</li>
<li>Check for projects and tasks with upcoming deadlines.</li>
<li>Write <a href="https://shawnblanc.net/2015/06/the-note/">The Note</a>.</li>
<li>Schedule in the most important task for tomorrow.</li>
<li>Shut Down. Leave work at work, go be a husband.</li>
</ul>
<p>Often a review shows me a behavior I want to tweak, and the easiest path to that is a Ritual itself.<sup class="footnote-ref"><a href="#fn-toomuch" id="fnref-toomuch" data-footnote-ref>2</a></sup> An example: I noted with frustration that I had been late to some oddly timed meetings. I added a step to my Workday Shutdown Review to check for any early meetings the next day… and that problem has gone away. If you are a zero-based budgeter it should be familiar: adjusting Ritual checklists is like adding a category to a budget. A little planning, and a whole class of problems stops causing stress.</p>
<h2><a href="#examples" aria-hidden="true" class="anchor" id="examples"></a>Examples</h2>
<p>Treating my digital journal as a magic zoom lens from daily to yearly has been transformative. By bubbling up summaries and metrics from daily to yearly I can notice problems and engineer the change I want to see in my life.</p>
<p>Here are some highlights for how this plays out in my Obsidian digital journal:</p>
<h3><a href="#daily" aria-hidden="true" class="anchor" id="daily"></a>Daily:</h3>
<p><img src="https://images.evantravers.com/articles/2022/09/daily.png" alt="daily" /></p>
<p>I daily log my intentions (on a scale of 1 to 3) in each area of my life that I'm responsible for.</p>
<h3><a href="#weekly" aria-hidden="true" class="anchor" id="weekly"></a>Weekly:</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2022/09/weekly_visualization.png">
  <figcaption>
    This was the weekend of Labor day, so Monday didn't have a note.
  </figcaption>
</figure>
<p>I take those daily intention logs and visualize them as a summary of the week. This gives me a &quot;heatmap&quot; of the week that invites me to explore good and bad to learn from what happened.</p>
<p>I also log weekly progress on 12WY goals, usually a boolean:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">[[2022-Q3#Goal 1: _Breathe._|Breathe.]]
</div><div class="line" data-line="2">**Goal1**:: false
</div><div class="line" data-line="3">[[2022-Q2#Goal 2: _Critical Few:_ Personas and Proctoring Config|Critical Few]]
</div><div class="line" data-line="4">**Goal2**:: true
</div></code></pre>
<h3><a href="#quarterly-12wy" aria-hidden="true" class="anchor" id="quarterly-12wy"></a>Quarterly (12WY):</h3>
<p>I visualize that weekly progress on <a href="https://evantravers.com/articles/2021/05/29/review-12-week-year/">12WY goals</a> to see if actually executed against my plan. If I didn't see progress… and I didn't execute, that's an execution problem. If I executed faithfully and didn't see progress… time to change the strategy.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/09/goal_visualization.png">
  <figcaption>
    Looks like I've been relatively faithful with my goals this quarter so far. 👍
  </figcaption>
</figure>
<p>On a quarterly basis I rate my gut response to a &quot;wheel of life&quot;<sup class="footnote-ref"><a href="#fn-wheel" id="fnref-wheel" data-footnote-ref>3</a></sup>. Using <a href="https://github.com/phibr0/obsidian-charts">Obsidian Charts</a> I compare this month's responses against the previous few.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/09/rating_visualization.png">
  <figcaption>
    I just started this particular visualization, and I'm super excited to learn and grow.
  </figcaption>
</figure>
<p>There’s no reason you can’t do similar patterns in <em>any</em> application or in an analog journal. Try applying the principles of Review, Question, Log, and Summarize to your systems and practices.</p>
<p>If you don’t do any of this stuff yet… <strong>don’t</strong> try to copy my stuff entirely. Start with simple journaling answering two questions: What went well? What didn’t go so well?</p>
<p>If you want more details about some of the chart/dataview stuff, shoot me an email. Happy to help or write a new blog post. 🙏</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-rituals">
<p>I currently have a <em>lot</em>. Many of them only take five minutes, although some of the longer term reviews take quite a bit longer.</p>
<ul>
<li>Daily
<ul>
<li>Planning</li>
<li>Review</li>
</ul>
</li>
<li>Weekly
<ul>
<li>Work Review / Planning</li>
<li>Family Week Review Planning</li>
</ul>
</li>
<li>Monthly
<ul>
<li>Family Calendar Review / Planning</li>
</ul>
</li>
<li>Quarterly
<ul>
<li>12WY Review / Goalsetting</li>
</ul>
</li>
<li>Yearly
<ul>
<li>Review / Theme</li>
</ul>
</li>
</ul>
<a href="#fnref-rituals" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
<li id="fn-toomuch">
<p>I typically try to &quot;dock&quot; a change to a ritual for a whole month before I implement it. A lot of my ideas turn out to be useless by the time the next &quot;change time&quot; comes around. <a href="#fnref-toomuch" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-wheel">
<p>I've pulled this basically from <a href="https://evantravers.com/articles/2020/12/28/plan-your-year/">Plan Your Year</a> and adapted it for this format. I think I need to revisit it more than once a year. <a href="#fnref-wheel" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Writing in Obsidian</title>
       <link>http://evantravers.com/articles/2022/08/30/writing-in-obsidian/</link>
       <pubDate>Tue, 30 Aug 2022 08:13:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/08/30/writing-in-obsidian/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/08/kanban.png"></p><p>As I slowly shift from using just my beloved <a href="https://evantravers.com/articles/tags/drafts-app/">Drafts</a> to using Obsidian for more of my writing, I've needed to rethink how I organize and decide on what to write.</p>
<p>Before now I used to have <a href="https://evantravers.com/articles/2019/09/28/world-of-textfiles-daily-use/#blogposts">a Drafts workspace for storing the concepts I was writing</a>. I no longer have workspaces or store text long-term in Drafts. As soon as I start to flesh out a concept I throw it into a folder in Obsidian. Often I have enough creative inertia to carry it through all the way to publishing (like this one!) Sometimes an idea interests me, but lacks inertia. I don't have enough time for it or I'm not done working on it and it'll stay in that drafts folder for weeks.</p>
<p>That's where the <a href="https://github.com/mgmeyers/obsidian-kanban">Obsidian Kanban plugin</a> is incredibly helpful. I'll periodically sweep through the drafts folder, reviewing its contents. I'll toss a lot because I've lost interest, but the ones with some merit I'll add to the Kanban board to then prioritize. It's as simple as dragging the file from the sidebar to the board where it's automatically added and linked.</p>
<p>I love that the Kanban board is markdown under the hood… I can even browse and use it in vim:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kanban-plugin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basic</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## On Deck
</div><div class="line" data-line="8"></span>
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Obsidian Adjustments]]
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Creativity vs productivity systems]]
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Tolkien&#39;s Creative Journey]]
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Why I Don&#39;t Want My Kids Photos on Social Media]]
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[User Experience Debt]]
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Tags to Maps of Content]]
</div><div class="line" data-line="15"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Periodic Notes in Obsidian]]
</div><div class="line" data-line="16"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Why Do I Still Use Alfred.app]]
</div><div class="line" data-line="17"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Changes to my layout and compromises]]
</div><div class="line" data-line="18"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Refactoring Rituals]]
</div><div class="line" data-line="19"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[You Are Not the Doctor]]
</div><div class="line" data-line="20"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> [[Flying Within Your Envelope]]
</div></code></pre>
<p>I'd like to get to the point where I have a set time in the day work on whatever is closest to complete on the board, but my writing habit is sporadic at best.<sup class="footnote-ref"><a href="#fn-habit" id="fnref-habit" data-footnote-ref>1</a></sup> There have been a few times I &quot;felt like writing something&quot; and the Kanban board guides me towards an already established seed of an idea to work on, and that has been lovely. I've considered setting this Kanban page to be my Obsidian homepage, but I don't think I'm ready to commit to that yet.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-habit">
<p>I'm mostly triggered by recurring conversations… if something comes up more than once in a week, it usually becomes a post. <a href="#fnref-habit" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Folk Interfaces and UX Black Markets</title>
       <link>http://evantravers.com/articles/2022/08/29/folk-interfaces-and-ux-black-markets/</link>
       <pubDate>Mon, 29 Aug 2022 07:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/08/29/folk-interfaces-and-ux-black-markets/</guid>
       <description><![CDATA[ <p>Some time ago I wrote about what I called <a href="https://evantravers.com/articles/2021/01/06/ux-black-markets/">UX Black Markets</a>: Users hacking or sidestepping the official system because the official system doesn't provide the desired functionality. The name never sat well with me, it was too negative… but it was the best name I had for what I was observing… until I read Maggie's delightful article:</p>
<blockquote>
<p>Folk interfaces are when users reappropriate existing software to solve their own problems. Rather than using applications in the ways designers and developers intended, they creatively reconfigure them to do unexpected things.</p>
</blockquote>
<p>I <em>love</em> this phrasing. It accurately captures the crafty people and practices that come under this banner. I still think I'll use &quot;UX Black Markets&quot; as a phrase to help me find Folk Interfaces… the product-side of a business often has an adversarial relationship with Folk Interfaces, and talking about Black Markets has been useful for sniffing them out. (&quot;Where is your intention being subverted? What is that user trying to do?&quot;)</p>
<p>Speaking on the mindset of folk interface creators:</p>
<blockquote>
<p>You can look at an interface and see it as a clearly signposted user journey you should follow. Or you can see it as a collection of functions and affordances to repurpose. As raw material, rather than a guided path.</p>
</blockquote>
<p>I think this is spot on. Looking at the world around you as raw material is full-on maker-mindset. Considering the creative folk makers in our userbase as allies and not adversaries is really fun and helpful, although they are hard to spot without empathetic qualitative user research. As designers and developers we should welcome our folk interface artists into the fold as fellow creators and discoverers of value… they are building the product the need to exist.</p>
<p>Lovely article, please read and give Maggie a follow.</p><p><a href="https://maggieappleton.com/folk-interfaces" class="u-in-reply-to  is-reply">Folk Interfaces - maggieappleton.com</a></p> ]]></description>
    </item>
    <item>
       <title>Cramming &#39;Papers, Please&#39; Onto Phones</title>
       <link>http://evantravers.com/articles/2022/08/06/cramming-papers-please-onto-phones-development-logs-by-lucas-pope/</link>
       <pubDate>Sat, 06 Aug 2022 20:20:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/08/06/cramming-papers-please-onto-phones-development-logs-by-lucas-pope/</guid>
       <description><![CDATA[ <p>Papers Please is one of my favorite games of all time. Fascinating, intricate, and deeply humbling, it is a <em>great</em> example of video game specific storytelling.</p>
<p><img src="https://3909.co/dev/pp/img/Mobile-StampConcepts.png" alt="prototyping" /></p>
<blockquote>
<p>I created Papers, Please in 2013 specifically for desktop computers with mouse control. Now, here, in 2022, desktop computers no longer exist and all computing is done via handheld mobile telephone. Time to update this dinosaur.</p>
</blockquote>
<p>I love stories of hard design choices… and Mr. Pope talking about deconstructing his lovely game to fit it on a phone is a great read. Some high points:</p>
<ul>
<li>I admire how he relies on minimum viable prototyping to unblock decisions.</li>
<li>I like how he enjoys the whimsical details like the chain. It's important to leave yourself some fun in a hard task like this.</li>
<li>He wrote a full test suite! Hard to do in a game.</li>
</ul>
<p>The original game is played by manipulating a large virtual desk. In order to make the small screen transition Mr. Pope had to refocus on the <a href="https://evantravers.com/articles/2020/07/09/outcomes-over-outputs/">Outcomes Over Outputs</a>, remembering the goal of the game mechanic to reinterpret it into the new screen resolution and input.</p>
<p>Mine is downloading now, can't wait to share the ponderous intro music with more people… <a href="https://papersplea.se/">download your copy</a>!</p><p><a href="https://dukope.com/devlogs/papers-please/mobile/" class="u-in-reply-to  is-reply">Cramming 'Papers, Please' Onto Phones | Development Logs by Lucas Pope - dukope.com</a></p> ]]></description>
    </item>
    <item>
       <title>An Ode to Advent of Code</title>
       <link>http://evantravers.com/articles/2022/07/26/an-ode-to-advent-of-code/</link>
       <pubDate>Tue, 26 Jul 2022 10:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/07/26/an-ode-to-advent-of-code/</guid>
       <description><![CDATA[ <p>Every December I join a few local programmers in a <code>#puzzles</code> slack channel, sharing ideas and working collaboratively on <a href="http://adventofcode.com">Advent of Code</a>. Advent of Code is a free programming competition/celebration run from Dec 1 - 25. There is a scoreboard, and there is a real competition to get the earliest solutions… but I get <em>so</em> much benefit out of it without ever hitting the scoreboard.</p>
<p>It's a wonderful tool for learning the craft and skills of programming, no matter what your level.</p>
<p>Things I love about it:</p>
<h2><a href="#scaling-difficulty" aria-hidden="true" class="anchor" id="scaling-difficulty"></a>Scaling Difficulty</h2>
<p>Advent of Code starts out relatively easy… which makes it excellent for trying out a new language, technique or practice. One year I wanted to solidify my knowledge of the Ruby standard library. The next I wanted to learn Elixir. The next year doing TDD in Elixir. Last year I aspired to solve some puzzles using OTP.</p>
<p>Whatever your goal, you can approach Advent of Code with that objective in mind and get a lot out of it.</p>
<h2><a href="#test-driven-puzzling" aria-hidden="true" class="anchor" id="test-driven-puzzling"></a>Test Driven Puzzling</h2>
<p>One of my favorite features of the Advent of Code puzzles is that they tend to give you good test cases in the &quot;requirements.&quot; I've been enjoying Elixir's doctests… they are perfect for this.</p>
<p>If writing tests hasn't seemed valuable to you before… you may catch the bug in Advent of Code.</p>
<h2><a href="#refactoring" aria-hidden="true" class="anchor" id="refactoring"></a>Refactoring</h2>
<p>Perhaps the best aspect of the design of Advent of Code problems is that each puzzle has two halves. They are cleverly created to reward good programming practices as you move from the first to the second, but more often than not you are going to have to take part of your first solution and rework it to be faster, more expressive, or solving more tests. It's a lovely feature… and means that if you aren't competing for times, you can choose a thoughtful approach and it will  reward you.</p>
<h2><a href="#positive-and-open-community" aria-hidden="true" class="anchor" id="positive-and-open-community"></a>Positive and Open Community</h2>
<p>Even if every puzzle this year stumps me, I can still complete the board and learn a <strong>ton</strong> by engaging with <a href="http://reddit.com/r/adventofcode">the subreddit</a> and re-implementing clever solutions from the comments. I can remember some of my computer science training, but especially after day 12 some of the faster solutions leverage tricks and algorithms I've never used… so I am not above &quot;cheating&quot; and learning from others.</p>
<h2><a href="#️" aria-hidden="true" class="anchor" id="️"></a>🎄⌨️</h2>
<p>Whether you are new to programming or an expert competitor, there's something in Advent of Code to challenge and teach you. You can learn the basic IO standard lib of your language, TDD, optimization and data structures, networking… or you can try to make it hard and do a toy challenge.</p>
<p>I recommend it to anyone who is dusting off a new language, relearning an old technique, or if you just want something a bit more engaging than a crossword puzzle. No need to wait till December, there's previous years still available for your perusal and puzzling.</p> ]]></description>
    </item>
    <item>
       <title>Doordash and Pizza Arbitrage</title>
       <link>http://evantravers.com/articles/2022/07/19/doordash-and-pizza-arbitrage/</link>
       <pubDate>Tue, 19 Jul 2022 08:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/07/19/doordash-and-pizza-arbitrage/</guid>
       <description><![CDATA[ <p>I'm always fascinated by arbitrage… while business opportunities can be found in transport or other liminal spaces… so can piracy and skulduggery.</p>
<blockquote>
<p>Customers called in saying their pizza was delivered cold. Or the wrong pizza was delivered and they wanted a new pizza.</p>
<p>Again, none of his restaurants delivered.</p>
<p>He realized that a delivery option had mysteriously appeared on their company's Google Listing. The delivery option was created by Doordash.</p>
</blockquote>
<p>I'm afraid Silicon Valley thinks this is clever rather than problematic. The harmful practice appears to be part of a &quot;demand test,&quot; a sort of product-focused A/B test to determine whether they should partner. I honestly could imagine myself naively initiating such a test, unaware of the harm it could cause.</p>
<p>(Language warning: the original post has a lot of cussing.)</p><p><a href="https://www.readmargins.com/p/doordash-and-pizza-arbitrage" class="u-in-reply-to  is-reply">Doordash and Pizza Arbitrage - www.readmargins.com</a></p> ]]></description>
    </item>
    <item>
       <title>Single-Use Alarms on iOS</title>
       <link>http://evantravers.com/articles/2022/07/18/single-use-alarms-on-ios/</link>
       <pubDate>Mon, 18 Jul 2022 22:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/07/18/single-use-alarms-on-ios/</guid>
       <description><![CDATA[ <p>I normally wake up at 6a. I've been attending F3 again, which means a 5a morning… but not every morning. (Yet!) I want the ability to say &quot;I'm going tomorrow!&quot; without committing to 5a every morning…</p>
<p>I made a simple Personal Automation in iOS that is great for these &quot;just today&quot; kind of alarms.</p>
<ol>
<li>Set up an alarm. Label it.<sup class="footnote-ref"><a href="#fn-alarm" id="fnref-alarm" data-footnote-ref>1</a></sup></li>
<li>Go to Shortcuts, tap the Automation tab.</li>
<li>Tap the + in the top right, choose Create Personal Automation.</li>
<li>Tap Alarm as the trigger, choose Stopped and Existing to select your new alarm from 1.<sup class="footnote-ref"><a href="#fn-trigger" id="fnref-trigger" data-footnote-ref>2</a></sup></li>
<li>Add Action: Toggle Alarm, choose your alarm again and set it to Off.<sup class="footnote-ref"><a href="#fn-shortcut" id="fnref-shortcut" data-footnote-ref>3</a></sup></li>
<li>Tap Next.</li>
<li>Disable Ask Before Running.<sup class="footnote-ref"><a href="#fn-ask" id="fnref-ask" data-footnote-ref>4</a></sup></li>
<li>Tap Done.</li>
</ol>
<p>Now any time you enable that alarm it will fire once and automatically disable itself!</p>
<p>I've also created a shortcut to enable the alarm for tomorrow, making it easier to get ready for the next day's beatdown. 🤷</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-alarm">
<p><img src="https://images.evantravers.com/articles/2022/07/Alarm.png" alt="Alarm" /> <a href="#fnref-alarm" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-trigger">
<p><img src="https://images.evantravers.com/articles/2022/07/Automation.png" alt="Automation" /> <a href="#fnref-trigger" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-shortcut">
<p><img src="https://images.evantravers.com/articles/2022/07/Shortcut.png" alt="Shortcut" /> <a href="#fnref-shortcut" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-ask">
<p><img src="https://images.evantravers.com/articles/2022/07/Action.png" alt="Action" /> <a href="#fnref-ask" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Never Make Infinite Meetings</title>
       <link>http://evantravers.com/articles/2022/07/12/never-make-infinite-meetings/</link>
       <pubDate>Tue, 12 Jul 2022 07:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/07/12/never-make-infinite-meetings/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/07/calendar.jpeg"></p><p>Never make meeting series that repeats infinitely. Always have a limit to the repetition.</p>
<p>If the meeting is worthwhile your team will notice the loss and request resurrecting it. If the meeting is low value (or became low value over time) it will fade away into the night and no one will miss it.</p>
<p>I do this for all recurring meetings I own, even &quot;required&quot; ones like 1on1s or spring rituals. The drop is a reminder to renegotiate whether this is a good time or duration with my team members. It's even more valuable for project-oriented meetings. The value of a project-oriented meeting has a limited half-life: at first the team is discovering direction and getting alignment… but as the project gains steam you may not need an hour every week to report &quot;we are still doing the same things.&quot;</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>Much thanks to my friend Daniel Rehner for teaching me this years ago. It has kept me from being a burden on my colleagues. I was re-sharing this advice for the 10,000 time… And realized <a href="https://evantravers.com/articles/2021/01/15/scaling-yourself-scott-hanselman/">I should write it down</a>.</p> ]]></description>
    </item>
    <item>
       <title>Dating Other Task Managers</title>
       <link>http://evantravers.com/articles/2022/06/30/dating-other-task-managers/</link>
       <pubDate>Thu, 30 Jun 2022 11:42:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/06/30/dating-other-task-managers/</guid>
       <description><![CDATA[ <p>I've a confession… I've been seeing other todo lists.</p>
<p>I don't have <em>great</em> reasons. It started because I wanted to have the option of freedom from Apple despite having invested a ridiculous amount of time and automation capital into the ecosystem.</p>
<p>My approach has been:</p>
<ol>
<li>Write a transformation/migration script to examine the file format and application features.</li>
<li>Try it out alongside my working Things 3 system, trying to do my daily tasks to compare experiences.</li>
<li>Find some downside (because nothing is perfect) and continue shopping endlessly.</li>
</ol>
<p>Let's rant! 👏</p>
<h2><a href="#context-for-my-search" aria-hidden="true" class="anchor" id="context-for-my-search"></a>Context for my search…</h2>
<p><img src="https://images.evantravers.com/articles/2022/06/things.png" alt="things" /></p>
<p>Things is beautiful and just works. It is <em>still</em> my recommendation for most people when it comes to digital task management. It taught me a few things in my journey…</p>
<p><strong>Quick capture enables focus</strong>. I'd used a few systems with quick capture before, but none for as long a time or as useful as Things’ Quick Capture.</p>
<p><strong>URLs are awesome</strong>. Things embraces the amazing power of a URL to summon a connection between context or applications. I can have a link on my phone to see all tasks tagged <code>Errand</code> that opens automatically when I leave the house. 👏</p>
<p><strong>Commit to commitments, and nothing else</strong>. Things is an opinionated, bullet-journal-esque system that encourages you to  only commit to what you can do Today <a href="https://evantravers.com/articles/2019/11/27/things-app-12-months/#anytime-is-your-friend">and leaving the rest in Anytime</a>.</p>
<p><strong>Keep it simple</strong>. While I have griped that Things doesn't have advanced features like dependencies or reviews… the focus on simplicity is refreshing. I have less to tinker with and more energy to accomplish my goals.</p>
<h3><a href="#the-brain-and-the-list" aria-hidden="true" class="anchor" id="the-brain-and-the-list"></a>The Brain and the List</h3>
<p>I forgot where I first heard this metaphor<sup class="footnote-ref"><a href="#fn-metaphor" id="fnref-metaphor" data-footnote-ref>1</a></sup>, but it has transformed how I think about Task Management. Your task management system has two parts: The Brain is a smart storage unit where you can store all the useful things you <strong>could</strong> do, The List is the subset of things you <strong>commit</strong> to doing. It's a small distinction with huge ramifications.</p>
<p>Identifying the parts of my Task Management system that are Brain and List has been helpful. Things 3 has objects I identify as the Brain and the List: Today (and arguably Upcoming) helps you focus on The List while Anytime allows you to query the whole system as The Brain.</p>
<p>Still more intriguing: Brain and List could be separate systems. (For instance, <a href="https://ugmonk.com/pages/analog">Ugmonk's gorgeous Analog system</a> looks preternaturally good at focusing on The List, but doesn't attempt to be The Brain.)</p>
<h3><a href="#disconnect-to-create" aria-hidden="true" class="anchor" id="disconnect-to-create"></a>Disconnect to Create</h3>
<p>Realizing the distinction between The Brain and The List has changed how I work on a daily basis. <em>I plan with The Brain, but I work from The List</em>.</p>
<p>Years ago <a href="https://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">I wrote a blog post about my feeling overwhelmed by my list</a>… I now would characterize that struggle as working from The Brain rather than The List.<sup class="footnote-ref"><a href="#fn-context" id="fnref-context" data-footnote-ref>2</a></sup></p>
<p>I have always required that my task manager be equally accessible on my phone and computer… I have changed my mind. I don't need the full-featured Brain on my phone<sup class="footnote-ref"><a href="#fn-phone" id="fnref-phone" data-footnote-ref>3</a></sup>. I can capture to some intermediate: Drafts, a Bullet Journal, a scrap of paper. It's not too troublesome to re-record it later next time I'm at a computer. Heck, I work from home. I'm at a computer for 8 hours a day… it's no problem.</p>
<p>Bullet Journaling has taught me to embrace the friction of that extra step. My resistance to re-recording helps me filter out trivial tasks that shouldn't make it into The Brain, much less The List.</p>
<h3><a href="#rituals-vs-tasks" aria-hidden="true" class="anchor" id="rituals-vs-tasks"></a>Rituals vs Tasks</h3>
<p>I have anchored my workday around several Rituals. Instead of trying to make habits out of 15-30 things I need to remember (clean out my inbox, check for unusual calendar events, look at time tracking for the day, etc.) I have one habit: go through the checklist.<sup class="footnote-ref"><a href="#fn-checklist" id="fnref-checklist" data-footnote-ref>4</a></sup></p>
<p>These Rituals are odd in the task management world:</p>
<ul>
<li>they recur regularly</li>
<li>they have <em>many</em> sub tasks/checklist items</li>
<li>I adjust them based on season of life</li>
<li>I don’t care to store a history of completion</li>
<li>sometimes they output notes/reviews that I do want to store</li>
</ul>
<p>Here’s an example of the Workday Shutdown, arguably the most important of my Rituals:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">🗃 Workday Shutdown
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">As a faithful steward, I put my work in order to be prepared for the next day, identifying the essential task for the next day.
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">obsidian://advanced-uri?vault=wiki&amp;commandname=Periodic%20Notes%3A%20Open%20daily%20note
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🕰: Review time logs. Log any missing time.
</div><div class="line" data-line="8"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📓: Journal events/tasks. things:///show?id=logbook
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📝: Process notes/tasks from notebook.
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📨: Process Drafts inboxes.
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📥: Dump your brain into the Inbox. Get it all out.
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 📤: Process Things inbox. things:///show?id=inbox (:estimate, $focus, !modality, priority)
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🗓: Make time for critical projects in tomorrow’s calendar.
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 🎯: Write The Note. things:///show?id=tomorrow
</div><div class="line" data-line="15"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 😴: Shut down. (Close. Speak. Shut. Trash. Door. Go home.)
</div><div class="line" data-line="16"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #6e7681); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[ ]</span> 👨‍👩‍👧‍👦: Go live in Coram Deo this evening.
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">Tags: Rituals: Daily
</div><div class="line" data-line="19">When: Today
</div></code></pre>
<p>I have quite a few Rituals at the moment:</p>
<ul>
<li>Daily Plan</li>
<li>Workday Shutdown</li>
<li>Evening Review</li>
<li>Weekly Review</li>
<li>12WY Review</li>
<li>Family Weekly</li>
<li>Family Monthly</li>
</ul>
<p>I have been handling these in Things using their excellent repeating checklists… but there may be a better way.</p>
<h3><a href="#context-is-king-i-think" aria-hidden="true" class="anchor" id="context-is-king-i-think"></a>Context is King… I think?</h3>
<p>Work doesn’t exist in a vacuum. We do it using resources, for some purpose… I didn’t know I wanted my Lists (like a Project) to have attached markdown notes until I used it in Things. I put <a href="https://evantravers.com/articles/2022/03/11/bunch-of-urls/">URLs</a>, documentation, the names of team members, it’s excellent.</p>
<p>One of my favorite uses for this is to write the reason that this task exists as it’s context. It helps center me on the work, and if I can’t think of a reason maybe I should not be spending time on it.</p>
<h2><a href="#why-move-from-things" aria-hidden="true" class="anchor" id="why-move-from-things"></a>Why move from Things?</h2>
<p>Besides the desire to see what's new in the world… I have one<sup class="footnote-ref"><a href="#fn-complaint" id="fnref-complaint" data-footnote-ref>5</a></sup> complaint about Things 3: <a href="https://evantravers.com/articles/2019/11/27/things-app-12-months/#troubles-with-with-tags">You can't search for the absence of a Tag</a>. 🤦‍♂️</p>
<p>What this deficiency means is that I can't find tasks without a given tag. Since Tags are the <em>only</em> cross-list organizational structure in Things, this means you can't easily find To-dos that haven't been delegated, or haven't been estimated, etc. This means that there isn't any easy way to construct a Review of your tasks in Things. <a href="https://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/">I've hacked a solution together using JXA</a>… but the scripting is limited to desktop-only. More automation options through Shortcuts could fix this… but I'd be surprised.</p>
<p>For lack of a shoe… the nerd goes shopping for task managers. 🤷</p>
<h2><a href="#the-contenders" aria-hidden="true" class="anchor" id="the-contenders"></a>The contenders…</h2>
<h3><a href="#orgmode" aria-hidden="true" class="anchor" id="orgmode"></a><a href="https://orgmode.org/">Orgmode</a></h3>
<p><img src="https://images.evantravers.com/articles/2022/06/emacs.png" alt="orgmode" /></p>
<p>All productivity roads lead to Orgmode: The king-daddy of all digital organization systems. If you make the investment, Orgmode will reward you. It has <em>every</em> feature you could imagine, and it’s endlessly customizable.</p>
<p>After reading through the whole Orgmode manual, I wrote <a href="https://github.com/evantravers/ThingsToOrgmode">ThingsToOrgmode</a> as an exporter from Things to .org files. All the exporters use a combo of Applescript and screen scraping to grab as much data as possible.</p>
<p>For a couple weeks I’d open Emacs next to Things and try to do my daily workflows in Orgmode alongside things, and I ran the exporter to keep Things synced to Orgmode.</p>
<p>Orgmode wants to be my everyting. I do indeed like thinking in outlines. <code>org-refile</code> is like a plaintext version of moving branches on a mindmap and I like it a lot. Orgmode has <em>every</em> feature (or a plugin) you could possibly want (calendars, time tracking, auto imports). There are iOS or Android apps if you want.</p>
<p>However… I don't want Orgmode to be my everything. In addition, I don't think I want to add emacs to my toolchain… I'm a fidgeter. Another config file in which I waste time would be anti-productive. If I used eMacs as my code editor things would be different.</p>
<p>I did spend some time with <a href="https://github.com/nvim-orgmode/orgmode">nvim-orgmode</a>. It’s impressive… but not quite to feature parity.</p>
<h3><a href="#taskwarrior" aria-hidden="true" class="anchor" id="taskwarrior"></a><a href="https://taskwarrior.org/">Taskwarrior</a></h3>
<p><img src="https://images.evantravers.com/articles/2022/06/taskwarrior.png" alt="taskwarrior" /></p>
<p>TaskWarrior’s most interesting system is a prioritization algorithm that analyzes task attributes like age, priority, and dependencies to attempt to determine a weighted priority list… or just the next task. It is solid out of the box, but you can customize the weighting of attributes or add your own aspects to it using its custom fields.</p>
<p>TaskWarrior feels more &quot;unix-like&quot; than anything else on this list: single purpose, pipeable, simple. Aimed at people comfortable with terminals and scripting. TaskWarrior as a data system with customizable tools and views is an excellent Brain. If you want you can configure customized views to generate The List.</p>
<p>Because it’s essentially a CLI app, it’s harder to interact with away from a linux device. There are some attempts at mobile apps… but they feel immature.</p>
<p>While playing with it, I haven't found an easy solution for my Rituals.</p>
<p>As with Orgmode, I wrote an export for Things. The JSON format that TaskWarrior uses for interop makes import/export far easier.</p>
<p><a href="https://github.com/evantravers/ThingsToTaskwarrior">ThingsToTaskwarrior</a></p>
<h3><a href="#todoist" aria-hidden="true" class="anchor" id="todoist"></a><a href="https://todoist.com/">Todoist</a></h3>
<p>Todoist has a great reputation in the field. Unlike the other examples, it’s not 0data, so its harder to get your data out. However, its prodigious web API makes it easy to get tasks in or automate creation of tasks based on Zapier events or however you like to automate.</p>
<p>Todoist has a Kanban view that is a compelling way to manage some projects.  I do wish you could manage Projects that way… but you can always create a meta-project with links to the Projects since Everything is URLs.</p>
<p>Todoist has an incredibly cool integration with Fantastical that lets you put a task at a time… you can't set the time to longer than 45m, but it's a great start for time blocking.</p>
<p>I like project comments as a form of context. It seems to be aimed more at collaborative updates than a source of truth. You can’t nest tags like in Things, which is a shame. I have people tags sorted by team, so I can get my questions for you or anything related to your team. Very handy!</p>
<p>There are a couple Obsidian plugins available to view or sync tasks between Obsidian and Todoist  or you could try…</p>
<h3><a href="#obsidian" aria-hidden="true" class="anchor" id="obsidian"></a><a href="https://obsidian.md/">Obsidian</a></h3>
<p>Just using Obsidian! Obisidan is 0data plaintext… and it's basically a code-editor web-browser… so you can create pretty much create any system you want.</p>
<p>Besides the built in <code>- [ ]</code> task functionality, there's a number of excellent plugins for Obsidian to expand it's capabilities:</p>
<ul>
<li><a href="https://github.com/lynchjames/obsidian-day-planner">time blocking</a></li>
<li><a href="https://blacksmithgu.github.io/obsidian-dataview/data-annotation/#tasks">task reports in dataview</a></li>
<li><a href="https://github.com/obsidian-tasks-group/obsidian-tasks">scheduling tasks</a></li>
</ul>
<p>Obsidian has a lot going for it. I used the Tasks through Dataview on a side project for a month or two. It works pretty well. I could create tasks anywhere in the notes for the project, and they'd all be surfaced on the main Tasks note.</p>
<p>However… Obsidian is currently where I write and create, and I don't want <a href="https://evantravers.com/articles/2022/06/26/review-mind-management-not-time-management-by-david-kadavy/#open-loops-for-creativity-closed-loops-for-productivity">my Productivity System mixed up with my Creativity System</a>. Even without that, I found the tags I'd want for a task system to pollute the structure that I want for my knowledge system… it got confusing.</p>
<h3><a href="#bullet-journal" aria-hidden="true" class="anchor" id="bullet-journal"></a><a href="https://bulletjournal.com/pages/book">Bullet Journal</a></h3>
<p>Bullet Journaling has been a part of my life for a few years. A Bullet Journal works as The List <em>very</em> well. Serving the function of The Brain is hard and requires a lot of upkeep. I've been using my Journal as an analog The List, and using my digital Task Manager as the Brain.</p>
<p>Since I first started this whole journey my work has shifted, or maybe my mindset has. Where I used to plan individual tasks into the day as time blocks I have started to block off a section for a Project List. The List (sometimes on The Note, sometimes a calendar block, sometimes Today) just contains the <a href="https://evantravers.com/articles/2021/01/11/meta-tasks-when-and-things/">meta-task</a> prompt &quot;work on Project.&quot; This especially works with systems where the tasks aren't in &quot;my one system.&quot; (JIRA, Trello, etc.)</p>
<p>As an experiment I have removed most of the quick capture tools off my phone. I capture most of my todos either through Siri or by jotting down in my journal. I'm enjoying the filter that comes with a little friction.</p>
<p>My deadlines live in external systems, my personal list is relatively simple and my Bullet Journaling has leveled up a good bit. I'm seriously considering returning to this 100%. The downside is that I'm at a computer 8 hours a day… so much of my work and capture needs to be a URL… and analog isn't super good at that.</p>
<h3><a href="#omnifocus" aria-hidden="true" class="anchor" id="omnifocus"></a><a href="https://www.omnigroup.com/omnifocus/">Omnifocus</a></h3>
<p>It's always lurking in the shadows. I haven’t touched it properly other than a trial. But it’s there, calling out my name…</p>
<h2><a href="#where-to-from-here" aria-hidden="true" class="anchor" id="where-to-from-here"></a>Where to from here?</h2>
<p>I don't know. 🤷 Here's what I am doing:</p>
<h3><a href="#moving-things-3-into-brain-only-mode" aria-hidden="true" class="anchor" id="moving-things-3-into-brain-only-mode"></a>Moving Things 3 into &quot;brain-only&quot; mode</h3>
<p>I'm trying not to work out of Thing's Today list… copying it into my journal each morning. (I decide the most important task the previous night and that ends up time-blocked and put on a sticky note on my keyboard.)</p>
<p>I'm also trying to avoid using Quick Capture. By relying on analog and Drafts as input I'm hoping I can break my addiction.</p>
<h3><a href="#splitting-rituals" aria-hidden="true" class="anchor" id="splitting-rituals"></a>Splitting Rituals</h3>
<p>I'm experimenting with splitting my Rituals into a &quot;trigger&quot; and &quot;list.&quot;</p>
<p>The &quot;trigger&quot; is a task with a link to the &quot;list.&quot; Because I'm still experimenting… the &quot;trigger&quot; is in both Things and Todoist at the moment while I learn how Todoist works. One dealbreaker seems to be that moving a single instance of a repeating task in Todoist breaks the repeat.</p>
<p>The &quot;list&quot; is a &quot;Sloppy Operating Procedure&quot; document in Obsidian. Because many of my Rituals involve reviewing, and the results of my review is logged in Obsidian this feels natural. I wish Obsidian had more automation for setting up splits with commands and files… and I don't have a way to reset the checklist… but it works great for now.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>If Things were to go away, I'd predict that I'd end up in TaskWarrior as a Brain, Obsidian/ZK as context and Kanban, and Bullet Journal as my timeblocking/The List. But who knows.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-metaphor">
<p>I have tried to find the original tweet or podcast episode that introduced me to this idea. The Sweet Setup has <a href="https://thesweetsetup.com/the-brain-vs-the-list/">posted a good article</a> about it, and I'm sure it's original to Shawn, but that's the specific article that inspired me. Another useful metaphor here is a Map and a Route: The Map is not the territory… the Territory here is <strong>all</strong> the possible things you could do. You can't complete all possible tasks or even list of all of them, so you explore and create a Map that represents possible things to do. The List becomes a Route… a path through this Map that you actually plan to traverse. Whichever metaphor works for you… run with it! 🏃 <a href="#fnref-metaphor" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-context">
<p>My recommendation of Contextual Prioritization is basically &quot;Make a List separate and focused out of The Brain.&quot; Grow and learn. <a href="#fnref-context" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-phone">
<p>Another side project may be <a href="https://evantravers.com/articles/2022/05/19/contemplating-clever-phones/">moving to a Light Phone</a> + iPad Mini for my next mobile device… we'll see. <a href="#fnref-phone" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-checklist">
<p>Fans of the Checklist Manifesto, holla! David Kadavy would probably call these “Sloppy Operating Procedures,” which I attach to because they are more flexible and malleable than a “checklist.” <a href="#fnref-checklist" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-complaint">
<p>That’s not entirely true. I’d love some more nuance to the state of a project, like a Kanban board sort of thing. I’d also love tighter integration with a calendar so that I can <a href="https://evantravers.com/articles/2020/05/09/creating-a-focus-budget/">place tasks directly on a calendar</a>. I have workarounds for these two… so one complaint! <a href="#fnref-complaint" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Review: Mind Management, Not Time Management by David Kadavy</title>
       <link>http://evantravers.com/articles/2022/06/26/review-mind-management-not-time-management-by-david-kadavy/</link>
       <pubDate>Sun, 26 Jun 2022 08:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/06/26/review-mind-management-not-time-management-by-david-kadavy/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/06/mindmanagement.jpg"></p><div class="admonition summary">
<p>Creative work requires sufficient quantity of quality ideas. We can maximize quality ideas by wisely stewarding our mental states: prompting the right state for our work and staying in that state as long as possible.</p>
</div>
<p>I finished this book a month ago. It at first left me thinking it was a bit too complicated: I thought the examples too anecdotal, the practices too extreme, and the systems too complex. However, after conversation about the topics and trying a few of the principles my impressions have changed. I’ve been chewing on a few of the ideas that have been helping me in my creative work so far.</p>
<h2><a href="#takeaways" aria-hidden="true" class="anchor" id="takeaways"></a>Takeaways</h2>
<h3><a href="#generative-thought-and-insight" aria-hidden="true" class="anchor" id="generative-thought-and-insight"></a>Generative Thought and Insight</h3>
<p>I found the discussion of how our brains generate and then verify insights fascinating. He uses a simple word game to show how our brains connect things seemingly simultaneously and without effort… which leads to two ideas:</p>
<ol>
<li>The mental state required for generating lots of connective insights is different from the state that can evaluate their worth and validate their truth. He notes that just after waking we are usually in a sort of sleep-inertia heavy state of free association. It is an effective time for generation. This leads to practices like morning pages, shower thoughts, etc.<sup class="footnote-ref"><a href="#fn-algo" id="fnref-algo" data-footnote-ref>1</a></sup></li>
<li>Because the generating of insights is a seemingly magical thing that doesn't depend on intense focus and scrutiny, we need a different strategy for ensuring we are always generating new creative ideas.</li>
</ol>
<h3><a href="#minimum-creative-dose-and-incubation" aria-hidden="true" class="anchor" id="minimum-creative-dose-and-incubation"></a>Minimum Creative Dose and Incubation</h3>
<p>While there is a lot of discussion of the importance of gathering good ideas (Steal Like an Artist by Auston Kleon) and preparation (The War of Art by Steven Pressfield) Kadavy introduces his helpful concept of the Minimum Creative Dose:</p>
<blockquote>
<p>give your Passive Genius the Minimum Creative Dose. Jot down just a few things, make a sketch, or hum a few bars into a recorder. Set a timer for two minutes if it helps. Then, forget about it. Go about whatever you were doing.</p>
</blockquote>
<p>Instead of banging your head against it, attempting to focus your way into a solution… give your brain something to chew on and explore, then let your “Passive Genius” work on it. I’ve tried this a few times through the past month and it’s been very profitable. It’s counterintuitive to setup a work project, write a few lines, then walk away, but some of my creative projects demand just that.</p>
<h3><a href="#open-loops-for-creativity-closed-loops-for-productivity" aria-hidden="true" class="anchor" id="open-loops-for-creativity-closed-loops-for-productivity"></a>Open Loops for Creativity; Closed Loops for Productivity</h3>
<p>This leads to the biggest concept from the book for me: <em>the systems best suited to solve creative problems are philosophically different than traditional GTD-style productivity systems</em>. GTD and its children recommend never losing track of tasks, burning it down, and working based on physical context. Creativity Systems (my phrase) require gathering good thoughts, making space for the Passive Genius for inspiration, and working based on mental state.</p>
<blockquote>
<p>Open loops are your enemy when it comes to traditional productivity. Open loops remind you to do things that you can’t currently do. But when it comes to creative productivity, open loops are a gift. Open loops give your Passive Genius something to work with. The way to get the most out of Incubation, with minimal conscious effort, is by using the Minimum Creative Dose.</p>
</blockquote>
<p>I have been thinking and writing a lot about Creativity Systems, so I could be guilty of fitting his arguments to my mental model, but it is encouraging to me.</p>
<h2><a href="#criticisms" aria-hidden="true" class="anchor" id="criticisms"></a>Criticisms</h2>
<h3><a href="#improbably-monastic" aria-hidden="true" class="anchor" id="improbably-monastic"></a>Improbably Monastic</h3>
<p>Many of the experiments are <em>laughably</em> impractical for anyone with family responsibilities. His preferred Deep Work style is what Cal Newport’s Deep Work by Cal Newport would probably deem monastic. While the journey is inspiring the experiments feel strict and prescriptive, overly complicated.</p>
<p>I respect that Kadavy can pull it off, but I think for most it is unrealistic. There's a lot of experiments to &quot;put yourself in the correct mental state&quot; for the work you wish to accomplish. I would like to be more intentional here, but not to the degree Mr. Kadavy has chosen.</p>
<h3><a href="#no-examples-personal-journey" aria-hidden="true" class="anchor" id="no-examples-personal-journey"></a>No examples, personal journey</h3>
<p>The book's structured resembles a personal memoir. Each chapter walks through his discoveries and deep personal loss. I think this structure logically walks through the the realizations and experiments that led to his current systems and theories. I also think it hurts the general applicability of the advice.</p>
<p>The examples are specific for David’s business: self-publishing, podcasting, blogging.<sup class="footnote-ref"><a href="#fn-mlm" id="fnref-mlm" data-footnote-ref>2</a></sup> There are <em>few if any examples of other use cases or people</em>. I would think that in the development of the book he’d look for studies and examples in his podcast guests at least.</p>
<h3><a href="#his-inboxes-are-weird" aria-hidden="true" class="anchor" id="his-inboxes-are-weird"></a>His Inboxes are weird</h3>
<p>This is a small quarrel. In the course of talking about the importance of capturing good ideas, he talks about sending quotes, ideas, and links into an inbox. I’m 100% in favor of quick capture, but he wrote on about how he stores things in the inbox long term, as a means of reviewing every once in a while to generate ideas.</p>
<p>I’m no GTD expert, and I think GTD needs to be modified for each, but I think he’s talking about a <a href="https://gettingthingsdone.com/wp-content/uploads/2014/10/2016-Tickler-File-.pdf">Tickler File</a>, not an inbox. The inbox should be for things I’m not sure about that need a final home, not a storage facility. 🤷‍♂️</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>…</h2>
<p>There is quite a bit more in the book I didn’t summarize. There is a fine refutation of the contemporary obsession on time-management, arguing that it's based in Taylorism theories of uncreative factory work. There’s a lot of discussion of his theory of the classes of work, experiments for placing yourself in the mental state for the work you wish to complete, and a fascinating exploration on how different cultures view time.</p>
<p>If any of this strikes a chord, or you are seeking some ideas to prompt a state of flow, or you just like reading about productivity styles (which if you've made it this far, is probably you!) check out Mind Management. It’s not the first book I would recommend for productivity or creativity, but it was just right for me and the work I’ve been struggling with.</p>
<p>My action items:</p>
<ul>
<li>Tag my tasks based on required mental state. I’d like to experiment staying in a mental state for a long while.</li>
<li>Think about my Creative Cycles:
<ul>
<li>What creative projects do I repeat?</li>
<li>Incorporate Minimum Creative Dose and buffer for the Passive Genius (incubation)</li>
<li>What “Sloppy Operating Procedures” should I document?</li>
</ul>
</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-algo">
<p>Balancing explore vs decide reminded me strongly of Algorithms to Live By by Brian Christian and Tom Griffiths. <a href="#fnref-algo" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-mlm">
<p>Writing a book about the experience and process of writing a book is very meta… an achievement, but also what I sarcastically refer to as an Incestuous MLM. Here's a different example: <em>I'm so good at sales, I can teach you too. I primarily sell others my course on how to sell, and reference my sales numbers on how to sell to sell more people in how to sell.</em> 🤷 <a href="#fnref-mlm" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Mobile-First CSS: Is It Time for a Rethink?</title>
       <link>http://evantravers.com/articles/2022/06/23/mobile-first-css-is-it-time-for-a-rethink-html/</link>
       <pubDate>Thu, 23 Jun 2022 09:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/06/23/mobile-first-css-is-it-time-for-a-rethink-html/</guid>
       <description><![CDATA[ <blockquote>
<p>Separating the CSS and specifying a media attribute value on each link tag allows the browser to prioritize what it currently needs. Out of the five files listed above, two will be downloaded with Highest priority: the default file, and the file that matches the current media query. The others will be downloaded with Lowest priority.</p>
</blockquote>
<p>I'm still absorbing this as a concept… but it feels like a potential path forward. Any post that causes such a strong negative reaction in me but I keep coming back deserves my full attention.</p>
<p>Probably time to prototype this on my blog.</p><p><a href="https://alistapart.com/article/mobile-first-css-is-it-time-for-a-rethink/" class="u-in-reply-to  is-reply">Mobile-First CSS: Is It Time for a Rethink? - alistapart.com</a></p> ]]></description>
    </item>
    <item>
       <title>Quick Tip: Updating Contact Pictures in iOS</title>
       <link>http://evantravers.com/articles/2022/06/22/quick-tip-updating-contact-pictures-in-ios/</link>
       <pubDate>Wed, 22 Jun 2022 09:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/06/22/quick-tip-updating-contact-pictures-in-ios/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<div class="admonition tldr">
<p>You can easily add an image to a contact without saving the image to Camera Roll by taking a screenshot.</p>
</div>
<p>I really try to keep my contacts updated. As I have distanced myself from social networks my texts and emails are my primary way of talking with friends. I like looking at lots of smiling faces on my messages. For years, it's irritated me that the only way to add a picture to a contact was:</p>
<ul>
<li>Find an image</li>
<li>Download to Camera Roll</li>
<li>Activate the Share Sheet</li>
<li>Choose Add to Contact</li>
<li>Go back to Camera Roll</li>
<li>Delete the random picture</li>
</ul>
<p>You can not add an image from your clipboard, nor can you just long press on an image and add to contact from the default image share sheet. * sigh *</p>
<p>But! You <em>can</em> Add to Contact from a screenshot. It's not perfect resolution, but at least it's easy and you can discard the screenshot when you are done.</p> ]]></description>
    </item>
    <item>
       <title>Extending Redcarpet for Admonition Blocks</title>
       <link>http://evantravers.com/articles/2022/06/17/extending-redcarpet-for-admonition-blocks/</link>
       <pubDate>Fri, 17 Jun 2022 09:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/06/17/extending-redcarpet-for-admonition-blocks/</guid>
       <description><![CDATA[ <p>I've been doing a lot of writing in Obsidian, and they recently released a version with these <a href="https://help.obsidian.md/How+to/Use+callouts">lovely &quot;callout&quot; blocks</a>. I like them a lot, and since I want my Creativity System to feed straight through to my writing, time to hack my blog!</p>
<p>The &quot;callouts&quot; take this form:</p>
<p><code>&gt; [!tldr] If you hack the base templater for your blog, you will cry.</code></p>
<p>I like this format because it’s still meaningful as plain text. I'm rendering them like this:</p>
<div class="admonition tldr">
<p>If you hack the base templater for your blog, you will cry.</p>
</div>
<p>Pretty straightforward SCSS:</p>
<pre class="lumis"><code class="language-scss" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">admonition</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padding</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">margin-top</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">background</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">transparentize</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$accent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0.9</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">border-left</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">solid</span> $accent<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">border-radius</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.25</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">admonition</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tldr</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@media</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;$desktop&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">display</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grid</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grid-template-columns</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">auto</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">auto</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">grid-column-gap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">align-items</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">center</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">before</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;tl;dr:&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">font-size</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">font-weight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">800</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="25">
</div><div class="line" data-line="26">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">margin</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="29"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>The really tricky part was ruby. Y'all ever seen the gif where Hal tries to change a lightbulb?</p>
<p><img src="https://loginportal.funnyjunk.com/gifs/Everyday+problems_690247_4723564.gif" alt="hal changes a lightbulb" /></p>
<p>This was one of those changes.</p>
<p>Let's go learn what all I did wrong! 🏃</p>
<h2><a href="#a-tale-of-woe" aria-hidden="true" class="anchor" id="a-tale-of-woe"></a>A tale of woe.</h2>
<ul>
<li>I found a couple posts about <a href="https://stackoverflow.com/questions/31357442/how-to-extend-middlemans-redcarpet-markdown-renderer">extending markdown in redcarpet</a>. Looks easy enough… right?</li>
<li>I first got stuck because I wasn't using the right regex globally to fix all instances of the regex. 🤦</li>
<li>I wanted to render markdown markup like <code>_italics_</code> or <code>[links](url)</code> in the admonition body, so I had to run a markdown renderer inside my markdown renderer. It's heinous, but I don't know how to get around it.</li>
<li>I realized that I could use the same format to display youtube videos, instead of my <a href="https://evantravers.com/articles/2021/01/12/middleman-helper-for-responsive-youtube-videos/">previous <code>.erb</code> based format</a>. Pure markdown for everything!</li>
<li>All this worked beautifully, but while writing this post I realized my changes destroyed syntax highlighting. I believe the <code>middleman-syntax</code> was doing some monkeypatching that I sidestepped by creating my own <code>preprocess</code> method… so I just removed the gem and <a href="https://alanvardy.com/post/redcarpet-rouge">used Rouge directly</a>.</li>
<li>I broke footnotes and header anchors because I wasn't passing options to the new renderer properly.</li>
<li>emboldened by my success, I decided to strip the <code>.html.markdown</code> extension from all my blog posts (I'd like them all to just be <code>.md</code> files someday!). The rename broke my <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">git changelogs</a>.</li>
</ul>
<p>Phew! It was a lot of bug chasing. I'm pleased with the result.</p>
<p>Here are the finished changes:</p>
<h2><a href="#git-changelog" aria-hidden="true" class="anchor" id="git-changelog"></a>Git Changelog</h2>
<p><code>ruby-git</code> <a href="https://github.com/ruby-git/ruby-git/pull/93">doesn't support <code>git log --follow</code> yet</a>, so I had to drop into git and handle it myself.</p>
<p>I tried <em>really</em> hard to pull all the information in one git command using <code>--format</code>: I tried JSON, YML, even <code>Marshall.dump</code> in ruby… but calling for each commit was easier and doesn't seem to add to <a href="https://evantravers.com/articles/2021/01/01/building-middleman-using-github-actions/">my Github CI times</a>.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@git</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">git log --follow --format=&#39;%H&#39; </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sha</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">git show </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sha</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> --no-patch --format=&#39;format:%ai&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">git show </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sha</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> --no-patch --format=&#39;format:%s&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">git show </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sha</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> --no-patch --format=&#39;format:%b&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@git</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">size</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="13">  &lt;details class=&quot;blog__changes&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">summary</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Changelog</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">summary&gt;
</div><div class="line" data-line="15">    &lt;ul&gt;
</div><div class="line" data-line="16">      &lt;% @git</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each do </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;
</div><div class="line" data-line="17">        &lt;li&gt;
</div><div class="line" data-line="18">          &lt;div class=&quot;blog__changes__date&quot;&gt;&lt;%= commit[:date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/div</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="19">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__changes__title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div&gt;
</div><div class="line" data-line="20">          &lt;%= simple_format</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit[:body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> %&gt;
</div><div class="line" data-line="21">        &lt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/li</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="22">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">details</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
<h2><a href="#custom-markdown-elements" aria-hidden="true" class="anchor" id="custom-markdown-elements"></a>Custom Markdown Elements</h2>
<p>That's the changelog fixed, what about the actual markdown renderer? Let's overly document some hacky ruby code:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Get our gems</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">middleman-core/renderers/redcarpet</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rouge/plugins/redcarpet</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># This is the same template from the previous blog post.</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">YOUTUBE_TEMPLATE</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="7">&lt;div class=&quot;youtube-container&quot;&gt;
</div><div class="line" data-line="8">  &lt;iframe
</div><div class="line" data-line="9">    width=&quot;100%%&quot;
</div><div class="line" data-line="10">    height=&quot;100%%&quot;
</div><div class="line" data-line="11">    src=&quot;https://www.youtube.com/embed/%s&quot;
</div><div class="line" data-line="12">    frameborder=&quot;0&quot;
</div><div class="line" data-line="13">    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
</div><div class="line" data-line="14">    allowfullscreen&gt;
</div><div class="line" data-line="15">  &lt;/iframe&gt;
</div><div class="line" data-line="16">&lt;/div&gt;
</div><div class="line" data-line="17"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strip</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># This regex describes the `&gt; [!name] content` Admonition block. We have to use</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># it twice (I got really stuck trying to make it one call!)</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CALLOUT</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(?&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\w</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\]</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(?&lt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">freeze</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Renderer: This is going to be our custom renderer. Gotta initialize it with</span>
</div><div class="line" data-line="24"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># some options enabled to make sure we keep our footnotes and TOC anchors.</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Renderer</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Redcarpet</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Render</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HTML</span>
</div><div class="line" data-line="26">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">initialize</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">extensions</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">super</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">extensions</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">merge</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="28">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">footnotes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="29">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with_toc_data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="30">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="31">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Rouge</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Plugins</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Redcarpet</span>
</div><div class="line" data-line="34">
</div><div class="line" data-line="35">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Here&#39;s the heart of the hack</span>
</div><div class="line" data-line="36">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preprocess</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">document</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="37">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Instantiate _another_ renderer inside this renderer to render while you</span>
</div><div class="line" data-line="38">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># render. (Eat your heart out Xzibit.)</span>
</div><div class="line" data-line="39">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">markdown</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Redcarpet</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Markdown</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="40">
</div><div class="line" data-line="41">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># change every instance of the CALLOUT regex in place.</span>
</div><div class="line" data-line="42">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">document</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CALLOUT</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="43">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># because `match` contains the matching string, not capture groups (and</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># `$~` didn&#39;t always return the last match, maybe thread-local?!) I&#39;m</span>
</div><div class="line" data-line="45">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># going to use CALLOUT again to grab the named captures.</span>
</div><div class="line" data-line="46">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CALLOUT</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">named_captures</span>
</div><div class="line" data-line="47">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">youtube</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="48">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@video</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">decode_www_form</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">v</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="49">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">format</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">YOUTUBE_TEMPLATE</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@video</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="50">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="51">        <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Render out our little component, with nested markdown render 🤷‍♂️</span>
</div><div class="line" data-line="52">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;div class=&#39;admonition  </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">markdown</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">render</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">m</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/div&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="53">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="54">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="55">
</div><div class="line" data-line="56">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">document</span>
</div><div class="line" data-line="57">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="58"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="59">
</div><div class="line" data-line="60"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:markdown_engine</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:redcarpet</span>
</div><div class="line" data-line="61"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:markdown</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="62">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fenced_code_blocks</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="63">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">smartypants</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="64">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with_toc_data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="65">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="66">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">footnotes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="67">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">renderer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Renderer</span>
</div></code></pre>
<p>What a time. I do not recommend this… unless like me you are dead set on having a simple markdown file represent your writing output, and you want to have your <a href="https://evantravers.com/articles/series/creativity-systems/">Creativity System</a> hooked directly into your blogging system. More to come on that.</p> ]]></description>
    </item>
    <item>
       <title>Review: Deeper by Dane C. Ortlund</title>
       <link>http://evantravers.com/articles/2022/05/20/review-deeper-by-dane-c-ortlund/</link>
       <pubDate>Fri, 20 May 2022 11:07:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/20/review-deeper-by-dane-c-ortlund/</guid>
       <description><![CDATA[ <p>In April I finished reading Deeper by Dane C. Ortlund. It's in the same Union series as <a href="https://evantravers.com/articles/2021/08/19/review-gentle-and-lowly-by-dane-c-ortlund/">Gentle and Lowly</a> and shares the same tender voice towards the growing christian and adoration towards Christ.</p>
<p>The title hints at the central claim: growing in the faith is not finding out new truths, but deepening our understanding and appreciation for the same gospel truths.</p>
<p>The whole book is worth your reading, but three aspects stood out for me in my particular moment in my Christian journey:</p>
<p><strong>Make time for despair.</strong></p>
<blockquote>
<p>The index of the soundness of a man's faith in Christ is the genuineness of the self-despair from which it springs.<sup class="footnote-ref"><a href="#fn-packer1" id="fnref-packer1" data-footnote-ref>1</a></sup></p>
</blockquote>
<p>Ortlund discusses how truly recognizing the depths of our depravity is required for truly appreciating the forgiveness we receive. This challenged me. I typically busy myself, dodging contemplating my sin. I’m not sure how exactly to approach this safely. I am starting with being clear, no longer minimizing the way I describe my sin in confession. I am also experimenting with a written confession that I’m adding to periodically. I have the gospel truth of forgiveness right next to it too… so as not to live in a place of sorrow, but I need to visit.</p>
<p><strong>Pray for my eyes to be opened about acquittal.</strong></p>
<blockquote>
<p>a practical knowledge of the grace that God has revealed in Christ, a heartfelt trust that he has forgiven all our sins and accepted us as his children. For that reason this faith is not only needed at the beginning in justification, but it must also accompany the Christian throughout one's entire life, and also play a permanent and irreplaceable role in sanctification.<sup class="footnote-ref"><a href="#fn-bavink" id="fnref-bavink" data-footnote-ref>2</a></sup></p>
</blockquote>
<p>Having a complete understanding of the forgiveness of sin isn’t natural and takes time. Ortlund details how Francis Schaefer, Martin Luther, and C.S. Lewis all experienced an enlightening realization late in life, and how it impacted them deeply. I’m starting to diligently pray for myself and my family to have this illumination.</p>
<p><strong>Making scripture and prayer a life-defining habit.</strong></p>
<blockquote>
<p>the way to think about these two practices is by the metaphor of breathing. Reading the Bible is inhaling. Praying is exhaling.</p>
</blockquote>
<p>Ortlund touches on the habits of grace but focused on scripture reading and prayer. I think the Lord has taken me on a journey when it comes to prayer… but I have room to grow in reading. My grandfather was a consistent man: one spot, every morning, always. It’s a defining characteristic of him. I want my kids to remember the same of me.</p>
<p>There’s a lot more to mine out of this book, and if you liked his previous work it’s more excellent food for meditation and conversation. His last words are best:</p>
<blockquote>
<p>This is a book with one point: Be astonished at the gracious heart of Jesus Christ, proven in his atoning work in the past and his endless intercession in the present. Receive his unutterable love for sinners and sufferers. Stop resisting. Let him draw near to you. Gaze upon him.</p>
</blockquote>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-packer1">
<p>J. I. Packer, <em>A Quest for Godliness: The Puritan Vision of the Christian Life</em> (1990; repr., Wheaton, IL: Crossway, 2010), 170. <a href="#fnref-packer1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-bavink">
<p>Herman Bavinck, <em>Reformed Dogmatics, vol. 2, God and Creation</em>, ed. John Bolt, trans. John Vriend (Grand Rapids, MI: Baker, 2004), 257. <a href="#fnref-bavink" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Contemplating Clever Phones</title>
       <link>http://evantravers.com/articles/2022/05/19/contemplating-clever-phones/</link>
       <pubDate>Thu, 19 May 2022 14:42:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/19/contemplating-clever-phones/</guid>
       <description><![CDATA[ <p>As useful as my phone is (I'm writing this in Drafts on it right now) I'm strongly considering trying out a &quot;dumb&quot; phone as my main phone, and replacing my kindle and iPhone with the new iPad mini<sup class="footnote-ref"><a href="#fn-mini" id="fnref-mini" data-footnote-ref>1</a></sup>.</p>
<p>I'd like to tell you I just use my mobile device for camera and reading, but Screen Time tells me I spend a lot of time checking twitter and forums for &quot;something new.&quot; I'm on wifi 99% of the time, and any time I walk around I have direct access to all my distractions with a single browser click.</p>
<p>I'm imagining a life with a simple calling/texting device in my pocket without apps or browsers, paired with a wifi-only iPad. If I want to write, see my todo list, or group text I can reach for the iPad mini on my desk or in my bag… but as I'm washing dishes, putting the kids to bed, or walking outside I would not have immediate access to that dopamine itch. It'd have to be an intentional choice to go pursue it.</p>
<p>There are some options out there. It's hard to find reviews because they are expensive niche devices that are often released in limited groupbuys, and because the people that want a device like this aren't usually blabbing all over social media.</p>
<h2><a href="#the-light-phone-2-399" aria-hidden="true" class="anchor" id="the-light-phone-2-399"></a><a href="https://www.thelightphone.com/">The Light Phone 2</a> ($399)</h2>
<p><img src="https://images.ctfassets.net/tbduj203nkkk/4GSjYLDgIMw4mWioCkASiO/b4388e4b5ac5d033188db453ab0f0aec/NightFLoat.png?w=400&amp;fm=webp&amp;q=85" alt="The Light Phone 2" /></p>
<p>This is the one that planted the seed in my brain. I love the simplicity, UI, and e-ink screen. I don't like that it would require me carrying another cable right when I had standardized on USB-C. There are weekly buy/sell threads on /r/lightphone that would probably be the best way to try it out. I like that it attempts to have a limited but useful navigation, and podcasts/music is helpful.</p>
<h2><a href="#punkt-mp02-279" aria-hidden="true" class="anchor" id="punkt-mp02-279"></a><a href="https://www.punkt.ch/en/products/mp02-4g-mobile-phone/">Punkt MP02</a> ($279)</h2>
<p><img src="https://www.punkt.ch/repoimg/catalogo/MP02/StillLife/x2672-prod_zoom-demo.jpg.pagespeed.ic.Xp5S-kxLeU.webp" alt="Punkt MP-02" /></p>
<p>The Punkt has USB-C and supports messaging over Signal, which is attractive. It doesn't have an e-ink screen, and I don't love the brutalist aesthetic.</p>
<h2><a href="#mudita-pure-379" aria-hidden="true" class="anchor" id="mudita-pure-379"></a><a href="https://mudita.com/products/phones/mudita-pure/">Mudita Pure</a> ($379)</h2>
<p><img src="https://images.ctfassets.net/isxmxtc67n72/1M2TJW6sJJnoANetGF6jP7/294a05fc41614598e3c8455825b0184a/Mudita-Pure.png?w=1409&amp;h=680&amp;q=100&amp;fm=webp" alt="Mudita Pure" /></p>
<p>Mudita has USB-C and E-ink… but I have read the call quality is really bad because it's intentionally shielding the device from radiation. It only tethers via USB, which isn't very convenient although that could be a benefit. They see <a href="https://mudita.com/community/blog/predictive-texting-the-need-for-speed/">inconvenience as part of the featureset</a>, so I don't really see them budging on that front.</p>
<h2><a href="#wisephone-399" aria-hidden="true" class="anchor" id="wisephone-399"></a><a href="https://techless.com/wisephone?abr=1">Wisephone</a> ($399)</h2>
<p><img src="https://static1.squarespace.com/static/5ca3bcd5fb22a5462fe2008f/t/62389152f2680314fbe99580/1647874386412/Wisephone_Basic04_compressed.png" alt="Wisephone" /></p>
<p>This is a really expensive &quot;locked down&quot; android phone. I'm not really interested in paying for a super powerful device and then removing 90% of it's power.</p>
<h2><a href="#kaios" aria-hidden="true" class="anchor" id="kaios"></a><a href="https://www.kaiostech.com/explore/devices/">KaiOS</a></h2>
<p>There's a range of phones running this simplistic FirefoxOS based system. I haven't researched them much.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>📵</h2>
<p>I wish that there was an 5G, e-ink device, USB-C charging, decent battery life, and decent calling/ 5G hotspot. Of the options, the Mudita Pure feels like the closest to what I want, but it's a lot of money to spend on something I'm not sure about. Jose Briones did make <a href="https://www.youtube.com/watch?v=N4Qhmv4k0n8">a handson comparison</a> between the Mudita Pure, Lightphone, and Punkt. He also has an awesome <a href="https://josebriones.org/dumbphone-finder">&quot;dumbphone finder&quot; tool</a>, that may be up to date.</p>
<p>I'm going to keep thinking about it. It would probably be cheaper to buy a $10 Android... or to remove Safari from my phone… but I really would like to have to make a physical choice to engage with grouptexts and applications. 🤷</p>
<p>If I do try one in the near future, it's a toss up between the Lightphone and the Mudita. I'd 100% choose the Lightphone if they had a USB-C device. It took them five years to move from Lightphone 1 to 2, so maybe in 2025 I'll have what I want.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-mini">
<p>The new iPad mini is $399 and looks like the perfect form factor for portable enough to be useful, while not convenient enough to always have on my person. :P <a href="#fnref-mini" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>A Micro Office in a Tech Pouch</title>
       <link>http://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/</link>
       <pubDate>Mon, 16 May 2022 10:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/16/a-micro-office-in-a-tech-pouch/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/05/hero.jpg"></p><p>For years <a href="https://evantravers.com/articles/2018/12/10/whats-in-my-bag/#goruck-wire-dopp">my Goruck Wire Dopp</a> has been my &quot;just add laptop&quot; kit. It’s perfect for my old load out: a traditional charging block, some assorted dongles and an external battery or HD. That load has changed: Starting with trying to figure out how to change everything to USB-C, but when we booked a month long working trip, I started building a micro office incorporating my new <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">keyboard</a> and <a href="https://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/">mouse</a>.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/05/unpacked.jpg">
  <figcaption>Everything all splayed out. Doesn't look like it'll fit, does it?</figcaption>
</figure>
<p>I got to use this new setup over the past month on that trip. I packed and unpacked it every single day; in coffeeshops, and all over our Airbnb. I'm very pleased.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/05/packed.jpg">
  <figcaption>Fits like it was made for it.</figcaption>
</figure>
<h2><a href="#evergoods-cap-2l" aria-hidden="true" class="anchor" id="evergoods-cap-2l"></a><a href="https://evergoods.us/products/civic-access-pouch-2l">Evergoods CAP-2L</a></h2>
<p>The heart of the kit is a new organizer pouch from Evergoods. The CAP has the perfect dimensions and organization to Tetris all my gear together tightly with just enough padding and structure to protect it all. There’s a <a href="https://packhacker.com/travel-gear/evergoods/civic-access-pouch-2l-cap2l/">thorough rundown on packhacker</a>.</p>
<p>The Goruck Wire Dopp can carry the new load, but I have to add protective cases for mouse and keyboard which adds considerable bulk.</p>
<p><img src="https://images.evantravers.com/articles/2022/05/afterpen.jpg" alt="" /></p>
<p>Even better, the CAP-2L opens into a standing desk caddy, so it’s useful for more than in the bag. I really love the large 3D space pouch accessible from inside and outside, it is great for pens, AirPods, keys.</p>
<p>Inside the CAP-2L:</p>
<h4><a href="#keyboard-corne-ish-zen-from-lowprokbca" aria-hidden="true" class="anchor" id="keyboard-corne-ish-zen-from-lowprokbca"></a>Keyboard: <a href="https://evantravers.com/articles/2022/04/19/review-corne-ish-zen/">Corne-ish Zen from lowprokb.ca</a></h4>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-monkeytype.jpg" alt="" /></p>
<h4><a href="#mouse-steelseries-primi-mini-with-its-usb-c-dongle" aria-hidden="true" class="anchor" id="mouse-steelseries-primi-mini-with-its-usb-c-dongle"></a>Mouse: <a href="https://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/">Steelseries Primi Mini</a> (with its USB-C dongle)</h4>
<p><img src="https://images.evantravers.com/articles/2021/12/prime.jpeg" alt="" /></p>
<p>I’ve also got an old Razer mobile mousepad. I tried to make one about the size of a kindle by cutting down a Steelseries, but I did such a horrid job that it will never be spoken of again.</p>
<h4><a href="#minix-neo-p3-charging-block" aria-hidden="true" class="anchor" id="minix-neo-p3-charging-block"></a>Minix Neo p3 Charging Block</h4>
<p><img src="https://images.evantravers.com/articles/2022/05/neo.jpg" alt="" /></p>
<p>The Neo is my first foray into GaN chargers, and so far I’m impressed. It replaced both a large MacBook brick, an iPad block, and the iPhone block. It was my <strong>only</strong> charger for a month for all my devices, and never choked.</p>
<p>During a coffee shop coworking session the Neo powered my 15” MacBook Pro <strong>and</strong> a friends MacBook Pro 13” for a couple hours and both stayed charging.</p>
<p>There’s a similar product from Anker if you want to stick to a known brand, but I’m satisfied with the Neo. It’s really nice to have a dedicated travel charging setup this light and effective. I can leave the white bricks at home.</p>
<h4><a href="#battery-anker-313-powercore-slim-10k" aria-hidden="true" class="anchor" id="battery-anker-313-powercore-slim-10k"></a>Battery: Anker 313 PowerCore Slim 10K</h4>
<p>This is the only decent battery I could find that charged via USB-C <em>and</em> had a USB-C output. I wish it was smaller, but otherwise no complaints.</p>
<h4><a href="#cables" aria-hidden="true" class="anchor" id="cables"></a>Cables</h4>
<p><img src="https://images.evantravers.com/articles/2022/05/ties.jpg" alt="" /></p>
<p>Having USB-C everything means the computer or Minix Neo can charge anything. It’s awesome. I have one charger… any of the devices and cables in the bag work with <em>everything</em>. It's delightfully simple.<sup class="footnote-ref"><a href="#fn-caveat" id="fnref-caveat" data-footnote-ref>1</a></sup></p>
<p>I spent a little time working out the minimum cables I needed to feed everything:</p>
<ul>
<li>Steelseries USB-A -&gt; USB-C</li>
<li>2x USB-C -&gt; USB-C cables</li>
<li>USB-C -&gt; Apple Lightning cable</li>
</ul>
<p>I also grabbed <a href="https://www.amazon.com/gp/aw/d/B093ZZMFBN?psc=1&amp;ref=ppx_pop_mob_b_asin_title">these simple cable ties</a>, literally the cheapest on Amazon at the time. I like them better than the Velcro straps I have used because they don’t tear up mesh pockets.</p>
<h4><a href="#pen-case-rick-shaw-double-pen-sleeve" aria-hidden="true" class="anchor" id="pen-case-rick-shaw-double-pen-sleeve"></a>Pen Case: Rick Shaw Double Pen Sleeve</h4>
<p><img src="https://images.evantravers.com/articles/2022/05/pencases.jpg" alt="" /></p>
<p>It is <em>surprisingly</em> difficult to find small pen cases. People who love and use pens tend to either be artists who need lots of tools or fanatics who want to have 10+ with them.</p>
<p>For years I’ve been using a <a href="https://nockco.com/cases/chimneytops">nock.co chimneytop</a> case and it does a great job. In the front pocket of my GR1, it flattened out and took up very little space. In the 3D space of the CAP-2L it sort of ballooned far more than the volume required for the two pens I carry… I looked for something new.</p>
<p>The Rick Shaw is fun, customizable, and svelte. I ordered just enough length to handle my favorite pens… it’s just big enough to be blindly grabbed out of a bag, without taking up more space than it’s contents. I’m a fan.</p>
<p><img src="https://images.evantravers.com/articles/2022/05/penrest.jpg" alt="" /></p>
<p>The pen sleeve doubles as a &quot;don't roll away&quot; space for a bullet journaler on the go.</p>
<h2><a href="#roost-v3-laptop-stand" aria-hidden="true" class="anchor" id="roost-v3-laptop-stand"></a>Roost V3 Laptop Stand</h2>
<p>I had been using a knockoff of the Roost (the Nexstand K3) for a while and decided to upgrade. The Roost is considerably nicer: lighter, sturdier, and more stable. The real reason to upgrade is that the Roost’s maximum height is tall enough for a standing desk.</p>
<h3><a href="#ipad-as-second-monitor" aria-hidden="true" class="anchor" id="ipad-as-second-monitor"></a>iPad as Second Monitor</h3>
<p><img src="https://images.evantravers.com/articles/2022/05/ipadstand.jpg" alt="" /></p>
<p>A <a href="https://www.reddit.com/r/Battletops/comments/udrawy/any_love_for_a_portable_battletop_this_is_my/">post on reddit</a> showed a clever way to use the iPad as a second screen. I gave it a whirl, and am really happy with it. Using <a href="https://support.apple.com/en-us/HT212757">Universal Control</a>, I can drop my mouse down to the second screen and use my keyboard and mouse, or pull the magnetic Apple Pen 2 off and use the Roost as an easel. It's nifty.</p>
<p>I do occasionally lose track of which app/split is currently receiving focus, but I have noticed that on iPadOS the ellipsis (<code>…</code>) at the top of the screen for controlling splits and such highlights subtly on the split app that is receiving the keyboard events.</p>
<h2><a href="#working-out-of-the-bag" aria-hidden="true" class="anchor" id="working-out-of-the-bag"></a>Working out of the bag</h2>
<p><img src="https://images.evantravers.com/articles/2022/05/explanation.jpg" alt="" /></p>
<p>The Airbnb we arrived at promised a workspace… what we found was a breakfast nook table to low to stand at and too high to sit at. 🙇 After some frustration my brilliant wife suggested we Amazon some dorm furniture risers. After a couple of tries we were able to push the level up to an acceptable standing height.</p>
<p>Every morning I unpacked the setup and every night I packed it away as a sort of “commute” or shut down routine. I <em>love</em> how the CAP-2L’s open mode can organize my keys, phone, any random paper I produce while I work.</p>
<p><img src="https://images.evantravers.com/articles/2022/05/thenote.jpg" alt="" /></p>
<p>I’ve been using some Baron Fig index cards as a sort of pseudo-Analog system<sup class="footnote-ref"><a href="#fn-analog" id="fnref-analog" data-footnote-ref>2</a></sup>. On the go, the slim pockets on the front of the CAP-2L provided a perfect place for that task to stare me in the face all day.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/04/zen-coffee.jpg">
  <figcaption>The whole setup even works on very thin coffeeshop tables.</figcaption>
</figure>
<p>The micro office can scale up or down. Most mornings I’d bike the whole thing to a coffee shop for some planning. I’d pull out my journal and the CAP-2L, fish the pen case out of the 3D space pocket and start writing. After some time, I’d pull out the laptop, open the organizer, build my little workspace, and start working.</p>
<p>For audio I used either my Sony XH4 or new AirPods Pro. The Sonys sound amazing (especially with <a href="https://rogueamoeba.com/soundsource/">SoundSource</a>’s custom equalizer) but the AirPods have a lot less weird bugs and switch nicely between devices. I tended to use the AirPods for calls and the over ear Sony to create a focus space in the often noisy Airbnb.</p>
<h2><a href="#at-home" aria-hidden="true" class="anchor" id="at-home"></a>At Home</h2>
<p>Everything continues to live in this minimal kit. All the input devices are my main drivers at home, so I still tear down the “office” every night, putting some things back in the CAP-2L as a form of commute.</p>
<p>I like to work in different spaces for different work. It’s awesome to have one thing to grab with whatever journal/device I’m working with and just <strong>go</strong>. Hopefully we will get another chance to use it in a new place sometime soon.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-caveat">
<p>I’ll eventually upgrade to an M1 MacBook Pro which will make obsolete a dongle for my camera’s SD cards. I’ll also likely upgrade my Kindle to the USB-C variant or an iPad mini. Then I’ll have no other cables left save a lone lightning cable for AirPods and iPhone. <a href="#fnref-caveat" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-analog">
<p>As part of my daily review, I write down the most important task for the next day. I copy it into my Bullet Journal as part of morning planning. If I am faithful and do the most important thing, it gets checked off. If I am not faithful and distracted, it gets crossed off and usually rewritten.</p>
<p>As such, it becomes a sort of record of my dedication to work on <a href="https://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work</a> tasks.</p>
<p>The real <a href="https://ugmonk.com/pages/analog">Analog system by Ugmonk</a> is slightly different. <a href="#fnref-analog" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Pop Culture Has Become an Oligopoly</title>
       <link>http://evantravers.com/articles/2022/05/07/pop-culture-has-become-an-oligopoly/</link>
       <pubDate>Sat, 07 May 2022 07:40:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/07/pop-culture-has-become-an-oligopoly/</guid>
       <description><![CDATA[ <p>If you have noticed and wondered about sequelitis in movies and books… it's not just you: it's a real thing.  Adam Mastroianni writes:</p>
<blockquote>
<p>the shift is gigantic. Until the year 2000, about 25% of top-grossing movies were prequels, sequels, spinoffs, remakes, reboots, or cinematic universe expansions. Since 2010, it’s been over 50% ever year. In recent years, it’s been close to 100%.</p>
</blockquote>
<p>Adam shows charts showing the same consolidating trend in music, TV, and books. Years ago a bookstore's sci-fi section would be a portal to hundreds of possible futures, ideas, cultures… nowadays it splits neatly into Minecraft, Star Wars, Marvel, and other.</p>
<blockquote>
<p>My parents grew up with the first Star Wars movie, which had the audacity to create an entire universe. My niece and nephews are growing up with the ninth Star Wars movie, which aspires to move merchandise.</p>
</blockquote>
<p>I suppose that because of <a href="https://www.inc.com/jeff-haden/43-years-ago-star-wars-creator-george-lucas-made-a-4-billion-decision-even-though-it-had-nothing-to-do-with-money.html">George's crazy original deal</a>, every Star Wars movie is to move merchandise, but the point still has teeth.</p>
<p>The author in part blames us as consumers for making safe choices:</p>
<blockquote>
<p>As options multiply, choosing gets harder. You can’t possibly evaluate everything, so you start relying on cues like “this movie has Tom Hanks in it” or “I liked Red Dead Redemption, so I’ll probably like Red Dead Redemption II,” which makes you less and less likely to pick something unfamiliar.</p>
</blockquote>
<p>I agree and feel guilty.</p>
<p>The swing he has measured towards franchise multiplicity precedes algorithmic-recommendation engines but I think we can include market research under that cloak. Both market research and algorithms tend to self-reinforce your previous buying decisions… helping build the ridiculous selling power of these repeated franchises, helping them outcompete variety in the market… until Bob Igor rules the imagination landscape of a generations.</p>
<p>The oligopoly -&gt; monopoly path puts the engine of cultural change in the hands of fewer money-driven corporations and politically-minded boards. While you may have trusted the original writers and directors of your favorite franchises; I do not trust them to treat hearts of my kids as more than ad-revenue.</p>
<p>This media oligopoly may very well be that certain mediums have evolved &quot;apex predator&quot; formats, (e.g. &quot;superhero movie&quot;, the article deals with this under <em>innovation</em>) but I rather think it has to do with the cost of producing a competitive product. I think the indie world of media is out there, it's just shifted to more agile and cheaper mediums. The variance is still out there… the podcast explosion is a pretty good example.</p>
<blockquote>
<p>Every strange thing, wonderful and terrible, is available to you, but they’ll die out if you don’t nourish them with your attention. Finding them takes some foraging and digging, and then you’ll have to stomach some very odd, unfamiliar flavors. That’s good. […] Humankind does not live on bread alone, nor can our spirits long survive on a diet of reruns.</p>
</blockquote>
<p>Go read a weird book… before Netflix options all of them as badly-made money grabs.</p><p><a href="https://experimentalhistory.substack.com/p/pop-culture-has-become-an-oligopoly?s=r" class="u-in-reply-to  is-reply">Pop Culture Has Become an Oligopoly - by Adam Mastroianni - experimentalhistory.substack.com</a></p> ]]></description>
    </item>
    <item>
       <title>Indieweb Replies</title>
       <link>http://evantravers.com/articles/2022/05/03/indieweb-replies/</link>
       <pubDate>Tue, 03 May 2022 15:08:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/03/indieweb-replies/</guid>
       <description><![CDATA[ <p>I've been posting <a href="https://evantravers.com/articles/tags/links/">links</a> on the blog for a while. It started as summaries of my monthly reading but has morphed into daringfireball-style commentary on neat internet posts by neat internet people.</p>
<p>I didn't have a visual metaphor for &quot;posts that I write&quot; vs. &quot;commentary on posts that I didn't write,&quot; and that's held me back for a bit… but I found some time to hack it together.</p>
<p>I have finished the first iteration on this, and I'm pleased as punch.</p>
<p><img src="https://images.evantravers.com/articles/2022/05/reply.png" alt="image of a reply" /></p>
<p>For the design I chose a simple unicode circle arrow <code>↺</code> for the &quot;reply&quot; icon. I think it's clear enough without being too distracting. I eventually created a CSS class to show it… it let's me use it flexibly on both the body link and the header:</p>
<pre class="lumis"><code class="language-scss" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is-reply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">before</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;↺&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">display</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inline-block</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">margin-right</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.25</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">font-size</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1.4</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">em</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">font-weight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">400</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">font-family</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">monospace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">color</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lighten</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$accent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">30</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Fun fact: <code>text-decoration</code> can't be overridden by a child element<sup class="footnote-ref"><a href="#fn-text-decoration" id="fnref-text-decoration" data-footnote-ref>1</a></sup> including <code>:before</code> pseudo-elements… <em>unless</em> that pseudoelement has a <code>display</code> property of <code>inline-block</code>. I have no idea why. It feels like a consistent glitch rather than a feature, but what's the difference when it comes to CSS? 🤷</p>
<p>The other fun bug was with Firefox. Apparently the way it decided to fallback the unicode character was different than webkit based browsers. Setting <code>font-family: monospace</code> ensured that the fallback font was consistent in Gecko-land.</p>
<p>On posts that are a reply to a single link and depend on it for context, I updated the YAML frontmatter:</p>
<pre class="lumis"><code class="language-yaml" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Keeping a Separate Creativity Computer</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://thenewsprint.co/2022/03/28/keeping-a-separate-creativity-computer/</span>
</div></code></pre>
<p>This means that everywhere in Middleman I can query for <code>if article.reply</code> to find out if this article is a reply or not. I use that in my filtered RSS for just my essays:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reject</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reply</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>When it comes time to display the source's URL, I can format a consistent link pretty easily:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&lt;a href=&quot;&lt;%= article.data.reply.url %&gt;&quot; class=&quot;u-in-reply-to  is-reply&quot;&gt;
</div><div class="line" data-line="2">  &lt;%= article.data.reply.title %&gt; - &lt;%= URI(article.data.reply.url).host %&gt;
</div><div class="line" data-line="3">&lt;/a&gt;
</div></code></pre>
<p>While I was having fun with the design I snuck in some functionality as well… <a href="https://indieweb.org/reply">indieweb replies</a>! The reply is a good fit for the kind of content I'm posting: I'm reading on my phone and I see something I like and is worth sharing with my friends. I'll use Drafts.app to yank the content in, format it, throw it into Working Copy, and Github CI posts automagically.</p>
<p>All that was required to be a legitimate reply was to add the class <code>.u-in-reply-to</code> to the link in the <code>.h-entry</code> div that contains the content. I quickly <a href="https://indiewebify.me/validate-h-entry/?url=https%3A%2F%2Fevantravers.com%2Farticles%2F2022%2F05%2F03%2Fkeeping-a-separate-creativity-computer%2F">checked with the linter</a> and it seems that everything is useful and usable.</p>
<p>At some point I'll figure out some kind of automated CI process to send webmention pings when Github CI builds a new article, but that can wait for now.</p>
<p>If you don't want to see these reply/commentary posts there is <a href="https://evantravers.com/feeds">an Essay specific RSS feed</a> just for you.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-text-decoration">
<blockquote>
<p>The 'text-decoration' property on descendant elements cannot have any effect on the decoration of the ancestor.</p>
</blockquote>
<p><a href="https://stackoverflow.com/questions/4481318/css-text-decoration-property-cannot-be-overridden-by-child-element">CSS text-decoration property cannot be overridden by child element [duplicate] - stackoverflow.com</a> <a href="#fnref-text-decoration" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Keeping a Separate Creativity Computer</title>
       <link>http://evantravers.com/articles/2022/05/03/keeping-a-separate-creativity-computer/</link>
       <pubDate>Tue, 03 May 2022 12:55:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/03/keeping-a-separate-creativity-computer/</guid>
       <description><![CDATA[ <p>I really resonated with Josh Ginter's self-reflection:</p>
<blockquote>
<p>[…] there’s some sort of psychological barrier to opening the MacBook Pro lid when it’s time to create.</p>
</blockquote>
<p>I have a <a href="https://evantravers.com/articles/2021/03/20/headspace-v1-0/">complicated script to help me enter different &quot;modes&quot;</a>, but <em>nothing</em> is as effective as another place on another device. There are other kinds of triggers: I only listen to certain music while doing certain tasks, I go to certain places to handle certain work… whatever works for you. I've had some success with different keyboards.</p>
<p>If I had infinite resources I would have two working desks: one for shallow, and one locked down computer for <a href="https://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/">deep work</a>.</p>
<blockquote>
<p>As it stands, I’m grateful for the mental block between my MacBook Pro and the creative work I need to complete. It provides some separation between office-work and side-gig-work. It provides a transition from office to home. And, in a way, it provides the opportunity to have some sort of shutdown period each day.</p>
</blockquote>
<p>Another great point. I remember hearing CGP Grey saying that in confined spaces he would move his laptop to a different place on the desk, just to have something slightly different to jog his brain.</p>
<p>Great post, and lovely pictures as always.</p><p><a href="https://thenewsprint.co/2022/03/28/keeping-a-separate-creativity-computer/" class="u-in-reply-to  is-reply">Keeping a Separate Creativity Computer - thenewsprint.co</a></p> ]]></description>
    </item>
    <item>
       <title>Pondering Pinterest</title>
       <link>http://evantravers.com/articles/2022/05/02/pondering-pinterest/</link>
       <pubDate>Mon, 02 May 2022 06:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/05/02/pondering-pinterest/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I'm having too much fun on Pinterest these days… mostly just creating wishlists for myself. Amazon has for years absorbed my wishlist but now that <a href="https://github.com/joshuatz/amazon-add-to-wishlist-bookmarklet/issues/1">the Universal Wishlist feature is defunct</a>, I wanted another way to save gift ideas, especially since 90% or what I like isn't on Amazon.</p>
<p>I would <em>not</em> have suspected I would return to Pinterest, famous for its use in planning weddings and events. I suspect in part it's because Pinterest emphasizes the user's identity rather than optimizing for constant engagement.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> MySpace had its top ten, tumblr felt like entering someone's room to hear their music and look at their posters… I think this is missing from the current generation of algorithmic feed-sites. No more home pages, just feeds.</p>
<p>At least I miss it.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I don't use the following or explore pages, they are still utterly and algorithmically useless. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Before This Damage Is Done</title>
       <link>http://evantravers.com/articles/2022/04/29/before-this-damage-is-done/</link>
       <pubDate>Fri, 29 Apr 2022 14:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/29/before-this-damage-is-done/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p><em>I wrote this a year or so ago, but re-discovered it recently.</em></p>
<p>This morning my wife went to workout a little later. My daughter was sad that mommy left when she woke up, so after some hugging and tickling I persuaded her to help make smiley eggs.</p>
<p>We put on our little aprons, she helped whisk the eggs into submission, standing on a chair to watch them turn from froth to steaming scramble. I add ketchup smiley faces to hers.</p>
<p>On a whim, started playing <a href="https://www.youtube.com/watch?v=5Euj9f3gdyM">The Suburbs by Arcade Fire</a>.  Dancing in the kitchen. It's been twelve years since I first heard this… it still tastes of youthful yearning and frustration. Singing every word at the top of my lungs.</p>
<blockquote>
<p>I want a daughter while I'm still young…</p>
</blockquote>
<p>She is bopping, smiling, spinning… I know the next line. I hold out my hand and she skips over and her little palm disappears in mine. The tears start. A world of longing from a decade ago healed and redeemed in an April morning.</p>
<blockquote>
<p>… I want to hold her hand and show her some beauty before this damage is done.</p>
</blockquote>
<p>She pirouettes endlessly on my thumb while my son in my arms is doing his joyful head wiggle dance.</p>
<blockquote>
<p>… but if it's too much to ask, please send me a son.</p>
</blockquote>
<p>Full on crying. Years of locust-ridden angst absorbed and absolved in a moment. The song sounds different now.</p> ]]></description>
    </item>
    <item>
       <title>Blogging Through Git Commits</title>
       <link>http://evantravers.com/articles/2022/04/25/blogging-through-git-commits/</link>
       <pubDate>Mon, 25 Apr 2022 14:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/25/blogging-through-git-commits/</guid>
       <description><![CDATA[ <p>Ever since my friend Tom <a href="https://evantravers.com/articles/2020/05/03/five-things-i-tell-every-new-develop-to-learn/#use-git-and-craft-good-commits">got me started using git</a> I have been very intentional about practicing the art of crafting good commits. It is <em>central</em> to my understanding of how git works and how it ought to be used in community with others.</p>
<p>Since github, I've been basically sending people messages in the commit messages, and it has been a helpful realization. A commit message is a succinct communication to someone else.</p>
<p>The commit exists because you faced a problem, solved it, and encapsulated it as code and commit message. No reason to <a href="https://evantravers.com/articles/2021/01/15/scaling-yourself-scott-hanselman/">restate in future texts or emails</a>, you can refer back to the commit. It's a message.</p>
<p>Here's a <a href="https://github.com/evantravers/dotfiles/commit/abe632019c5dd44dfd533b9415d2b99b9f288f4d">recent example that I sent to my friends</a>. We all are tinkering with syncing our dotfiles and configuration over git, and I knew that three to five of them would need this trick immediately. Adding the reference means that they will have to ask me less questions about the reasoning where I found this.</p>
<p>I've been thinking… could I create an alias for git's internal formatter to output a commit as a markdown blog post?</p>
<p>I am currently experimenting with <code>git --no-pager show --format=&quot;# %B ```diff&quot;; echo '```'</code>. It's <em>pretty</em> close, but I'm pretty sure with some <code>sed</code> or <code>awk</code> magic, I could make it even better. Here's what it renders from that git commit above:</p>
<hr />
<h1><a href="#stow-ignores-gitignore--cvsignore-by-default" aria-hidden="true" class="anchor" id="stow-ignores-gitignore--cvsignore-by-default"></a>Stow ignores .gitignore / .cvsignore by default</h1>
<p><a href="https://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html#Types-And-Syntax-Of-Ignore-Lists">https://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html#Types-And-Syntax-Of-Ignore-Lists</a></p>
<p>By specifying a local file that doesn't ignore .cvsignore, I finally got
this to work. * headdesk *</p>
<pre class="lumis"><code class="language-diff" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diff</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/git/.stow-local-ignore b/git/.stow-local-ignore</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new file mode </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100644</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0000000</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">323b5f3</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/dev/null</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+++</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b/git/.stow-local-ignore</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@@ -0,0 +1,25 @@</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># ~./dotfiles/.stow.local.ignore: Files to be ignored by gnu &#39;stow&#39;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Comments and blank lines are allowed.</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># See &#39;info stow&#39; section &quot;4 Ignore Lists&quot; for more information</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">RCS</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.+,v</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CVS</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\.\#.+       # CVS conflict files / emacs lock files</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\.svn</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_darcs</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\.hg</span>
</div><div class="line" data-line="22"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\.git</span>
</div><div class="line" data-line="24"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\.gitignore</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="26"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.+~          # emacs backup files</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\#.*\#       # emacs autosave files</span>
</div><div class="line" data-line="28"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="29"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^/README.*</span>
</div><div class="line" data-line="30"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^/LICENSE.*</span>
</div><div class="line" data-line="31"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^/COPYING</span>
</div></code></pre>
<hr />
<p>It's a start. Anyone want to take this further?</p> ]]></description>
    </item>
    <item>
       <title>Number Our Days</title>
       <link>http://evantravers.com/articles/2022/04/22/number-our-days/</link>
       <pubDate>Fri, 22 Apr 2022 09:46:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/22/number-our-days/</guid>
       <description><![CDATA[ <blockquote>
<p>[12] So teach us to number our days
that we may get a heart of wisdom.</p>
</blockquote>
<p>– Psalm 90:12</p>
<p>While reading this morning, I hit this familiar passage and it reminded me of designer <a href="https://twitter.com/jordanmoore/status/1273226374095003657?s=20&amp;t=5Ei_xBznhjalrbxUbtio4w">Jordan Moore's solution to this</a>.</p>
<p>I want to try this, but even looking at the images I can tell how utterly humbling it would be and frankly I'm scared to try.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">52 blocks wide × 90 rows. <br><br>Decades are emphasised as milestones and I’ve made a handy notes column for annotations and documenting significant life events (travel, marriage, kids, career changes etc). <a href="https://t.co/e4xRy8M9Wk">pic.twitter.com/e4xRy8M9Wk</a></p>&mdash; jordanmoore.eth (@jordanmoore) <a href="https://twitter.com/jordanmoore/status/1273226393128701952?ref_src=twsrc%5Etfw">June 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>It's such a powerful and simple illustration of a truth.</p>
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/YQE8Q4DuQr">pic.twitter.com/YQE8Q4DuQr</a></p>&mdash; jordanmoore.eth (@jordanmoore) <a href="https://twitter.com/jordanmoore/status/1274133604055089152?ref_src=twsrc%5Etfw">June 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The <a href="https://waitbutwhy.com/2014/05/life-weeks.html">original article that inspired Jordan's design</a> is also fascinating. I think the idea that may win me over to try this exercise would be to put my wife's and my map next to each other and celebrate that moment when the two lives join.</p>
<p>In the end only His daily grace can be sufficient for the next 24 hours and for the weeks and years ahead.</p>
<blockquote>
<p>[14] Satisfy us in the morning with your steadfast love,
that we may rejoice and be glad all our days.</p>
</blockquote>
<p>– Psalm 90:14</p> ]]></description>
    </item>
    <item>
       <title>Frustrated with 11ty</title>
       <link>http://evantravers.com/articles/2022/04/20/frustrated-with-11ty/</link>
       <pubDate>Wed, 20 Apr 2022 12:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/20/frustrated-with-11ty/</guid>
       <description><![CDATA[ <p>I've been flailing off and on over the past few <strike>weeks</strike> months to migrate my blog from <a href="https://middlemanapp.com/">middleman</a> to <a href="https://www.11ty.dev/">11ty</a>. Every time I opened my code editor to write a post… I got side-tracked into an endless hacking session. I had <a href="https://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/">already written a migration script</a> to extract my content, but it took me a while to make a choice as to what to try and make the changes in.<sup class="footnote-ref"><a href="#fn-11ty" id="fnref-11ty" data-footnote-ref>1</a></sup> Here are some of my scars from my battle with the JS-powered <a href="https://www.11ty.dev/blog/logo-homage/">possum</a>… while I pick myself up for another bout.</p>
<h2><a href="#my-mistakes-are-many" aria-hidden="true" class="anchor" id="my-mistakes-are-many"></a>My mistakes are many…</h2>
<h3><a href="#i-had-bad-yaml" aria-hidden="true" class="anchor" id="i-had-bad-yaml"></a>I had bad YAML.</h3>
<p>Even though <a href="https://evantravers.com/articles/series/simple-markdown-zettelkasten/">how much I write about it</a>, I was using bad YAML for tags. 🤦</p>
<p>The following is valid but wrong YAML:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">foo, bar, baz</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div></code></pre>
<p>That resolves to the string <code>&lbrace;tags: &quot;foo, bar, baz&quot;&rbrace;</code> (what YAML refers to as a &quot;scalar&quot; and not a collection.) It seems that whatever library/method <a href="https://middlemanapp.com/">Middleman</a> was using to parse YAML frontmatter was more accepting than the actual spec.</p>
<p>The power of having a repeatable script is that such mistakes are relatively fixable. I just added some yucky-looking ruby to my content migration script to format that YAML:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># clean up tag YAML format</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Since the offending code will all be in one line, find that line</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag_string</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">select</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">l</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># if that line exists, grab all the tags out of it.</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span>       <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag_string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scan</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\w</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reject</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag_string</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># if those tags exist, rewrite the original line with the correct syntax</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag_string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span>
</div></code></pre>
<p>This changes the above to a valid YAML collection:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">foo</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bar</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">baz</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div></code></pre>
<p>Now I have to go around and fix a bunch of Drafts actions. 🤦‍♂️</p>
<h3><a href="#fooled-by-folders-struggling-with-symlinks" aria-hidden="true" class="anchor" id="fooled-by-folders-struggling-with-symlinks"></a>Fooled by folders, struggling with symlinks</h3>
<p>Part of my goal was not run a &quot;long running branch&quot; where the content of the 11ty fork would lag behind the middleman site. I figured that would slow down my writing even more.</p>
<p>Part of the repeatable migration script was nuking the folder, copying over the 11ty files from a <code>/tmp</code> folder, and migrating the content from the middleman site, voltron-ing them all into a &quot;final folder.&quot; This allowed me to keep writing content in middleman or work in 11ty, and nothing would get lost. I'd run <code>npx @11ty/eleventy --serve</code> in the &quot;final&quot; folder, and be off to work.</p>
<p>However, I got confused <em>often</em> by the two folders.</p>
<p>If I made a change in the &quot;final&quot; folder… git wouldn't pick it up because I had <code>.gitignore</code>d it. I'd have to remember to copy any local changes out of the &quot;final&quot; folder into the <code>tmp</code> folder. If I worked in the <code>tmp</code> folder, git would see it, but it wouldn't affect what my browser was rendering… because 11ty was watching the final folder. 🤦‍♂️</p>
<p>While bemoaning this to my friend <a href="https://megalithic.io">Seth</a> I realized that I could use <a href="https://www.gnu.org/software/stow/">GNU Stow</a> to symlink the contents of the <code>tmp</code> folder to the final folder, and then I wouldn't have the problems anymore: one folder for git to track, all changes updated, yay!</p>
<p>Except <a href="https://github.com/11ty/eleventy/issues/530">11ty has problems with symlinks</a>, so I had to write this lovely little ruby bit into the migration:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Use stow to copy over tmp to final</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stow tmp -t evantravers.com</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Nuke the symlink that needs to be passthroughCopy</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rm -rf evantravers.com/dist</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Manually copy the files over so that we have CSS/JS</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp -r ./tmp/dist evantravers.com/dist</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div></code></pre>
<p>It's gross. It works. Moving on.</p>
<h3><a href="#data-doctoring" aria-hidden="true" class="anchor" id="data-doctoring"></a>Data doctoring</h3>
<p>There were a few minor data adjustments that the migration script had to handle…</p>
<p>Blog post times had to be adjusted: timezones removed (did that in middleman via vim search-and-replace), quotes added around the YAML declaration. No idea why.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># 11ty requires string notation around the date?</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date: </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Regexp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">last_match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>11ty uses prism.js for syntax highlighting, and it has slightly different names for the languages… so more find/replace.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># prism.js is a picky boi</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```viml</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```vim</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```fish</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```make</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```makefile</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```conf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```apacheconf</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```apacheconfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">```apacheconf</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>As part of the <a href="https://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/">original migration script</a>, I had put in a folder structure to ensure that the SSG I would choose would respect my URLs, but honestly… I'll probably remove that.</p>
<h2><a href="#11ty-is-weird" aria-hidden="true" class="anchor" id="11ty-is-weird"></a>11ty is weird</h2>
<p>So those were my mistakes… what about the possum?</p>
<h3><a href="#data-isnt-coherent-at-all-levels" aria-hidden="true" class="anchor" id="data-isnt-coherent-at-all-levels"></a>Data isn't coherent at all levels</h3>
<p>This really bothered me. Frontmatter data of the current page is made available as a variable with no namespace, while <em>outside</em> the current page it's nested under <code>data</code>. Quick context:</p>
<p>In my blog, the HTML that drives the list pages (home, calendar, tags) and the header for a single article is the same partial.</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__header  u-url</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current_article</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h1</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h2</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>&quot;blog__title  p-name&quot;<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__date  dt-published</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datetime</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%B %d, %Y</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">unless</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current_article</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">partial</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article_tags</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">locals</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">partial</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article_series</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">locals</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>If appears on the <code>current_article</code>, it shows as an <code>&lt;h1&gt;</code> and hides some things. This helps me keep the look and feel consistent. All it needs is <code>article</code> passed into it on render:</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> partial &#39;article_header&#39;, locals: &lbrace; article: article &rbrace;<span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>In 11ty, it's not that simple. On its equivalent of <code>current_article</code>, I can't reach <code>article.date</code>, it's just <code>date</code>. The data structure on a paginated object (more on that later) is different than in a <code>for</code> loop. As a result, instead of passing in a single object to a partial, I have to pass in <em>every</em> attribute manually:</p>
<pre class="lumis"><code class="language-liquid" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">render</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;_article_header&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div></code></pre>
<p>There is an <a href="https://github.com/11ty/eleventy/issues/338">issue on github and discussion around</a> this… and it's entirely possible I'm doing encapsulation wrong… but it's annoying to me.</p>
<h3><a href="#collections-are-clever-but-naive" aria-hidden="true" class="anchor" id="collections-are-clever-but-naive"></a>Collections are clever, but naive</h3>
<p>11ty by default groups your content by the <code>tag</code> metadata into what it calls <a href="https://www.11ty.dev/docs/collections/">Collections</a>. This makes building and finding blog posts by <code>tag</code> very simple… unless you want to do something like say… <a href="https://evantravers.com/articles/tags/">list all your tags</a>.</p>
<p>This simple task is excruciatingly hard because <code>Collections</code> are the only way to group, list, or generate pages in 11ty. By default, it adds an <code>all</code> collection to represent all your content, so you can't just iterate over <code>Collections</code> to show your tags, even if you aren't doing anything else with them!</p>
<p>To show your tags you can iterate over all your collections, filter out <code>all</code> and any other custom collection you've made, then assign a variable to that <code>Collection</code> to iterate over it:</p>
<pre class="lumis"><code class="language-liquid" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>All Tags<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">collections</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">c</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;all&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="4">    &lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">assign</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagName</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/articles/tags/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagName</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h5</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagName</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h5</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">assign</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">collections</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagName</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endfor</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endfor</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&rbrace;</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
<p>Collections are designed to work together with Pagination… let's talk about that.</p>
<h3><a href="#pagination-needs-to-be-split" aria-hidden="true" class="anchor" id="pagination-needs-to-be-split"></a>Pagination needs to be split</h3>
<p>Pagination does a little bit more than splitting up a Collection into pages, it's also <em>the only way to <a href="https://www.11ty.dev/docs/pages-from-data/">generate pages from templates using your data</a></em>.</p>
<p>Because it is trying to do both things, it is not very flexible for generating content. It can't handle multidimensional data, or a permalink with more than one variable… say year and month.</p>
<p>I have spent hours trying to build a calendar system in 11ty collections with pagination, and I'm about at the end of my rope. I used a fancy reduce to create an object with years, months, and article objects:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eleventyConfig</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addCollection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`articles`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">collection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">collection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getFullYear</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getMonth</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padStart</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;0&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="9">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="13">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="16">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// initial value</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>This correctly generated a JS object as a Collection… I could print it out in JSON, I just couldn't paginate over it. I am sure there's a way, and I'm doing it wrong, but it seems like pagination is designed to iterate over a simple array of resources, writing permalinks based on a single attribute of the object. I couldn't make it generate the nested permalinks I needed.</p>
<p>I'm not <a href="https://www.webstoemp.com/blog/basic-custom-taxonomies-with-eleventy/">the first to joust with this problem</a>.</p>
<h2><a href="#-le-sigh-" aria-hidden="true" class="anchor" id="-le-sigh-"></a>* le sigh *</h2>
<p>I think that eleventy is a fantastic tool and I'm just the pickiest of customers<sup class="footnote-ref"><a href="#fn-pickiest" id="fnref-pickiest" data-footnote-ref>2</a></sup>… but man is this taking waaaay too long. If you are simply looking for a JS-based tool to build a simple blog or to transform a collection of data/files into web pages, it's a <em>great</em> tool. It seems like it is just not for me.</p>
<p>I am very excited about the possibility of having the content for my blog live in my <a href="https://evantravers.com/articles/series/creativity-systems/">Creativity System</a> as the final folder in a writing workflow… thoughts move from ideas to completion all in the same system… I just don't know what static site generator will best fit my rather ridiculous requirements.</p>
<p>I really don't want to write react in Gatsby. 🤦‍♂️</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-11ty">
<p>I chose 11ty based on some selfish criteria: I didn't want a SSG that used a compiled language, I wanted a lot of speed… and I didn't want it tied to popular front-end framework like React or Vue. That left 11ty. 🤷‍♂️ If I was going to work with other people or get paid for it, I'd probably choose Gatsby, but my command-line heart hates the filenames that the <a href="https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api/">File System Route API</a> requires. <a href="#fnref-11ty" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-pickiest">
<p>Don't believe me? Here's the todo list for migrating my blog:</p>
<h2><a href="#process" aria-hidden="true" class="anchor" id="process"></a>Process</h2>
<ul>
<li><input type="checkbox" checked="" disabled="" /> Develop Exfil Script for Middleman</li>
<li><input type="checkbox" disabled="" /> Implement Known Features</li>
<li><input type="checkbox" disabled="" /> Implement Middleman Features</li>
<li><input type="checkbox" disabled="" /> Find a way to check all URLs/perm-links?</li>
<li><input type="checkbox" disabled="" /> Rework the GitHub action?</li>
</ul>
<h2><a href="#custom-features" aria-hidden="true" class="anchor" id="custom-features"></a>Custom Features</h2>
<ul>
<li><input type="checkbox" disabled="" /> <code>article_image_url</code> that finds the first image in the blogpost</li>
<li><input type="checkbox" disabled="" /> Blog roll</li>
<li><input type="checkbox" disabled="" /> YouTube</li>
<li><input type="checkbox" disabled="" /> Series</li>
<li><input type="checkbox" disabled="" /> Git change log</li>
<li><input type="checkbox" disabled="" /> Middleman mentions?</li>
<li><input type="checkbox" disabled="" /> Essays vs. links RSS</li>
<li><input type="checkbox" disabled="" /> Image in frontmatter -&gt; blog template</li>
<li><input type="checkbox" disabled="" /> ???</li>
</ul>
<h2><a href="#middleman-features" aria-hidden="true" class="anchor" id="middleman-features"></a>Middleman Features</h2>
<ul>
<li><input type="checkbox" disabled="" /> Index.html.erb</li>
<li><input type="checkbox" disabled="" /> Calendar.html.erb</li>
<li><input type="checkbox" disabled="" /> Tags.html.erb</li>
<li><input type="checkbox" disabled="" /> </li>
<li><input type="checkbox" disabled="" /> Tags for blogs vs tags for collections?</li>
<li><input type="checkbox" disabled="" /> Markdown anchors on headers</li>
<li><input type="checkbox" disabled="" /> Markdown features?</li>
</ul>
<a href="#fnref-pickiest" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Review: Corne-ish Zen</title>
       <link>http://evantravers.com/articles/2022/04/19/review-corne-ish-zen/</link>
       <pubDate>Tue, 19 Apr 2022 09:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/19/review-corne-ish-zen/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/04/zen.jpg"></p><div class="admonition tldr">
<p>In December I received my Corne-ish Zen R2 from <a href="https://lowprokb.ca/">Darryl over at lowprokb.ca</a>. It's been my 100% daily driver since then, at my desktop, at coffee shops, and on the road. I am <em>thrilled</em> with it. Sadly there are no more Corne-ish Zens. Here are <a href="https://evantravers.com/articles/2024/03/22/alternatives-to-the-corne-ish-zen/">some alternatives</a>.</p>
</div>
<p>For a while now I've been rocking my <a href="https://evantravers.com/articles/2019/11/08/obsession-log-keyboards/#corne-lp-from-boardsource-xyz">Boardsource Corne LP</a> as my main board. Thanks to my Atreus, I had slowly realized that I wanted a <code>5x3_3</code> style board, and I happened to be on a community Slack with Darryl, who pointed me towards his project. I joined.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2022/04/zen-compared.jpg" >
  <figcaption>The 3x5_3 choc-spaced zen makes the already small 3x6_3 MX-spaced Boardsource Corne LP seem huge.</figcaption>
</figure>
<p>Some months later, and two days after the Zen arrived, the Boardsource Corne LP was sold on Mechmarket. I really haven't used any other keyboard since.</p>
<p>There are a lot of aspects to this particular board, so I'm going to be detailing them all. If you want to read <em>just</em> about the Zen in particular, you <a href="#the-zen">can jump ahead</a>.</p>
<h2><a href="#zmk-firmware" aria-hidden="true" class="anchor" id="zmk-firmware"></a>ZMK Firmware</h2>
<p>The first big change was switching from <a href="https://github.com/evantravers/qmk_firmware/blob/master/users/evantravers/wrappers.h">QMK</a> to <a href="https://github.com/evantravers/zmk-config/blob/master/config/corne-ish_zen.keymap">ZMK</a>. QMK's license is not compatible with Bluetooth, so off to ZMK-land we go!</p>
<p>It was relatively trivial to port my layout over to ZMK, and I have come to greatly prefer its simple config repos, Github build actions, and simple flashing.</p>
<p>In December, the only thing missing from my QMK layout when I ported it was tapdances. A couple weeks ago <a href="https://zmk.dev/docs/behaviors/tap-dance/">tapdance behavior was added to ZMK</a>, and I am now 100% content with the firmware. I wish I could move all my boards over… even if only for <a href="https://zmk.dev/docs/behaviors/caps-word">Caps Word</a> upon which I have become <em>hopelessly</em> dependent.</p>
<p>There are some zen-specific features that have not yet been merged into ZMK main so you do need to use a fork of the build actions. It's not hard, and the folks on Discord are lovely and helpful.</p>
<h3><a href="#bluetooth" aria-hidden="true" class="anchor" id="bluetooth"></a>Bluetooth</h3>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-coffee.jpg" alt="no wires means that the zen can go in tighter spots, like this narrow coffee table" /></p>
<p>Although arguably ZMK has a cleaner configuration and build steps… the true reason to switch is for wireless.</p>
<p>As I noted in <a href="https://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/">my mouse search</a>, I have been a snobby &quot;wired only please&quot; person because I didn't think the wireless latency was good enough… but honestly ZMK's latency over bluetooth is <em>unnoticeable</em> to me. <a href="https://www.youtube.com/watch?v=jWL4nU-vtWs">Nicell put together a very well researched video</a>, but as a very picky input-device user… I can tell you it's <em>good</em>.</p>
<p>The other cool feature that ZMK offers is pairing to multiple devices simultaneously. I can press a key and <a href="https://zmk.dev/docs/behaviors/bluetooth/">switch my keyboard between up to five devices</a>… letting me use one keyboard at my desk to text on my phone, discord on my ipad… or access either laptop or PC. It's really slick and clean.</p>
<p>(Side note: Keyboardio, please make a wireless ZMK Atreus. Thank you!)</p>
<h2><a href="#chicago-steno-caps" aria-hidden="true" class="anchor" id="chicago-steno-caps"></a>Chicago Steno Caps</h2>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-glamor.jpg" alt="zen glamor shot" /></p>
<p>In preparation for my &quot;end-game&quot;<sup class="footnote-ref"><a href="#fn-endgame" id="fnref-endgame" data-footnote-ref>1</a></sup> setup, I splurged on some ink-black custom caps from <a href="https://www.asymplex.xyz/product/cs-chicago-stenographer-profile">Asymplex: Chicago Steno</a>.</p>
<p>They have an unusual texture… it’s a smooth ceramic, so more like a nice coffee mug than anything else. They are much grabbier and scoopier than the XDA or MBK caps (wide and flat!) I had been using. While I do like the slight curve/bowl profile in the alphas, the highlight is the gentle swoop of the thumb keys. If you can afford them, I highly recommend them.</p>
<p>Another part of becoming accustomed to the caps was embracing the choc-spacing. The previous two choc boards (Kyria and Corne-LP) were MX spaced… but now there is no dead space between the choc-spaced caps. The reduction in finger travel is now worth the learning curve… but it took a day or so.</p>
<h2><a href="#switches" aria-hidden="true" class="anchor" id="switches"></a>Switches</h2>
<p>I'm using the same 20g gChocs I had on the Corne LP. I miss the tactile event of MX switches, but the light linears fit this tiny board.</p>
<h2><a href="#the-zen" aria-hidden="true" class="anchor" id="the-zen"></a>The Zen</h2>
<p>The Zen is a wireless hotswap choc-spaced <a href="https://github.com/foostan/crkbd">corne</a> style board. It's got a low-profile aluminum plate and chassis with a built in battery rechargeable through USB-C ports, and e-ink displays to tell you the battery life and current Bluetooth connection status. On-off switches and a reset button that also puts it into boot loader with a double press complete the svelte inventory.</p>
<p>The buyer could choose between a six-column and five-column corne layout, and there were a number of voted on color options available. I wanted mine to be all black, so that's what you see.</p>
<h3><a href="#in-the-box" aria-hidden="true" class="anchor" id="in-the-box"></a>In The Box</h3>
<p>Inside the box was a nice note from Darryl, his very cool PCB business card, some great sticker swag, and a slick black carrying case. The Zen halves were shipped in the case in microfiber carrying bags. As I love <a href="https://evantravers.com/articles/2020/09/14/hard-travel-case-for-corne-lp/">a good carrying case</a>… I was very happy.</p>
<p>(I was so excited, I didn't take <em>any</em> proper unboxing images. Sorry.)</p>
<p>Everything put together as instructed in Darryl's great documentation and videos. There was a slight issue with the first run where there was a missing hole for a switch leg (this has been fixed in future runs), but I just snipped off a leg and we were off to the (<a href="https://monkeytype.com/">monkeytype.com</a>) races.</p>
<h3><a href="#e-ink-displays" aria-hidden="true" class="anchor" id="e-ink-displays"></a>E-Ink Displays</h3>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-eink.jpg" alt="zen eink" /></p>
<p>The E-Ink Displays are… E-Ink, with all the good and bad. They show the current bluetooth status and connection, battery level, and layer.</p>
<p>The refresh rate of E-Ink is much too slow to catch-up to momentary layer switching, and the battery indicator is mostly inaccurate, and apparently the E-Ink booting slows the overall startup of the device a few seconds (will be patched out in the future), but the Bluetooth layer indicator has been helpful in helping me realize which device is receiving input.</p>
<h3><a href="#battery" aria-hidden="true" class="anchor" id="battery"></a>Battery</h3>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-charging.jpg" alt="charging the batteries" /></p>
<p>The Zen has a built in rechargable battery. In my (very unscientific) all-day usage tests it seems to last about eight to seventeen days on the default sleep settings. The LH manages the connection to the computer so it runs down a little faster. For most users could charge over weekends and never run out. Darryl does recommend running the battery all the way down to help the system learn the battery, so I tend to do that.</p>
<p>In my particular unit, the USB-C ports can be a little particular… they only like one orientation for charging. That's not a huge issue, I just have to pay attention to the charging light.</p>
<h3><a href="#build-quality" aria-hidden="true" class="anchor" id="build-quality"></a>Build Quality</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2022/04/zen-size.jpg" >
  <figcaption>It's seriously small.</figcaption>
</figure>
<p>It mostly just works, simple. The finicky USB-C ports aside, the build quality is excellent. There is no way I could ever fabricate something this high quality by myself. It is just that small. It's really the only way to have something this small and low-profile.</p>
<p>The on-off switch is useful for travel, but I rarely use it at home.</p>
<h3><a href="#darryl" aria-hidden="true" class="anchor" id="darryl"></a>Darryl</h3>
<p>Darryl and I have had some chances to chat on Slack and Discord, and I have only found him to be helpful. Group buys are hard at any time, but in the middle of COVID and turmoil they are extra hard. I'm super impressed with his communication and handling of issues. He found an issue with a diode that prevented USB-C -&gt; USB-C charging, documented it, reported it, and carefully fixed each and every device if we asked. Never had a better experience.</p>
<p>Honestly… worried that the amount of love and care that went into this is not reproducible… rest up Darryl! Round 3 is coming.</p>
<h3><a href="#how-about-using-it" aria-hidden="true" class="anchor" id="how-about-using-it"></a>How about using it?</h3>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-desk.jpg" alt="zen on the desk" /></p>
<p>It's great. I didn't realize how much cables get in the way until I didn't have to deal with them. On the desk the lack of USB or TRRS is clean, and I use them far apart but it especially shines when putting them on the laptop or in a confined space like a small coffeeshop table. Because there's no limit to how close or far apart they are, I often use them like an Atreus close together. Just being able to pull them out and start working is very freeing and makes me use them on the go more often.</p>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-laptop.jpg" alt="zen on the laptop" /></p>
<p>I've noticed a couple weird things when they aren't on flat surfaces that causes my RH copy to cut out, it seems to be a known. I think I could probably open them up and check the battery connection but it doesn't bug me that often. I may fool with it eventually, just because I would like to use them leaned up against my legs. (I would really like to figure out some way to mount them to my legs… but that's a project for another day.)</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p><img src="https://images.evantravers.com/articles/2022/04/zen-monkeytype.jpg" alt="ohenry's zen" /></p>
<p>It's awesome. It's my favorite of my many boards that I've ever had. As far as I know, it's the most luxurious <code>3x5_3</code> keyboard out there… and it deserves it. If you know you want the split low-profile corne-esque life and you want the smallest, fanciest one… this is it. Go get in line.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-endgame">
<p>There is no such thing as end-game... Darryl's custom tactile choc switches haven't shipped. :P (Thanks for the nudge Jesse!) <a href="#fnref-endgame" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>On Midnight Tinnitus</title>
       <link>http://evantravers.com/articles/2022/04/18/on-midnight-tinnitus/</link>
       <pubDate>Mon, 18 Apr 2022 10:28:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/18/on-midnight-tinnitus/</guid>
       <description><![CDATA[ <p>Last night I noticed a ringing in my left ear. Could be a new room, could be sinuses, could be all in my head.</p>
<p>Could be the first steps towards not hearing music, my wife's voice, the sound of wind.</p>
<p>Unsurprisingly and irrationally terrified. Idle thoughts of treatments, hearing aids, how long should I wait, how will this affect my favorite hobbies, can I craft an equalizer to compensate…</p>
<p>It's only been an hour.</p>
<p>O Lord. Forgive me for idolizing my earthly body. You have created so many lovely things to enjoy, but they will not satisfy because they are not you. Help me not to fear decay and age because everything I lose here I gain in Heaven. Help me to preach the last two sentences to my wavering heart <em>every</em> time I hear that ring. In Jesus' name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Git Jump to Vim Quickfix</title>
       <link>http://evantravers.com/articles/2022/04/14/git-jump-to-vim-quickfix/</link>
       <pubDate>Thu, 14 Apr 2022 16:20:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/04/14/git-jump-to-vim-quickfix/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>git ships with a <a href="https://github.com/git/git/tree/master/contrib/git-jump">script called git-jump</a> to populate vim's quickfix list with hunks or merge conflicts… without using any vim plugins at all.</p>
</div>
<p>My friend Seth and I were talking about the <a href="https://vimhelp.org/quickfix.txt.html">quickfix</a> list. My first introduction to the quickfix was back in school, working with compilers. It was my best friend then… make some changes, check the quick fix, clean it out, continue… it's the best!</p>
<p>Because I haven't been working with compiled languages in a long while I've been using quickfix for other things. For years, it's been my solution to the &quot;search and replace in project&quot; problem:</p>
<ol>
<li>Use <code>:grep</code> to populate the quickfix list with the locations of everything I want to change.</li>
<li><a href="https://evantravers.com/articles/2018/10/30/git-gud-at-vim-3-registers-and-macros/">Record a macro</a> that replaces this instance with the new one, and navigates to the next location (<code>:cn</code>) and calls itself.</li>
<li>Profit!</li>
</ol>
<p>Thanks to how awesome <code>:netrw</code> is, that even works over FTP or SSH.</p>
<p>While thinking of good reasons to use quickfix over the buffer list, I realized a couple of other neat tricks using some modern neovim tooling:</p>
<h2><a href="#telescope" aria-hidden="true" class="anchor" id="telescope"></a>Telescope</h2>
<p>I use <a href="https://github.com/nvim-telescope/telescope.nvim">telescope.nvim</a> pretty much everywhere now. By default, if you press <code>&lt;c-q&gt;</code> in a telescope view, it dumps the selection or marks into your quickfix. I'm using this with live grep often to do some spelunking on a particular variable.</p>
<h2><a href="#gitsigns" aria-hidden="true" class="anchor" id="gitsigns"></a>GitSigns</h2>
<p>Like <a href="https://github.com/airblade/vim-gitgutter">gitgutter</a> before it, <a href="https://github.com/lewis6991/gitsigns.nvim">gitsigns</a> has commands for dumping current hunks or conflict markers into quickfix. While I was researching this, I found yet another cool tool!</p>
<h2><a href="#git-jump" aria-hidden="true" class="anchor" id="git-jump"></a>git jump</h2>
<p>While research the git workflow (because we all spend time in merge conflicts!) I came across a script that ships with git-contrib: <a href="https://github.com/git/git/tree/master/contrib/git-jump">git-jump</a></p>
<p><code>git-jump</code> will work on <em>any</em> computer or server with vim and git (so, nearly all!?) There have been a few times working on a server or container that I really could have used this, so I'm excited to have this for the next time I'm working on a remote server or someone else's workstation.</p>
<p><a href="http://twitter.com/squarism">Chris Dillon</a> kindly pointed out a robust alias for git-jump so that you can use it as <code>git jump</code> in your .gitconfig:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">[alias]
</div><div class="line" data-line="2">  &quot;jump = &quot;!$(brew --prefix git)/share/git-core/contrib/git-jump/git-jump&quot;&quot;
</div></code></pre> ]]></description>
    </item>
    <item>
       <title>Bunch of URLs</title>
       <link>http://evantravers.com/articles/2022/03/11/bunch-of-urls/</link>
       <pubDate>Fri, 11 Mar 2022 07:34:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/03/11/bunch-of-urls/</guid>
       <description><![CDATA[ <p>While conducting a <a href="https://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/">weekly review</a>, I realized that a frequent step in my daily process was opening all the URLs associated with a project. Every file, JIRA ticket, Figma design, or wiki page has a URL.</p>
<p>I started putting all these links in a markdown list in the context section of the Things Project. For each context switch I would just click down the list:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Resources
</div><div class="line" data-line="2"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>https://fakejira.atlassian.net/wiki/spaces/UX/pages/12345/Fake+Project
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>https://fakejira.atlassian.net/wiki/spaces/UX/pages/12345/Fake+Project+Changelog
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>https://fakejira.atlassian.net/browse/DEV-13623
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>obsidian://open?vault=wiki&amp;file=career%2F07%20fake%2FFake%20Project
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>figma:///file/12345/Fake-Project+P?node-id=0%3A1
</div></code></pre>
<p>After doing this for a week, I decided to automate this. I wrote a JXA function to find Things projects with the string <code>## Resources</code> in the Notes field.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">divider</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">## Resources</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getUrls</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">divider</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">                 <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">divider</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="9">                 <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">divider</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">                 <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">                 <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">                 <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">status</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;open&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="23">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="24">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="25">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">area</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="26">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urls</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getUrls</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="27">        <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="29">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="30">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="31">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urls</span>
</div><div class="line" data-line="32">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="33">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="34"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>I wrapped this in a <a href="https://github.com/evantravers/hammerspoon-config/blob/e7ac424764c902cdb18c44946f7421c79856079a/init.lua#L225">hammerspoon function</a> that lets me choose a project and launch its URLs in one keystroke using <code>hs.chooser</code>.</p>
<p><img src="https://images.evantravers.com/articles/2022/03/chooser.png" alt="chooser" /></p>
<p>I <strong>love</strong> it. It immediately has become one of my favorite little hacks. Every time I need to do a demo, or start logging time, or make a small change my whole workspace is a click away.</p>
<p>You can do this any old way. If you are on a Mac, the best way is probably using <a href="https://bunchapp.co/">Bunch</a><sup class="footnote-ref"><a href="#fn-bunch" id="fnref-bunch" data-footnote-ref>1</a></sup>. The only reason I’m maintaining my particular hack is because it’s really nice to have the links co-located with their project in Things. <a href="https://hookproductivity.com/">Hook.app</a> is similarly great, if you can wrap your head around it. At least, keep a plaintext list of the URLs associated with a project and click on them manually… it is amazing how removing a little friction can help get into flow.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-bunch">
<p>Bunch is pure genius. I haven't spent the time in it that I should, but I'm pretty sure I could refactor my Headspace scripts to be a supplement to bunches and that'd be simpler. I still may do that. <a href="#fnref-bunch" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Notenik</title>
       <link>http://evantravers.com/articles/2022/02/28/notenik/</link>
       <pubDate>Mon, 28 Feb 2022 10:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/02/28/notenik/</guid>
       <description><![CDATA[ <p>I try different apps for markdown note-taking, and I recently tried <a href="https://notenik.app/">Notenik.app</a>. At the time, it didn't fit my needs, so I removed it from the list. The author noticed my <a href="https://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">git changelog</a> and sent me a kind email asking what I would change about it.</p>
<p>Since then Herb has made a number of changes to Notenik:</p>
<ul>
<li>Supports <code>#tag</code> style tags</li>
<li>Supports YAML style metadata</li>
<li>Creation of unlinked notes is now optional</li>
</ul>
<p>Notenik is a neat application. It seems very personal to the author, and very powerful… and is now fully compatible with the Simple Markdown Zettelkasten style that I like, so it's on <a href="/simple-markdown-zettelkasten#supported-tools">the list</a>! If you prefer a more GUI-centric app, with powerful metadata features, live preview, reports and more, give Notenik a try.</p>
<p>Thank you for your kindness and humility Herb. 🙏</p>
<p><a href="https://notenik.app/news/notenik-8.6.0-checklists-and-improved-title-as-heading-options.html">Notenik 8.6.0 Changelog</a></p> ]]></description>
    </item>
    <item>
       <title>Nudging Myself to Bless Others</title>
       <link>http://evantravers.com/articles/2022/02/15/nudging-myself-to-bless-others/</link>
       <pubDate>Tue, 15 Feb 2022 10:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/02/15/nudging-myself-to-bless-others/</guid>
       <description><![CDATA[ <p>Since dropping social networks to &quot;keep in touch,&quot; I've been musing on how to maintain precious connections without using tools that tend to use me. Jakob Greenfield posted a <a href="https://jakobgreenfeld.com/stay-in-touch">good summary and a cool solution using AirTable</a>:</p>
<blockquote>
<p>Staying in touch with people is one of these asymmetric habits that require little effort, time and resources but has an unlimited upside. It’s the easiest and most effective way to make your life more serendipitous.</p>
<p>[…]</p>
<p>Unfortunately, for most people (me included) this isn’t something that happens naturally.</p>
</blockquote>
<p>His solution is a <em>very</em> cool and mature version of what I have been doing… I have lists in my contacts, (which I manage with the excellent <a href="https://flexibits.com/cardhop">Cardhop</a> from Flexibits,) and repeating reminders in Things to periodically pick one from each list. The <a href="https://flexibits.com/blog/2022/02/fantastical-scheduling-arrives-with-version-3-6-openings-proposals-and-quarters/">new update to Fantastical</a> makes scheduling these even easier.</p>
<p>I really love the clever &quot;last contacted&quot; field… I may have to try something similar. I wonder if it could be hacked together with my existing system, just adding DataJar through Shortcuts… honestly though, I've been thinking of bringing my Contacts &quot;in-house&quot; into my Simple Markdown Zettelkasten. I've already written a script for to <a href="https://github.com/evantravers/apple-contacts-to-obsidian-crm">move contacts' notes out of the .vcf cards</a>, just need to commit and change all my automations.</p><p><a href="https://jakobgreenfeld.com/stay-in-touch" class="u-in-reply-to  is-reply">The simple system I’m using to stay in touch with hundreds of people - jakobgreenfeld.com</a></p> ]]></description>
    </item>
    <item>
       <title>Scams and Liars</title>
       <link>http://evantravers.com/articles/2022/02/08/scams-and-liars/</link>
       <pubDate>Tue, 08 Feb 2022 16:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/02/08/scams-and-liars/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I don't know what to think about NFTs.</p>
<p>People I really like and respect are enthusiastic about the whole crypto space including NFTs. People I really respect and like are dubious about NFTs extending to crypto. 🤷</p>
<p>The spicy mix of VC-driven businesses and <a href="https://www.theartnewspaper.com/2022/02/08/us-treasury-study-art-market-money-laundering-nfts">potentially crime-ridden money laundering</a> reminds me of this deep-cut talk from Jason Scott:</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/UTzQmhmgLC0"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>A rising tide lifts all ships… good or bad.</p> ]]></description>
    </item>
    <item>
       <title>Light/Dark Toggle for Neovim, Fish, and Kitty</title>
       <link>http://evantravers.com/articles/2022/02/08/light-dark-toggle-for-neovim-fish-and-kitty/</link>
       <pubDate>Tue, 08 Feb 2022 15:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/02/08/light-dark-toggle-for-neovim-fish-and-kitty/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2022/02/dark.png"></p><p>Several months ago <a href="https://twitter.com/elijahmanor">@elijahmanor</a> posted a <a href="https://elijahmanor.com/byte/switch-kitty-theme">great little tech tip on switching themes</a> in Kitty terminal. I had already <a href="https://evantravers.com/articles/2019/07/30/toggling-kitty-and-neovim-background-using-osx-s-dark-mode-setting/">built a version of this</a> for Kitty and ZSH, but never updated it for Fish. He and I were talking afterward on how cool it would be to have Kitty, Neovim, and Fish all follow the same theme… which I eventually implemented but never documented.</p>
<p>The light/dark mode toggle consists of:</p>
<ul>
<li>an environment variable to track the light/dark toggle</li>
<li>a Neovim theme that supports light and dark</li>
<li>a complementary light/dark theme for Kitty.</li>
<li>Fish functions to switch the themes.</li>
</ul>
<p>Let's dive in!</p>
<p>First: You need to tell Kitty to <a href="https://sw.kovidgoyal.net/kitty/remote-control/">accept commands from other scripts</a>:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">allow_remote_control yes
</div></code></pre>
<p>(<a href="https://github.com/evantravers/dotfiles/blob/96827cbf4ed064f0a95f1c76a118cc69caf0f317/kitty/.config/kitty/kitty.conf#L32">kitty.conf</a>)</p>
<p>A key part of my implementation was switching to <a href="https://github.com/mcchrish/zenbones.nvim/">Zenbones</a> as a Neovim theme. Years ago my friend Ben showed me his low-contrast, simple editor theme. He argued that not having the colors caused him to actually read the text rather than jump his eyes from keyword to keyword. I liked the idea, but never found a theme I liked more than my beloved Gruvbox.</p>
<p><img src="https://images.evantravers.com/articles/2022/02/light.png" alt="light theme" /></p>
<p>I have been on Zenbones for four months now and really love it. It also conveniently ships with theme files for <a href="https://github.com/mcchrish/zenbones.nvim/tree/main/extras/iterm">iTerm</a>, <a href="https://github.com/mcchrish/zenbones.nvim/tree/main/extras/kitty">Kitty</a>, and other tools. This means that all I had to write were the fish functions!</p>
<pre class="lumis"><code class="language-fish" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dark</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-d</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Set dark theme&quot;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-xU</span> theme <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;dark&quot;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kitty</span> @ set-colors <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-a</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~/.local/share/nvim/site/pack/paqs/start/zenbones.nvim/extras/kitty/zenbones_dark.conf&quot;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(<a href="https://github.com/evantravers/dotfiles/blob/96827cbf4ed064f0a95f1c76a118cc69caf0f317/fish/.config/fish/functions/dark.fish">dark.fish</a>)</p>
<p>All it does is set the env variable and tell Kitty to use the Kitty theme provided by Zenbones. There is an equivalent <a href="https://github.com/evantravers/dotfiles/blob/96827cbf4ed064f0a95f1c76a118cc69caf0f317/fish/.config/fish/functions/light.fish">light function</a>. I honestly have <strong>no</strong> clue why <code>set -xU</code> works here… it just does. When you run the function in any session, it exports and changes in every session and pane of Tmux. 🤷</p>
<p>Last Neovim's <code>init.lua</code> needs to listen to our new environment variable:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getenv</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;theme&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;light&#39;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">vim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">o</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">background</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;light&#39;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(<a href="https://github.com/evantravers/dotfiles/blob/96827cbf4ed064f0a95f1c76a118cc69caf0f317/nvim/.config/nvim/init.lua#L83-L8init.lua%5D(https://github.com/evantravers/dotfiles/blob/96827cbf4ed064f0a95f1c76a118cc69caf0f317/nvim/.config/nvim/init.lua#L83-L85)">init.lua</a>)</p>
<p>That's it! It's not smart enough to go update the light/dark status for all the Neovim sessions already open, but thanks to <a href="https://github.com/tpope/vim-unimpaired">vim-unimpaired</a> that's just a <code>yob</code><sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> away.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>If you use vim-unimpaired, <code>yob</code> toggles <code>:set background=dark/light</code> <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon Updates</title>
       <link>http://evantravers.com/articles/2022/02/08/hammerspoon-updates/</link>
       <pubDate>Tue, 08 Feb 2022 12:11:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/02/08/hammerspoon-updates/</guid>
       <description><![CDATA[ <p>I've been slowly rewriting many of the automations I've already featured on the <a href="https://evantravers.com/articles/tags/hammerspoon/">Hammerspoon tag</a>. Originally they were tightly coupled both to each other and to a complicated configuration table that ran my whole system. I've slowly detached them, transformed them into Spoons, implemented the <a href="https://github.com/Hammerspoon/hammerspoon/blob/master/SPOONS.md#hotkeys"><code>bindHotKeys</code> API</a>, and documented them. Now you can install them into your own configuration without adopting all of mine! 🙌</p>
<h2><a href="#hyper" aria-hidden="true" class="anchor" id="hyper"></a>Hyper</h2>
<p>Hyper has been drastically simplified. Realizing that it's basically a push-to-toggle <a href="https://www.hammerspoon.org/docs/hs.hotkey.modal"><code>hs.hotkey.modal</code></a>, I have rewritten it to overload <code>hs.hotkey.modal</code> with a couple additional features.</p>
<p>I chiefly use it to launch applications quickly from a single press, although I also use it to create &quot;universal&quot; local bindings inspired by <a href="https://thesweetsetup.com/oopsiethings-applescript-for-things-on-mac/">Shawn Blanc's OopsieThings</a>.</p>
<p>It is by far the fastest and simplest version of the Hyper Key setup that I've yet used, and I'm very happy with it.</p>
<p><a href="https://github.com/evantravers/Hyper.spoon">Hyper.spoon</a></p>
<h2><a href="#movewindow" aria-hidden="true" class="anchor" id="movewindow"></a>MoveWindow</h2>
<p>MoveWindow is the oldest lua that I've maintained, originally coming from my friend Tom. It's now idempotent of the other plugins, and fully documented. You can set different hotkeys, customize the layouts and grids, and use it in conjunction with Hyper.spoon.</p>
<p><a href="https://github.com/evantravers/MoveWindows.spoon">MoveWindow.spoon</a></p>
<h2><a href="#autolayout" aria-hidden="true" class="anchor" id="autolayout"></a>AutoLayout</h2>
<p>AutoLayout is the most recently abstracted, and probably the least stable. It merely maintains a stack of <code>hs.layout</code> tables that you can push and pop from to create modal layouts. This lets you set a default set of window layouts, move into a different mode, and return to your defaults.</p>
<p>I use it in <a href="https://github.com/evantravers/Headspace.spoon">Headspace.spoon</a> to enter and leave custom layouts like the ones I have for planning vs. review.</p>
<p>There's some speed issues and the <code>hs.window.watcher</code> needs to be refactored, but I'm happy with it at the moment.</p>
<p><a href="https://github.com/evantravers/AutoLayout.spoon">AutoLayout.spoon</a></p>
<p>All the spoons have their own repos now, and Github Actions auto build a .zip release on each tagged release, or you can submodule them into your configuration <a href="https://github.com/evantravers/hammerspoon-config/tree/master/Spoons">like I'm doing here</a>.</p>
<p>If you looked at my crazy configuration and wanted to give some of the functionality a try, but didn't want to use the whole thing… there's never been a better time to dive in. If you get stuck, shoot me a message and I'll be happy to help.</p> ]]></description>
    </item>
    <item>
       <title>Shortcuts and Focus Modes</title>
       <link>http://evantravers.com/articles/2022/01/26/shortcuts-and-focus-modes/</link>
       <pubDate>Wed, 26 Jan 2022 10:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/01/26/shortcuts-and-focus-modes/</guid>
       <description><![CDATA[ <p>After showing off my <a href="https://evantravers.com/articles/2022/01/12/ios-homescreen-2022/">current Homescreen setup</a> a couple folks sent me texts and emails asking for more detail.</p>
<h2><a href="#magic-phone" aria-hidden="true" class="anchor" id="magic-phone"></a>Magic Phone</h2>
<p>A quick recap of my use cases (that haven't changed since <a href="https://evantravers.com/articles/2019/06/03/minimal-ios-Homescreen-2019/">my first post</a>:)</p>
<p>Ideally I want a &quot;magic phone:&quot; I pick it up, I press one button that does the task I need, then I put the phone down. I am trying to minimize getting sucked into the engaging &quot;infinite pools&quot; of attention-draining apps (as useful as they are!)</p>
<p>At home I typically open my phone to answer one of two questions: &quot;what event is coming up next?&quot; and &quot;what do I have left to do in my day?&quot;</p>
<p>At work I'm answering the same questions, but it's more of a second screen to my work computer… unless I'm taking it along with an analog notebook on a focus session or meeting.</p>
<h2><a href="#my-setup" aria-hidden="true" class="anchor" id="my-setup"></a>My Setup</h2>
<p>Some hidden assumptions of my particular phone and usage:</p>
<ul>
<li>I don't have email on my phone.</li>
<li>I don't have games on my phone.</li>
<li>I've disabled nearly all Notification Badges, <a href="https://www.macrumors.com/2021/06/08/ios-15-disable-app-badges-rearrange-pages/">even in the App Library</a>.</li>
<li>I have carefully groomed all notifications to those that prompt useful action. No sales notifications, sales updates, social media likes. What's left: family messaging, event notifications, and task reminders.</li>
</ul>
<p>When I wake up I try to restrict my phone usage until I have finished &quot;first things first.&quot; As an ally I have a Focus Mode<sup class="footnote-ref"><a href="#fn-focus" id="fnref-focus" data-footnote-ref>1</a></sup> called <a href="https://evantravers.com/articles/2022/01/12/ios-Homescreen-2022/#morning">Morning</a>. Morning helps me stay focused on my quiet time and workout, and hides the other things that I don't need to be worrying about yet.</p>
<h3><a href="#launcher" aria-hidden="true" class="anchor" id="launcher"></a>Launcher</h3>
<p>After my morning routine I enter my normal day with my normal &quot;non-focus&quot; Homescreen<sup class="footnote-ref"><a href="#fn-widgets" id="fnref-widgets" data-footnote-ref>2</a></sup>. This Homescreen's major feature is a widget Shortcut<sup class="footnote-ref"><a href="#fn-shortcuts" id="fnref-shortcuts" data-footnote-ref>3</a></sup> launcher.</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2022/01/main.PNG" alt="Homescreen">
  <img src="https://images.evantravers.com/articles/2022/01/launcher.PNG" alt="launcher menu">
</figure>
<p>This shortcut<sup class="footnote-ref"><a href="#fn-shortcuts" id="fnref-shortcuts-2" data-footnote-ref>3</a></sup> is simple: You can organize shortcuts into folders since iOS14, so I have a collection of &quot;Spaces&quot; shortcuts and the launcher merely gets the list of Shortcuts from that folder and presents it.</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2022/01/spaces.PNG" alt="spaces">
  <img src="https://images.evantravers.com/articles/2022/01/headspaces.PNG" alt="launcher menu">
</figure>
<p>If I reorder the shortcuts in the folder or rename them… the launcher still works perfectly.</p>
<h3><a href="#shortcuts" aria-hidden="true" class="anchor" id="shortcuts"></a>Shortcuts</h3>
<p>Most of the Shortcuts<sup class="footnote-ref"><a href="#fn-shortcuts" id="fnref-shortcuts-3" data-footnote-ref>3</a></sup> in Spaces are pretty straightforward: launch an app with an action. A couple of them use <a href="https://datajar.app/">DataJar</a> to store and retrieve preferences. A good example is <a href="https://evantravers.com/articles/2020/11/06/one-button-workout-shortcut/#one-button">the Workout shortcut</a>, which answers the question &quot;what workout should I do today?&quot; without getting me distracted. One button.</p>
<p>Most of the &quot;Spaces&quot; in the launcher follow that same pattern: automating the little daily decisions so I can simply answer the question &quot;what am I doing today?&quot; Another similar one: Navigating.</p>
<p>Almost every time I get in my car:</p>
<ul>
<li>I go find Google Maps.</li>
<li>I type in my home address manually.</li>
<li>I start the Directions</li>
<li>I open Messages.</li>
<li>I type in a manually created text to my wife letting her know where I am and where I'm headed.</li>
</ul>
<p>So now I have <em>one button</em> that does all of this:</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2022/01/navigate.JPG" alt="navigate shortcut">
  <figcaption>
    <ol>
      <li>I select my own contact card. I have all my important locations as fields on my Contact Card.</li>
      <li>I present a menu to choose from the names of the Street Addresses.</li>
      <li>I open Google Maps from my Current Location to the Chosen Item</li>
      <li>I can start the Driving Directions.</li>
      <li>I present an alert "Notify Your Wife?"</li>
      <li>If I choose "Yes," it sends a preformatted text to Sarah letting her know how long it'll take me to arrive and where I'm headed.</li>
    </ol>
  </figcaption>
</figure>
<p>This is the &quot;Magic Button&quot; at its best: <mark>One button, and I can put my phone down</mark>.</p>
<p>For the odd moments where I find myself doing some day-job work away from my desk I have a Shortcut for tracking time:</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2022/01/shortcut_deep.JPG" alt="deep shortcuts">
  <figcaption>
    <ol>
      <li>I prompt for "intention," much like <a href="https://evantravers.com/articles/series/hammerspoon-headspace/">my Headspace script</a> on Mac.</li>
      <li>I start a Timery Timer on a Project labeled Deep using my input.</li>
      <li>I start the Deep Focus Mode[^focus]</li>
      <li>I list out the work days:</li>
      <li>If the current day is a workday: Open Things to my Anytime list filtered to work, else just open to my Anytime list unfiltered (weekend tasks!)</li>
    </ol>
  </figcaption>
</figure>
<p>Once again… taking the small thoughts and actions out of the picture so that I can just <em>act</em>.</p>
<h3><a href="#layout-brings-consistency" aria-hidden="true" class="anchor" id="layout-brings-consistency"></a>Layout brings consistency</h3>
<p>I prefer using the main launcher on the Homescreen because that means that I can &quot;change&quot; the UI in different Focus Modes<sup class="footnote-ref"><a href="#fn-focus" id="fnref-focus-2" data-footnote-ref>1</a></sup> by changing Homescreens. For instance, I have a &quot;Deep&quot; mode and the only thing I want to do in that mode is focus… I don't need to see the list of things I can do, just how much time do I have and what am I supposed to be doing.</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2022/01/main.PNG" alt="Homescreen">
  <img src="https://images.evantravers.com/articles/2022/01/deep.PNG" alt="deep">
</figure>
<h2><a href="#do-or-do-not" aria-hidden="true" class="anchor" id="do-or-do-not"></a>Do, or do not.</h2>
<p>These techniques are just tools. If you subscribe to my objective: minimizing phone usage while still getting the benefits of a supercomputer in your pocket, they could be beneficial to you, but you shouldn't copy me outright.</p>
<p>Take some time to reflect on the major tasks and questions you have when you grab your phone. <strong>Not</strong> what app you are using, but what do you want to <em>do</em>. Then see if there are some ways to cut some steps out of what you currently do. This is <a href="https://evantravers.com/articles/2021/02/23/automate-your-user-experience/">automating your user experience</a>.</p>
<p>A lot of this stuff is overkill for most iPhone users. I wager that most users will get the most benefit out of simply auditing their notifications. By reducing the noise of all the &quot;new update!&quot; or &quot;play my game!&quot; spam, they could start using their phone as a tool. For years I treated my phone as a pet to be soothed every time it buzzed, carefully grooming the angry red circles off its Homescreens to keep it happy and well fed with attention.</p>
<p>Now it's a meaningful tool that serves me. I am not going back.</p>
<p>I like widgets with big information panels that answer my questions:</p>
<ul>
<li><a href="https://flexibits.com/fantastical">Fantastical</a> (What is coming up?)</li>
<li><a href="https://culturedcode.com/things/">Things</a> (What should I do?)</li>
<li><a href="https://streaksapp.com/">Streaks</a> (What habits am I working on?)</li>
<li><a href="https://overcast.fm/">Overcast</a> (What am I listening to? 🤓)</li>
</ul>
<p><a href="https://www.macrumors.com/how-to/use-widgets-iphone/">iOS 15: How to Use Home Screen Widgets - macrumors</a></p>
<p>Focus Modes give some useful tools:</p>
<ul>
<li>enter Focus Modes manually or <a href="https://www.macrumors.com/how-to/schedule-focus-modes/">Shortcuts, or Personal Automations</a></li>
<li>set Custom Homescreens for each Focus Mode (except Driving).</li>
<li>trigger Shortcuts through Personal Automations when entering and leaving Focus Modes.</li>
</ul>
<p><a href="https://www.macrumors.com/how-to/ios-create-focus/">iOS 15: How to Create a Focus - macrumors</a></p>
<p><a href="https://thesweetsetup.com/ios-shortcuts-guide/">iOS Shortcuts: The Ultimate Guide for Resources, Examples, Libraries, Triggers, and More - thesweetsetup</a></p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-focus">
<p>Focus Modes are an extension of the existing Do Not Disturb. A Focus Mode by default blocks all app notifications and contacts <em>except</em> what you specifically choose. <a href="#fnref-focus" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a> <a href="#fnref-focus-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1-2" aria-label="Back to reference 1-2">↩<sup class="footnote-ref">2</sup></a></p>
</li>
<li id="fn-widgets">
<p>The longer I use my phone to accomplish a task, the more likely I'm going to use my phone mindlessly for a looong time. iOS Widgets help me accomplish my goal: getting what I need out of my phone without having to dive through applications with the possibility of being distracted. <a href="#fnref-widgets" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-shortcuts">
<p>Shortcuts is Apple's approved cross-platform automation system for iOS. By using Shortcuts actions I can access an application's functionality without having to go digging for it through my folders and in the application. <a href="#fnref-shortcuts" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a> <a href="#fnref-shortcuts-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3-2" aria-label="Back to reference 3-2">↩<sup class="footnote-ref">2</sup></a> <a href="#fnref-shortcuts-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3-3" aria-label="Back to reference 3-3">↩<sup class="footnote-ref">3</sup></a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The underdark of deepwork</title>
       <link>http://evantravers.com/articles/2022/01/20/the-underdark-of-deepwork/</link>
       <pubDate>Thu, 20 Jan 2022 20:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/01/20/the-underdark-of-deepwork/</guid>
       <description><![CDATA[ <blockquote>
<p>When an estimated 70% of job applications are automatically rejected by applicant tracking systems (ATS) and companies are screening out applicants based on their social media habits, it can seem like technology is up against you.</p>
</blockquote>
<p><a href="https://pudding.cool">Pudding.cool</a> has been <a href="https://evantravers.com/blogroll/">one of my favorite blogs</a> for a while… but <a href="https://pudding.cool/2022/01/deepwork/">deepwork</a> is painfully perfect with horrific truthisms like:</p>
<blockquote>
<p>The best way to showcase your suitability for a higher-ranking position is via an elaborate mating ritual known as Thought Leadership.</p>
</blockquote>
<p>I'm not going to spoil it for you. Just click through and enjoy… or cringe.</p><p><a href="https://pudding.cool/2022/01/deepwork/" class="u-in-reply-to  is-reply">deepwork - pudding.cool</a></p> ]]></description>
    </item>
    <item>
       <title>iOS Homescreen 2022</title>
       <link>http://evantravers.com/articles/2022/01/12/ios-homescreen-2022/</link>
       <pubDate>Wed, 12 Jan 2022 15:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/01/12/ios-homescreen-2022/</guid>
       <description><![CDATA[ <p>It's been a few years since I talked about my home screen. A lot has changed <a href="/articles/2019/06/03/minimal-ios-homescreen-2019/">since 2019</a> in both my working systems and in the iOS ecosystem.</p>
<p>As with all systems my home screen is always in flux, but there are a few major changes that have been very beneficial:</p>
<h2><a href="#disabled-badges" aria-hidden="true" class="anchor" id="disabled-badges"></a>Disabled Badges</h2>
<p>Badges are the red dots that let you know that you should open an app to see notifications. I have disabled all badges except Messages and Phone.</p>
<p>I had to do this in stages…</p>
<ol>
<li>Pruned my notifications so that only critical apps send me notifications.</li>
<li>Moved everything to the App Library.</li>
<li>Disabled all badges in the App Library.</li>
</ol>
<p>I have also pretty much deleted all email and work messaging off my phone… trying to keep the notifications and messages that reach my pocket to be ones that bring joy and value.</p>
<h2><a href="#widgets-home-screen" aria-hidden="true" class="anchor" id="widgets-home-screen"></a>Widgets Home Screen</h2>
<p>One of the big two changes in the iOS ecosystem since my last post is the addition of Homescreen Widgets. I have since covered my whole home screen with widgets.<sup class="footnote-ref"><a href="#fn-dark" id="fnref-dark" data-footnote-ref>1</a></sup> The three main Widgets answer the biggest questions that prompt me to open my phone:</p>
<p><img src="https://images.evantravers.com/articles/2022/01/main.PNG" alt="main home screen" /></p>
<ul>
<li>What event is next? (<a href="/articles/tags/things-app/">Things</a>)</li>
<li>What do I have left to do today? (<a href="/articles/2019/11/18/more-fantastical-2-tips-and-tricks/">Fantastical</a>)</li>
<li>Have I done my habits? (<a href="/articles/2021/03/24/building-habits-with-streaks-ios/">Streaks</a>)</li>
<li>What podcast was I just listening to… 😅 (<a href="https://overcast.fm/">Overcast</a>)</li>
</ul>
<p>There is only one Home Screen, and both of the bottom widgets are Widget Stacks: the left one is <a href="/articles/2021/03/24/building-habits-with-streaks-ios/">Streaks</a> and Overcast.fm, and the right is two different Shortcut launchers…</p>
<p>The dock is mostly the same: Phone, <a href="/articles/tags/drafts-app/">Drafts</a>, and Messages.</p>
<h2><a href="#shortcuts-launchers" aria-hidden="true" class="anchor" id="shortcuts-launchers"></a>Shortcuts Launchers</h2>
<p>I moved from using Launch Center Pro as my main access to the phone to using a Shortcuts menu. The shortcut just shows a menu of any Shortcuts that are found in a folder in Shortcuts, and represent the main things that I do on my phone.</p>
<p><img src="https://images.evantravers.com/articles/2022/01/launcher.PNG" alt="main home screen" /></p>
<p>I have two launchers, one for <a href="/articles/series/hammerspoon-headspace/">HeadSpace-style</a> &quot;contextual computing&quot; prompts, and the secondary ones for random scripts and automations like <a href="/articles/2020/11/07/day-of-automation/">logging my weight</a>.</p>
<p>I see a lot of people online using this technique as a launcher in their Dock. I like using this big Shortcut under my thumb because of the huge hit box… and you can't customize the Dock, but you <em>can</em> customize Home Screens per Focus Mode. More on that…</p>
<h2><a href="#focus-modes" aria-hidden="true" class="anchor" id="focus-modes"></a>Focus Modes</h2>
<p>Because Focus Modes can switch to custom Home Screens per Focus Mode, I can use that large Launcher area as a &quot;primary action&quot; for whatever Focus Mode that I'm in.</p>
<p>I am still exploring Focus Modes. At the moment, I have two:</p>
<h3><a href="#morning" aria-hidden="true" class="anchor" id="morning"></a>Morning</h3>
<p>Morning starts automatically between my alarm going off at 6a and 8:30a when my &quot;morning&quot; ends and I start moving into a work mode.</p>
<p><img src="https://images.evantravers.com/articles/2022/01/morning.PNG" alt="main home screen" /></p>
<p>During the morning I'm trying to do my morning routine: quiet-time, workout, all before getting distracted by the needs of the day. My Morning Focus Mode merely highlights my habit trackers (Streaks and FitBod) and shows me Overcast's medium widget for quickly getting into a podcast during a workout.</p>
<p>The main value is hiding the agenda for the day until after I've taken care of First Things First.</p>
<h3><a href="#deep" aria-hidden="true" class="anchor" id="deep"></a>Deep</h3>
<p>&quot;Deep&quot; is hold-all state for any <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work</a> style activities. If I'm in a &quot;Deep Work&quot; state, I have chosen my desired task, it's time to execute without distraction.</p>
<p><img src="https://images.evantravers.com/articles/2022/01/deep.PNG" alt="main home screen" /></p>
<p>Focus is weird on an iOS device. As an overall ecosystem, Deep mutes nearly <em>every</em> notification, pretty much only my wife gets through. This alone is a great feature. There are times that I am out and about with only my notebook and an iOS device, and here the Deep Home Screen just highlights:</p>
<ul>
<li><a href="https://flexibits.com/fantastical">Fantastical</a>: how much time I have left in <a href="/articles/2020/05/09/creating-a-focus-budget/">this focus block</a>.</li>
<li><a href="https://timeryapp.com/">Timery</a>: how much time I've spent, what is the intent I set when I set the timer.</li>
<li>White Noise via <a href="https://darknoise.app/">Dark Noise</a>. If I'm just on my phone, there's frequently distractions around. This helps.</li>
<li>The launcher changes to a Shortcut for Leaving Deep-Focus.</li>
</ul>
<p>I really like the &quot;primary action&quot; changing…  I shouldn't be doing anything else but what I am focusing on the main task I have chosen. I like that I have to make choice to leave in order to &quot;use my phone&quot; again.</p>
<p>I can access it from my main Shortcuts Launcher, but it's also triggered by other automation like my <a href="/articles/series/hammerspoon-headspace/">HeadSpace</a> spaces. If I start a Focused Session by launching Deep, Hammerspoon runs a Shortcut on my mac that starts the Focus Mode, changing all my Mac and iOS devices:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=anytime&amp;filter=@Meazure%20Learning,$High&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">shortcuts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Deep Focus&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/447efbe9075da4977872a44baf4f21a7b6d640a0/spaces/deep.lua#L14">deep.lua</a>)</p>
<h2><a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"></a>What's Next</h2>
<p>This has stayed pretty stable for a few months. Now experiencing my phone without notifications, I will <em>not</em> go back. I love the &quot;modal&quot; Focus Modes that help me choose a state of being. I still love using Shortcuts to &quot;Do a Thing&quot; without &quot;Opening an App&quot;.</p>
<p>The goal is using my phone less and loving on my family more. I think that these strategies and designs help me do that.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-dark">
<p>I also love that all my widgets now respect the Pure Dark theme... so they just disappear into my black wallpaper. <a href="#fnref-dark" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Analog Inception</title>
       <link>http://evantravers.com/articles/2022/01/06/analog-inception/</link>
       <pubDate>Thu, 06 Jan 2022 16:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/01/06/analog-inception/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I've been staring at this video all day since my friend Greg shared it with me:</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/X_8kdGij6oY"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>It's a fascinating piece of engineering. What's still more interesting to me is that the cams and shafts that press the digital buttons and thumbsticks on the modern game controller evoke the century-old wires and pulleys that move the control surfaces of the aircraft simulated in the virtual environment. A 3D-printed analog contraption contorting a mass-produced digital controller driving an immersive 3D simulation of a <a href="https://en.wikipedia.org/wiki/De_Havilland_Canada_DHC-2_Beaver">74-year old analog aircraft</a>…</p>
<p>Once again: it's Neal Stephenson's world, we just live in it.</p> ]]></description>
    </item>
    <item>
       <title>2021</title>
       <link>http://evantravers.com/articles/2022/01/04/review-2021/</link>
       <pubDate>Tue, 04 Jan 2022 14:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2022/01/04/review-2021/</guid>
       <description><![CDATA[ <p>I'm still in the throes of reviewing 2021 and planning 2022. When I started to think about this year, my first reaction was that nothing at all happened… and as I started to go through my photos and journals I discovered that nothing was further from the truth.</p>
<p>My <a href="https://www.themesystem.com/">theme</a> for 2021 was &quot;Heads Up,&quot; a reminder to take my head out of my little world and look at the future, my family, and my surroundings. I think that reflecting on this helped me in the year, although I want to find a better way to put the theme in front of me in the new year. (Probably on the weekly review template in Obsidian.)</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>This year I wrote <a href="https://evantravers.com/articles/2021/">50 blog posts</a>, less than last year. I got stuck trying to express my ideas for the <a href="/articles/series/creativity-systems/">Creativity System</a> for a bit too long, I wanted it to be perfect and as a result it took <em>forever</em>. I definitely wrote a <em>ton</em> across the board. I have too many journals, newsletters, and channels to express myself in, so it's hard to tell how much output I'm creating.</p>
<p>According to a random github stats tool I found:</p>
<ul>
<li>📬 Commits/Issues/PRs: 860</li>
<li>🏝️ Repos contributed to: 9</li>
<li>⭐ New stars: 52</li>
<li>🔥 Hottest: <a href="https://github.com/evantravers/hammerspoon-config">evantravers/hammerspoon-config</a> (+24)</li>
</ul>
<p>This seems to be about the same amount of commits as last year. I guess that has stabilized? Weird.</p>
<p>When I set up cloudflare to get HTTPS, I did get some loose analytics… and I am <em>blown</em> away by how many people visit the site.</p>
<p><img src="https://images.evantravers.com/articles/2022/01/cloudflare.png" alt="cloudflare" /></p>
<p>I have <em>no</em> idea how accurate this is, but it is very humbling. Thank you so much! There's a lot of you writing me and talking about <a href="/simple-markdown-zettelkasten">Simple Markdown Zettelkasten</a>, which is very cool.</p>
<h2><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h2>
<p>This year I read 15 books, up two from last year. I still definitely lost a lot of time that could have been book time to video games and other distractions, something I'm planning on taking steps to prevent in 2022.</p>
<p>When I look back at my years, books I read have an outsized importance and impact on my life. <a href="/articles/2021/07/28/hamilton-is-an-obnoxious-aggressive/">Radical Candor</a> and <a href="/articles/2021/08/19/review-gentle-and-lowly-by-dane-c-ortlund/">Gentle and Lowly</a> have filled my conversation and writing for the year… I could only benefit from reading more.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p><img src="https://images.evantravers.com/articles/2022/01/strava.JPG" alt="strava stats" /></p>
<p>I feel like I've built some good habits on the working out front… and while it wasn't an area of focus for the year, I think I stayed on top of it.</p>
<p>My statistics on Strava are nearly identical to <a href="/articles/2020/12/23/2020/#health">last year</a>. I don't feel like I have grown much in an area good or bad. I did run a lot farther this year than I ever had, on one day I ran a couple km short of a half marathon, and I competed in a <em>very</em> hilly 8k.</p>
<p>I also got to participate in an difficult event that I had participated in over five years ago, and my overall conditioning and strength was vastly different than where I was back then.</p>
<h2><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h2>
<p>Work has been a blessing. Still working from home… great team, useful projects, lots of support. Pretty proud of the work my team is doing. It's easy to get excited about helping people achieve their goals for their lives.</p>
<p>This year I've been tracking my time pretty much 100% of the year.</p>
<p>I'm happy to see that Deep Work time (dark blue) has gone up in percentage since the last report. Before you knock me on Play, that includes time with my kids, dotfiles, and blogging. Just rest time in the day.</p>
<p>After reading <a href="/articles/2021/05/29/review-12-week-year/">12 Week Year</a> this year, I've had a better engine for celebrating, reflecting, and accomplishing work this year. I think a lot of the progress in my home and work has been due to the principles in this book. (More cause to do more reading!)</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>This is an area where I am deeply dissatisfied with my current progress. God graciously revealed a lot of areas that I needed to grow in at the beginning of 2021, and I <em>have</em> made progress in them. However, I find myself phoning-in my quiet time, and I don't find things of a spiritual nature flowing off my tongue and rolling around my mind… just fear, consumerism, my selfish plans.</p>
<p>Judging my heart by the output of my hands… I need dwell on and read more uplifting, godly words.</p>
<p>Planning on changing that in 2022.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>Last year I reflected that while my personal relationships were great, I wasn't prioritizing and honoring my wife. So we changed that this past year. We found a good babysitter, and went on a date nearly every two weeks with only a few exceptions. I also have started taking my daughter on daddy-daughter dates once a month, which has been really fun.</p>
<p>I'm still pretty happy to be off social media, although I am dabbling in twitter again because that's where the UX folk hang.</p>
<p>One interesting aspect of investing in smaller communities (emails, discords, slacks, etc.) is that I've set up a <em>bunch</em> more video calls with folks. Rather than going back and forth on twitter, just called them up. Some really neat conversations and friendships have emerged from that… many of which among the greatest encouragements of the year. If you and I have talked this year, thank you! Let's visit again.</p>
<h2><a href="#2022" aria-hidden="true" class="anchor" id="2022"></a>2022</h2>
<p>Much of my gameplan for this year is cutting out some of my unhealthy rest habits (I'm calling it &quot;lonescreening:&quot; any time I'm introverting into a screen while stressed) and focusing on the meaningful activities that build memories and family.</p>
<p>I also want to make this the year that I bring my diet into a self-controlled and intentional state. I did this in 2020, and saw the benefits, now I just need to rekindle that.</p>
<p>I'm still in the middle of working through <a href="/articles/2020/12/28/plan-your-year/">Plan Your Year</a> with my wife, but I'm pretty sure that my theme for 2022 will be &quot;Follow Hard.&quot; I need the reminder that on a daily basis I am to follow Christ… just a little further, a little step. Not achieve perfection, but to make progress. I added the hard to remind me that it should be an exertion, an effort.</p>
<p>Pretty familiar story, eh? Read more, rest more, love on my family more, eat responsibly, and follow the Lord. Pretty much the same as every year.</p> ]]></description>
    </item>
    <item>
       <title>Looking for a Serious-Use Travel Mouse</title>
       <link>http://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/</link>
       <pubDate>Thu, 02 Dec 2021 13:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/12/02/looking-for-a-serious-use-travel-mouse/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>I've been looking for a high-quality wireless mouse that supports USB-C: I found it in the <a href="#steelseries-prime-mini">Steelseries Prime Mini</a>.</p>
</div>
<p>For years, I have been using gaming mice for code and design. I used MX501 for a <em>long</em> time, then a steady series of Razers… currently a Razer Deathadder. I'm just used to the feel, the speed, the quality. I can't use the bars of soap that the fruit company calls magic<sup class="footnote-ref"><a href="#fn-magic" id="fnref-magic" data-footnote-ref>1</a></sup>.</p>
<p>As Mac has slowly moved to USB-C… so have I. I have tried to keep an eye on mice that support USB-C, and thought I'd take another look.</p>
<p>Earlier in the year, I had picked up the latest Logitech MX Master 3. I did not like it. It didn't fit how I hold mice, I don't use 60% of the buttons and features, and it felt <em>very</em> laggy.</p>
<p>We are considering doing some traveling, so more coffee shop work could be a possibility. I want something USB-C, travel friendly, and fast. I don't like the lag I've seen in previous wireless mice.</p>
<p>The last good travel mouse that I ever had was the first version Razer Orochi. It supported both wired and bluetooth, used AA batteries, and was my weapon of choice for a long time.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2021/12/size_comparison.jpeg">
  <figcaption>Orochi V1, G Pro Superlight, Prime Mini</figcaption>
</figure>
<p>Look how small the Orochi is!</p>
<p>What I'm looking for:</p>
<ul>
<li>OSX-friendly<sup class="footnote-ref"><a href="#fn-osx" id="fnref-osx" data-footnote-ref>2</a></sup></li>
<li>USB-C</li>
<li>low lag</li>
<li>wireless, but supporting wired for charging and use</li>
<li>not loud… no garish gaming logos and light effects</li>
<li>travel friendly: small, onboard battery preferred</li>
</ul>
<p>For the purposes of this search, I'm not going to try and evaluate:</p>
<ul>
<li>ergonomics</li>
<li>tracking on weird surfaces. I bring a small mouse pad.</li>
<li>how delightfully clicky are the buttons (so clicky!)</li>
<li>build quality</li>
<li>customer support</li>
</ul>
<p>This is also not one of my long-use reviews… yet. I'm making a purchase decision and returning the others. I put in an order for three options, and have spent the last day evaluating the following:</p>
<h2><a href="#razer-orochi-v2" aria-hidden="true" class="anchor" id="razer-orochi-v2"></a>Razer Orochi V2</h2>
<p>(<a href="https://www.razer.com/gaming/mice/razer-orochi-v2">official link</a>, $69.99 MSRP)</p>
<p><img src="https://images.evantravers.com/articles/2021/12/orochi.jpeg" alt="orochi" /></p>
<p>Because of my long fondness for the first version and the fact that my Deathadder has been so successful on OSX, this was the first one that I reached for. Of the three, this is the one that is billed as a &quot;travel mouse.&quot;</p>
<p>The Orochi v2 is also the only one of the three that supports wireless without a dongle through bluetooth, just like the first version. The Orochi v2 does <em>not</em> support any wired mode.</p>
<p>The Orochi v2 is significantly bigger than the v1, and a touch smaller than the other two mice. It has that familiar Razer grip.</p>
<p>You have to download Razer Synapse to get the mouse speed up to my customary speeds. The default three settings weren't fast enough. I'd tell you how it went, but Synapse doesn't work after OSX Mojave. 👎 Fail.</p>
<p>I don't like that it requires batteries… nothing else in my bag does. It's nice that you have the choice of using either AA or AAA, but it's a dealbreaker for me. I want my <a href="https://evantravers.com/articles/2018/12/10/whats-in-my-bag/#goruck-wire-dopp">wire dopp</a> to just have some USB-C cables, a power brick, and go.</p>
<h2><a href="#logitech-g-pro-superlight" aria-hidden="true" class="anchor" id="logitech-g-pro-superlight"></a>Logitech G Pro Superlight</h2>
<p>(<a href="https://www.logitechg.com/en-us/products/gaming-mice/pro-x-superlight-wireless-mouse.910-005878.html">official link</a>, $149.99 MSRP)</p>
<p><img src="https://images.evantravers.com/articles/2021/12/gpro.jpeg" alt="g pro" /></p>
<p>Immediately after taking this one out of the box I gasped. It's <em>really</em> light.</p>
<p>It fails my USB-C requirement… twice. It has a trim little USB-A dongle, and it's charging port has a custom fitted USB-micro cable. It's not a bad mouse cable, but it's stiff and not as nice as the one with the Prime.</p>
<p>The USB-A dongle does have the neat feature of being stowable inside the mouse's shell for travel… but I'll need to carry an adapter anyway which kind of ruins it for me.</p>
<p>I put it on the list because I saw a lot of people using it online, and was curious how a wireless mouse held up in terms of responsiveness and latency. Of the three I tested, it has the most options and the highest DPI/CPI, but there's a catch:</p>
<p>There's no onboard DPI/polling controls! Out of the box, it's set to the lowest setting, a paiiiinful crawl. You have to install Logitech's <a href="https://www.logitechg.com/en-us/innovation/g-hub.html">G Hub</a> software (<code>brew install logitech-g-hub</code>) which is powerful and works on Mac, but I just need a mouse, not separate sniping macros for each game. G Hub wanted me to do a firmware update on both the mouse and the dongle as soon as it booted, which required me finding two USB-A adapters because they have to both be connected to update.</p>
<p>While it took overly long to setup (made <em>painful</em> by the default sloooooow settings) once connected the mouse is fast and responsive. I had no clue that a wireless mouse could feel so fast. I am really impressed, but in order to use this mouse on the road, I have to keep track of a couple custom cables <em>just</em> for the G Pro. Not ideal.</p>
<h2><a href="#steelseries-prime-mini" aria-hidden="true" class="anchor" id="steelseries-prime-mini"></a>Steelseries Prime Mini</h2>
<p>(<a href="https://steelseries.com/gaming-mice/prime-mini-wireless">official link</a>, $59.99 MSRP)</p>
<p><img src="https://images.evantravers.com/articles/2021/12/prime.jpeg" alt="prime" /></p>
<p>I am a little surprised how much I liked this mouse. I had two Steelseries mice in the past, the Xai and the Sensei. Both had <em>very</em> strange tracking issues I was never able to nail down. It could have to do with my lack of knowledge on polling and such, but it was frustrating.</p>
<p>The Steelseries Prime Mini is the first USB-C only gaming mouse that I have yet found. It's <em>very</em> right-handed, so lefties beware. It's a touch heavier than the ridiculously light G Pro, but not overwhelmingly. Like the G Pro, I was impressed with it's wireless latency… it feels as fast as a wired mouse.</p>
<p>The included dongle for the connection is USB-C! It's fat though… but will barely permit both the default Mac charging USB-C cable and the old Earpods TRRS. It doesn't store in the body like the G Pro, so don't lose it<sup class="footnote-ref"><a href="#fn-dongle" id="fnref-dongle" data-footnote-ref>3</a></sup>.</p>
<p><img src="https://images.evantravers.com/articles/2021/12/prime_dongle.jpeg" alt="dongle" /></p>
<p>More importantly, the port on the front of the mouse is also USB-C, and seems to work fine with the number of USB-C cables I have lying around. They have provided a USB-C -&gt; USB-A cable with it, it's paracord wrapped, very light and indistinguishable from a normal wired mouse. It's as nice or nicer than the fixed cable I've got with my Deathadder. It actually feels as light as the one on my friend's Glorious Model O.</p>
<p>I appreciate that the Prime Mini <em>requires no software to update or maintain</em>, there's a hardware DPI/polling button on the bottom. There is <a href="https://steelseries.com/engine/">Steelseries GG</a>, which does work on the mac and supports even higher DPI/CPI settings. Didn't need it anyway, the external button was enough.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>For me, the Steelseries Prime Mini wins hands down. Because of my travel objectives, the fact that it uses the same cables as my keyboards, iPads, and computer charging makes it an easy choice to grab on my way to a coffeeshop. I like that I could use it wired on my standing desk, grab it and throw it in my backpack to take to a remote location to use with the dongle. Best, at half the price of the G Pro Superlight I feel less guilty buying <em>another</em> peripheral. If I was choosing purely for gaming/desk feel, I would probably be keeping the G Pro Superlight. It just feels that nice… but not nice enough to maintain yet another special cable that only works for it.</p>
<p>It will serve as my primary mouse for a season, both at my desk and on the road. The Prime Mini. A serious-use mouse for serious people, just plug and play. 👍</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-magic">
<p>If you or someone you love insists on using the Magic Mouse, consider the wonderful <a href="https://www.elevationlab.com/products/magicgrips-for-magic-mouse">Elevation Labs Magic Grips</a>. <a href="#fnref-magic" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-osx">
<p>You'd be surprised how many mice don't work quite right on OSX. I also recommend <a href="https://github.com/evantravers/dotfiles/commit/627f99478f33ae84ab67b2dee1d3ce796f40deeb">turning off mouse acceleration</a>. <a href="#fnref-osx" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-dongle">
<p>It does look like Steelseries lets you <a href="https://steelseries.com/gaming-accessories/prime-mini-wireless-usb-c-dongle">buy replacement dongles</a> for $9.99, which isn't bad. <a href="#fnref-dongle" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Working in Castle Legacy</title>
       <link>http://evantravers.com/articles/2021/11/18/legacy-software-is-a-tell/</link>
       <pubDate>Thu, 18 Nov 2021 10:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/11/18/legacy-software-is-a-tell/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/11/castle.jpg"></p><p>Certain terrain lends itself to human flourishing. Food, water, shelter… often next to a source of wealth or trade.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-1.jpg" alt="lovely terrain, ready for business" /></p>
<p>Because the terrain drives demand humans settle, destroy, and resettle in the same desirable locations… often over centuries.</p>
<p>If we look at the historical record, the prosperity of a good location is often marked by violence. There are still layers of burned ash and melted nails under Rome, and spearheads and arrowheads under most cities.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-2.jpg" alt="prosperity is often accompanied by conflict" /></p>
<p>Conflict doesn't always bring progress. Sometimes a rival civilization makes an example of a city, or their own internal conflict causes them to fail. The ashes and wreckage too find their way into the earth.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-3.jpg" alt="unsolved conflict causes ruin" /></p>
<p>But if the ground is good, someone will always start again.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-4.jpg" alt="and you have to clean up an restart on the ashes" /></p>
<p>This cycle can continue in desirable locations for centuries. As successive generations or civilizations build on top of the infrastructure left by the previous occupants, the future settlement is shaped both by the natural contours of the land and by the remaining previous infrastructure. The pile of dirt that contains all these layers of histories is called a “tell.”<sup class="footnote-ref"><a href="#fn-tell" id="fnref-tell" data-footnote-ref>1</a></sup></p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-5.jpg" alt="but what you build is informed by what is there before" /></p>
<p>Many great European cities contain such tells. Many owe their shape and character to medieval or even Roman architecture and decisions: Paris’s 14th century sewers<sup class="footnote-ref"><a href="#fn-sewer" id="fnref-sewer" data-footnote-ref>2</a></sup>, or Roman aqueducts<sup class="footnote-ref"><a href="#fn-aqua" id="fnref-aqua" data-footnote-ref>3</a></sup> and roads and bridges<sup class="footnote-ref"><a href="#fn-bridge" id="fnref-bridge" data-footnote-ref>4</a></sup>.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-6.jpg" alt="and history will repeat itself on grander scales" /></p>
<p>The original terrain or the changes people made to that terrain drives any new construction. The new builders will take to jumpstart their progress. It's no surprise that the surviving bits of those old European cities that stay maintained and used are invisible infrastructure. Sometimes the original plan conflicts with our mental image of the construction in surprising ways.<sup class="footnote-ref"><a href="#fn-alley" id="fnref-alley" data-footnote-ref>5</a></sup> Other times you'll see the same triumphs and mistakes repeated time and time again. This makes sense… there are only a few places to build a port, defend a tower, or build a road.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-9.jpg" alt="what is below is just as true and real as what is above ground" /></p>
<p>Just like the physical construction a legacy software code case contains contains historical layers… where each successive attempt and architecture on the same business domain borrows abstractions and concepts from the previous iterations.</p>
<p><img src="https://images.evantravers.com/articles/2021/11/castle-8.jpg" alt="you knew we weren't talking about physical history, right?" /></p>
<p>Digging through the digital &quot;tell&quot;s that I've worked on before, I've found these layers in:</p>
<ul>
<li>Routers / URLs<sup class="footnote-ref"><a href="#fn-url" id="fnref-url" data-footnote-ref>6</a></sup></li>
<li>Namespaces</li>
<li>Business Rules (Permissions!)</li>
<li>Glue Code</li>
<li>Legacy APIs</li>
<li>Code Specific to Old Clients or Business Models</li>
</ul>
<p>Thinking about software as layers of a city<sup class="footnote-ref"><a href="#fn-metaphor" id="fnref-metaphor" data-footnote-ref>7</a></sup> has helped me a lot. When working in a legacy software “tell,” I’ll find myself shifting my mindset from an engineer to that of an archaeologist. A digital archaeologist understands that the previous occupants of this terrain might have had similar goals, but a different language, culture, belief system that drove their decisions. They’ll take a human perspective to the remains they find, and use some forensic tools<sup class="footnote-ref"><a href="#fn-spelunking" id="fnref-spelunking" data-footnote-ref>8</a></sup> to try and build a picture of the story.</p>
<p>When working in a digital &quot;tell&quot;, it is more important to learn to dig than to build. It's partly why <a href="http://evantravers.com/articles/tags/vim/">I love vim</a>: it's whole paradigm centers around the critical skill of editing what is already there rather than focusing on writing from scratch.</p>
<p>I've also carried this thinking into writing &quot;new&quot; code. What kind of decisions are going to be so ingrained into this &quot;terrain&quot; that I should really document for future generations.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-tell">
<p><a href="https://en.wikipedia.org/wiki/Tell_(archaeology)">Tell (archaeology) - wikipedia.org</a> <a href="#fnref-tell" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-sewer">
<p><a href="https://en.wikipedia.org/wiki/Paris_sewers">Paris sewer - wikipedia.org</a> <a href="#fnref-sewer" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-aqua">
<p><a href="https://en.wikipedia.org/wiki/Aqua_Virgo">Aqua Virgo - Wikipedia.org</a> <a href="#fnref-aqua" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-bridge">
<p><a href="https://en.wikipedia.org/wiki/Ponte_di_Tiberio_(Rimini)">Ponte di Tiberio (Rimini)</a> <a href="#fnref-bridge" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-alley">
<p>My favorite example: NYC doesn't really have alleys in Manhattan because of the designed grid. <a href="https://99percentinvisible.org/episode/mini-stories-volume-6/">Cortland Alley - 99percentinvisible.com</a> <a href="#fnref-alley" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-url">
<p>I once read about a decision for Twitter URIs that slowed down response time… as the platform grew, they couldn't undo the change without breaking the value of the platform, so they were stuck with the decision. (Trying to find the source.) <a href="#fnref-url" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="fn-metaphor">
<p>I think I have to credit Vernor Vinge's book <a href="https://en.wikipedia.org/wiki/A_Deepness_in_the_Sky">A Deepness in the Sky</a> for planting this image in my head. Thinking about this process in software development as building a continous stack over <em>millenia</em>… fascinating. Great book. <a href="#fnref-metaphor" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="fn-spelunking">
<p><a href="http://evantravers.com/articles/2018/09/28/code-spelunking/">Spelunking in Git - evantravers.com</a> <a href="#fnref-spelunking" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="8" aria-label="Back to reference 8">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Border of the Known</title>
       <link>http://evantravers.com/articles/2021/11/08/border-of-the-known/</link>
       <pubDate>Mon, 08 Nov 2021 11:54:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/11/08/border-of-the-known/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/11/border-of-the-known.png"></p><p>In any team-oriented context (product work, academic study, team projects, etc.) the whole team would benefit from documenting and sharing Strong Facts or Strong Opinions<sup class="footnote-ref"><a href="#fn-facts" id="fnref-facts" data-footnote-ref>1</a></sup>.</p>
<p>As you practice Note-Making and learn new information <em>you can't know where it belongs</em>.</p>
<p>It could be:</p>
<ol>
<li>Known and documented facts I'm just re-discovering.</li>
<li>Already known but undocumented facts I can add to the shared repository.</li>
<li>Unknown, undocumented hypotheses that I can validate and then give to the team as insight.</li>
</ol>
<p>It may take some time to discover that an idea or fact is already in the Border of the Known… shared knowledge you are just learning. If you have written down unrecorded &quot;oral history&quot; you can add to the team's knowledge bank.</p>
<p>Any information you discover that is <strong>outside</strong> that shared boundary of knowledge is <em>potentially</em> new information… true research. if validated, it is your unique contribution to the knowledge space:</p>
<blockquote>
<p>research is simply a continuation of something we already naturally do: learning. Learning happens when you understand something that someone else already understands. <mark>Research happens when you understand something that nobody else understands yet</mark>.</p>
</blockquote>
<p>– <a href="https://kanjun.me/writing/research-as-understanding">Research as Understanding - Kanjun Qiu</a></p>
<p>In a <strong>cooperative</strong> shared space, you can validate, persuade, and publish moving it into the shared knowledge pool. In a <strong>competitive</strong> space you can keep this information to improve your position.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-facts">
<p>In my system, a “named note” or evergreen note should be a strong fact or a strong opinion. <a href="https://notes.andymatuschak.org/Evergreen_notes">Evergreen Note</a>. <a href="#fnref-facts" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The Bullet Journal Method by Ryder Carroll</title>
       <link>http://evantravers.com/articles/2021/11/02/the-bullet-journal-method-by-ryder-carroll/</link>
       <pubDate>Tue, 02 Nov 2021 10:48:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/11/02/the-bullet-journal-method-by-ryder-carroll/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/11/bullet-journal-cover.jpg"></p><p>It feels weird to be finally reading this years after I've been &quot;doing&quot; the bullet journal method. My first bullet journal is dated from 2016, so I guess five years?! It's been a very important part of my productivity/focus journey, but it means that I have a very strange lens with which to approach this book.</p>
<p>Firstly: this is a <em>very</em> handsome book. It's a love letter to journaling and paper. Reads great in the hand and lovely on the shelf.</p>
<p>It's typeset nicely, and it's fun how it uses the physical medium of the book to reinforce how the system works. The page explaining the different Collections is itself a Collection!</p>
<p><img src="https://images.evantravers.com/articles/2021/11/collections.jpg" alt="illustrations from the bullet journal book" /></p>
<p>The contraints and delights of paper itself is a major theme of the book and the system. Ryder reminds the reader that the act of handwriting has recall and retention powers. The slowness of handwriting vs. typing forces the note-taker to employ advanced synthesization and summarization during capture. Notes taken by hand tend to be more concise and readable. This is an important part of my <a href="http://evantravers.com/articles/tags/creativity-systems/">Creativity System</a>, and I'm inspired to spend more time &quot;thinking on paper.&quot;</p>
<p>The physical restrictions of paper force you to adopt intentional practices of planning and review. You can't copy/paste or search, so you have to be thoughtful about what you take with you and where you put it. I'm begin to think that <em>The Bullet Journal Method</em> is probably the best start for anyone who is struggling with the practices required to build a disciplined/organized life. I'm pretty sure that the intentional practice of Rapid Logging and Migration were the first things that let me <a href="http://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">defeat the Focus Boulder</a>. As much as I love Obsidian and Things and other digital tools, it's the rituals and practices that Migration taught me that keep the Evan-machine going.</p>
<p>Another huge benefit of the Bullet Journal practice is the question &quot;what just happened?&quot; By externalizing our thoughts into words, we are able to separate our identity from the thoughts and feelings we are experiencing. This helps us be more objective and take every thought captive. To externalize your experiences and impulses creates this space between input and reaction that Ryder beautifully illustrates here:</p>
<p><img src="https://images.evantravers.com/articles/2021/11/reflection.png" alt="reflection" /></p>
<p>By journaling we become witnesses to our own story from the outside, an invaluable practice for learning impulse management and fostering gratefulness.</p>
<p>Section 3, &quot;The Practice,&quot; is a succinct (if overly zen/stoic) summary of basic healthy productivity practices. There is certainly some Self-Centered Self Help<sup class="footnote-ref"><a href="#fn-selfhelp" id="fnref-selfhelp" data-footnote-ref>1</a></sup> problems in there, but it's manageable.</p>
<h2><a href="#action-items" aria-hidden="true" class="anchor" id="action-items"></a>Action Items</h2>
<p>While I like <a href="https://twitter.com/mattragland">Matt Ragland</a>'s split journal method, I think that I'm going to have <em>all</em> collections on the &quot;organized&quot; side, and only scrawl on the unorganized side. Before, I was only putting Daily/Weekly collections on the &quot;organized&quot; side of the journal, and everything else was on the &quot;notes&quot; side… but I have realized that I want <em>everything</em> with a title on the organization side. If I write something in the random side worth linking to, it's worth restating in the  appropriate Bullet Journal collection.</p>
<p>I'll also take his advice to start a new journal every year instead of limping the journal along past the new year. I'm excited to get back into it.</p>
<p>I think that next year I want to recommit to living in the Bullet Journal first. Thanks to Things and fun Drafts automations, I find myself dictating to my phone more than writing in my notebook. I live at a keyboard, so digital is closer at hand. I am convinced that by Rapid Logging more in the notebook first, I'll be practicing a little more reflection and presence that will help me be grateful and stay focused on what matters. Choosing to restate some of my tasks in my daily log will help me avoid over-committing to tasks by looking at the never-ending digital backlog, which Ryder says better:</p>
<blockquote>
<p>Set intentions, not expectations.</p>
</blockquote>
<p>Great read, even if you have no intention of using your journal as a Bullet Journal.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-selfhelp">
<p>Self-help books generally have a core of self centeredness. Mentally replacing the &quot;you are worth it&quot; and &quot;pursue your dreams&quot; narratives with &quot;He is worthy&quot; and &quot;I am a steward of talents&quot; redeems this for a believer. <a href="#fnref-selfhelp" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Controlling Elgato Key Light with Hammerspoon</title>
       <link>http://evantravers.com/articles/2021/10/31/controlling-elgato-key-light-with-hammerspoon/</link>
       <pubDate>Sun, 31 Oct 2021 17:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/10/31/controlling-elgato-key-light-with-hammerspoon/</guid>
       <description><![CDATA[ <p>Here's a quick automation that I've been hacking idly on for months: having my Elgato Key Air Light be automatically controlled from my Mac.</p>
<p>While perusing hammerspoon's API, I noticed that it has a <a href="https://www.hammerspoon.org/docs/hs.bonjour.html">Bonjour API</a> and wound up writing this snippet:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bonjour</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">networkServices</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">inspect</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>When I ran this in the Hammerspoon console, I saw a list of findable services including the Elgato light... so it was only a matter of time before I found the right commands. Thanks to <a href="https://www.kumariyer.com/post/controlling-elgato/">this blog post</a> I found <a href="https://github.com/NickParks/elgato-light-api">some working TypeScript</a> that I was eventually able to adapt after I had grokked more of Hammerspoon's Bonjour implementation.</p>
<p>(It turns out that the Elgato Key runs an unsecured web server that takes HTTP requests in a very simple fashion. It's kind of refreshing. Most of the code just finds the IP and port of the light, the rest sends the HTTP requests with a different JSON payload for on or off.)</p>
<p>I use this on and off switch when I <a href="https://github.com/evantravers/hammerspoon-config/blob/19c3e9a6b5536c6db85b14de57374fb07c0c188d/spaces/collaboration.lua#L17-L26">enter and leave</a> my meeting Headspace.</p>
<p>I quickly realized that my quick and dirty hack would turn on and off all lights on the same network with your laptop... so I decided to restrict the code to only when I'm plugged into my trusty CalDigit TS3+ dock:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IsDocked</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">some</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">usb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachedDevices</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">device</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">device</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">productName</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;CalDigit Thunderbolt 3 Audio&quot;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>That function returns <code>true</code> if my laptop is docked. In my meeting space automation I use something like:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IsDocked</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spoon</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ElgatoKey</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">off</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>I pulled my naive implementation into a <a href="https://github.com/evantravers/hammerspoon-config/blob/8b24d94bf60c5828259dfc858fa4e4dc777677b7/Spoons/ElgatoKey.spoon/init.lua">baby spoon library</a>, so you can hack on it if you want.</p> ]]></description>
    </item>
    <item>
       <title>Lifecycle of Notes: My Implementation</title>
       <link>http://evantravers.com/articles/2021/10/30/lifecycle-of-notes-my-implementation/</link>
       <pubDate>Sat, 30 Oct 2021 08:41:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/10/30/lifecycle-of-notes-my-implementation/</guid>
       <description><![CDATA[ <p>This is a direct follow up to my previous discussion of the <a href="http://evantravers.com/articles/2021/10/25/nurturing-notes-and-thoughts/">&quot;strength of notes&quot; and nurturing thought</a>.</p>
<p>As with all aspects of a Creativity System, how you implement such a classification should differ based on your brain and creative goals. As a simple example: I believe that Jerry Seinfield uses two yellow legal pads… the first contains rough drafts of comedy material, and he migrates the &quot;good ones&quot; to a second for refinement. This is a rough classification system. In different episodes of <a href="https://www.youtube.com/watch?v=8sxyYbh5mio&amp;list=PL3NaIVgSlAVI6j6bXResrReMIc6zKBH5q">LYT-house</a> I'm pretty sure I have seen:</p>
<ul>
<li>YAML frontmatter tag for <code>epistemological status</code></li>
<li>Folders for &quot;drafts&quot; or &quot;hypotheses&quot;</li>
<li>Emoji in the filename like <code>🚧</code></li>
<li><a href="https://www.youtube.com/watch?v=68huyTJjBF0">empty nodes on the graph and <code>#state/develop</code> tags</a></li>
<li>completely separate forms/app/systems (e.g. Seinfield's yellow legal pads)</li>
</ul>
<p>These are <em>so</em> creative and are effective as <a href="">identification</a>… you just have to decide what works with your brain and goals… and steal it. 😈</p>
<p>I have written about <a href="http://evantravers.com/articles/2021/09/30/the-history-of-my-creativity-system/#outputs">my particular inputs and outputs</a>. In the light of this my system uses different kinds of note, (the filename and structure) to signify the &quot;strength&quot; of an idea. The two main kinds of notes are:</p>
<ul>
<li>&quot;zettel&quot;-style filenames for infant &quot;weak&quot; ideas and connecting thoughts (e.g. <code>202110140716.md</code>)</li>
<li>&quot;Evergreen&quot; style named notes for strong facts and strong opinions (e.g. <code>Boundary of the Known.md</code>)</li>
</ul>
<p>This lifecycle kind of happened accidentally but it has stuck. In the <a href="http://evantravers.com/articles/2021/09/30/the-history-of-my-creativity-system/#history-and-obstacles">many transitions of my system</a> I tried 100% ZK style notes, and then migrated to Named Notes... but only for notes that had titles. This left a lot of my <a href="http://evantravers.com/articles/2020/12/08/smz-updated-drafts-actions/">capture automations</a> still creating ZK-style notes and created an organic difference between captured &quot;ZK&quot; style notes, and intentionally crafted evergreen Named Notes.</p>
<h3><a href="#zettels" aria-hidden="true" class="anchor" id="zettels"></a>Zettels</h3>
<p>Before I get a letter… I <em>know</em> that these aren't proper &quot;zettelkasten&quot; notes. They are just what I call them.</p>
<p>Zettels for me are the entry point into my note-taking system. Because they don't have a name, folder, or categorization they can just enter the web at any point… cheap, easy capture.</p>
<p>Zettels (maybe I should come up with another name!) do abide by the note-making rules: a singular, atomic idea, in my voice, interesting to me… and they usually have at least one link to something else. They sometimes aren't more complex than a single sentence.</p>
<h4><a href="#examples" aria-hidden="true" class="anchor" id="examples"></a>Examples</h4>
<h5><a href="#scripture-highlight" aria-hidden="true" class="anchor" id="scripture-highlight"></a>Scripture Highlight</h5>
<p>A single link to a verse and some comments from a sermon or personal study… usually unverified by further study:</p>
<p><strong>Filename</strong>: <code>202108300728.md</code></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">In [[1 Kings-19#18|1 Kings 19:18]] God answers Elijah&#39;s [[Depression]] by telling him the truth: he&#39;s not alone. There are 7000 others.
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">God could have said &quot;I am enough,&quot; or &quot;don&#39;t be afraid,&quot; but instead comes with the whisper &quot;you are not the last faithful person.&quot;
</div></code></pre>
<h5><a href="#book-note" aria-hidden="true" class="anchor" id="book-note"></a>Book Note</h5>
<p>A reflection on a book idea that I have not proven or become convinced of yet:</p>
<p><strong>Filename</strong>: <code>202110010724.md</code></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">Bondage or enslaved is the biblical language for we commonly call addiction or addictive personalities today.
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">Lou Priolo. _[[Pleasing People]]_. P &amp; R Publishing, 2006. p52
</div></code></pre>
<h5><a href="#errata" aria-hidden="true" class="anchor" id="errata"></a>Errata</h5>
<p>Commentary on another note that didn't belong to that note's singular idea:</p>
<p><strong>Filename</strong>: <code>202109301007.md</code></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">Constraint-based programming as described by Bret Victor[^bv] is basically programming by [[Outcomes Over Outputs]].
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[^bv]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(underline, underline);">https://youtu.be/8pTEmbeENF4?t=654</span>
</div></code></pre>
<h5><a href="#label" aria-hidden="true" class="anchor" id="label"></a>Label</h5>
<p>A &quot;label&quot; on the &quot;line&quot; between two other notes. These are often made while exploring links… and I find one that I feel like future-me would need a little more context for how these relate or to connect a few things:</p>
<p><strong>Filename</strong>: <code>202110152107.md</code></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">[[ESV/1 Chronicles/1 Chronicles-19#12|1 Chronicles 19:12]] reflects the idea of [[Distributed Command]], [[Simple]], and [[Cover and Move]] from [[Extreme Ownership by Jocko Willink]]
</div></code></pre>
<p>There's a lot more that gets added as zettels:</p>
<ul>
<li>sermon outlines</li>
<li>dream logs</li>
<li>random facts or user insights about the products in my day-job</li>
</ul>
<p>Zettels make up the bulk of what gets captured into my system. It's rare for me to enter a &quot;strong&quot; idea right out of the gate. Those &quot;strong&quot; ideas, (usually ones I've been holding for a <em>long</em> time) get entered as Named Notes.</p>
<h3><a href="#named-notes" aria-hidden="true" class="anchor" id="named-notes"></a>Named Notes</h3>
<p>Notes containing a <strong>strong opinion or strong fact</strong> become a Named Note or Evergreen Note. My ideas here are <em>so</em> influenced by Andy Mutaschak's writing on Evergreen notes that you may as well open tab to his wild web of wisdom: <a href="https://notes.andymatuschak.org/Evergreen_notes">Evergreen Notes - Andy Mutaschak</a>.</p>
<p>A Named Note still follows the rules of atomicity, interestingness, and links… but it has a filename and title that is usable in a sentence and <em>meaningful for me</em>.</p>
<h4><a href="#example" aria-hidden="true" class="anchor" id="example"></a>Example</h4>
<p><strong>Filename</strong>: <code>Journaling externalizes thoughts and feelings.md</code></p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># Journaling externalizes thoughts and feelings
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3">By externalizing the thoughts into words, we are able to separate our identity from the thoughts and feelings we are experiencing. This helps us be more objective and take every thought captive. 
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">You can see this pattern in the psalms. So many of them start with an experience or feeling that the psalmist describes… often in pathetic or visceral detail. Then the writer calms, and sets his will to worship and honor the Lord. 
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---
</div><div class="line" data-line="8"></span>
</div><div class="line" data-line="9"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>[[Simultaneous terror and peace]]. 
</div><div class="line" data-line="10"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>[[booknotes/The Bullet Journal Method by Ryder Carroll]] talks a lot about becoming a witness to your own experience through rapid logging.
</div></code></pre>
<p>Choosing a good name is important. Names that could just be the name of a <code>#tag</code> (i.e. &quot;Marriage&quot;, &quot;Agile Methodology&quot;) are too generalized. These usually become hub notes or Maps of Content (as Nick Milo styles them.) If the name is usable in a sentence and meaningful to me, it helps me constrain the note to be singular.<sup class="footnote-ref"><a href="#fn-singular" id="fnref-singular" data-footnote-ref>1</a></sup> Instead of &quot;Marriage&quot; I have a note named &quot;Living in an Understanding Way.&quot; That's a meaningful thought to me… and it might get split into &quot;Give Myself Up For Her&quot; and &quot;Living in an Understanding Way&quot; as the thoughts become more developed and need atomicity.</p>
<h3><a href="#form-dictates-workflow" aria-hidden="true" class="anchor" id="form-dictates-workflow"></a>Form Dictates Workflow</h3>
<p>Because my &quot;weak notes&quot; don't have descriptive filenames, they are harder to &quot;find.&quot; They don't jump out visually in the graph or in backlinks, but they are still present and available for exploration. The &quot;label&quot; style weak notes especially pique my interest when looking at a local graph… those are often great places to start discovering.</p>
<p><img src="https://images.evantravers.com/articles/2021/10/local_graph.png" alt="image of a local graph in obsidian" /></p>
<p>Occasionally while reviewing &quot;weak&quot; notes or zettels, <a href="http://evantravers.com/articles/2021/10/25/nurturing-notes-and-thoughts/#path-to-maturity">I discover enough weak opinions to voltron into a strong fact or strong opinion</a>. It's always exciting. It feels like being able to watch my thoughts forming. <em>Seeing</em> and experiencing externally the process of thinking has helped me reject some of those new hypotheses without mindlessly accepting them just based on frequency<sup class="footnote-ref"><a href="#fn-fallacy" id="fnref-fallacy" data-footnote-ref>2</a></sup>.</p>
<h4><a href="#workflow-example-saul-and-fear" aria-hidden="true" class="anchor" id="workflow-example-saul-and-fear"></a>Workflow Example: Saul and Fear</h4>
<p>An example of how all this all played together recently: making my way through 1 Samuel, I got to (one of the passages that amuses me the most) 1 Sam. 10:22:</p>
<blockquote>
<p>So they inquired again of the LORD, &quot;Is there a man still to come?&quot; and the LORD said, &quot;Behold, he has hidden himself among the baggage.&quot; (ESV)</p>
</blockquote>
<p>I laughed as I usually do at the thought of the giant future king of israel hiding under blankets among the donkeys and camels... and the thought occurred to me: Was Saul's predominant failing Fear?</p>
<p>I jotted it into a zettel note, just a link to the Bible verse and a question:</p>
<blockquote>
<p>Is Saul's predominant sin fear?</p>
</blockquote>
<p>Over the following weeks I continued to read about Saul, and logged six or more little notes on the same line of thought. As I noticed similarities, notes became linked. I started to notice that it wasn't just fear, it was specifically linked to Saul's fear of other's opinion. I eventually rewrote and reshaped the notes into a new Evergreen form based on my strong opinion: <code>Saul was Dominated by Fear</code>.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># Saul was dominated by fear
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3">Saul&#39;s prevailing [[Sin]] may have been [[Fear]], specifically fear of how people saw him. 
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">He displays fearfulness at the beginning of his story as comic humility[^1022], later in life it manifests as violent paranoia.[^paranoia]
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">Samuel tells Saul that he thought little of himself[^little]… I wonder what this means? Self-esteem? Certainly a self-focus rather than trusting God. Samuel attempts to redirect his attention to the fact God anointed him king.
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">Saul confesses to Samuel that he feared the people&#39;s opinion.[^opinion] As further evidence of this, we can point to his dramatic transformation when the people acclaim David above him.[^acclaim]
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">In his final chapter his fear of the Philistine army[^army] drives him to seek out necromancy. His fear kept him from eating, and paralyzes him with terror when ghost Samuel tells him the truth.
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">[^1022]:  [[ESV/1 Samuel/1 Samuel-10#22|1 Samuel 10:22]]
</div><div class="line" data-line="14">[^paranoia]:  [[ESV/1 Samuel/1 Samuel-18#12|1 Sam 18:12]], [[ESV/1 Samuel/1 Samuel-18#29|1 Sam 18:29]]
</div><div class="line" data-line="15">[^little]: [[1 Samuel-15#17|1 Sam 15:17]]
</div><div class="line" data-line="16">[^opinion]: [[ESV/1 Samuel/1 Samuel-15#24|1 Samuel 15:24]]
</div><div class="line" data-line="17">[^acclaim]: [[1 Samuel-18#8|1 Samuel 18:8]]
</div><div class="line" data-line="18">[^army]: [[1 Samuel-28#5|1 Samuel 28:5]]
</div></code></pre>
<p>I'm sure my style and form will continue to develop over time. I am really glad to have stumbled across this idea of Note Lifecycle. I continue to see a version of this thinking in other people's Creativity Systems, and am <strike>stealing</strike> thinking about how to learn from them. 🤣</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-singular">
<p>This wonderful idea is completely stolen from the wonderful Andy Mutaschak's note: <a href="https://notes.andymatuschak.org/Prefer_note_titles_with_complete_phrases_to_sharpen_claims">Prefer note titles with complete phrases to sharpen claims</a> <a href="#fnref-singular" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-fallacy">
<p><a href="https://www.thoughtco.com/argumentum-ad-populum-250340">Appeal to numbers - thoughtco.com</a> <a href="#fnref-fallacy" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Nurturing Notes and Thoughts</title>
       <link>http://evantravers.com/articles/2021/10/25/nurturing-notes-and-thoughts/</link>
       <pubDate>Mon, 25 Oct 2021 08:09:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/10/25/nurturing-notes-and-thoughts/</guid>
       <description><![CDATA[ <p>Not all ideas are equal. Ideas have different sources, confidence levels, provability and permanence. We use different words to describe our ideas: Hunches, notions, opinions, theories, concepts, abstractions, beliefs, hypothesis, facts, laws. Our thoughts don't stay the same either. Our minds change over time.</p>
<p>If there are all these ways to think about ideas… why do we use the same note-making structure to represent this variety?</p>
<figure>
  <img src="https://images.evantravers.com/articles/2021/10/unlabeled_vs_labeled.jpg" alt="showing two graphs, both with a potential link. One is unlabeled, the other labels its nodes with degrees of confidence. I'm insinutating the potential link is more valid when you know the validity of the nodes.">
  <figcaption>
    Would you feel more confident making that link not knowing the veracity of the two ideas, or by being able to see that both ideas are "strong?"
  </figcaption>
</figure>
<p>This has become the most impactful adaptation to my Creativity System: a simple classification system that has levels of &quot;strength&quot; for an idea. A &quot;weak&quot; idea is subject to doubt and disproval while a &quot;strong&quot; idea is core to my thinking.</p>
<p>There is an argument for only including strong opinions or strong facts in your Creativity System. By this logic every link in your notes is valid and strong. While this is tempting, we <em>still</em> need a place to capture and nurture new ideas. We would be creating a boundary arbitrarily in your Creativity System. However we slice and dice it, we have one Creativity System from inception to output.</p>
<h2><a href="#growing-your-notes" aria-hidden="true" class="anchor" id="growing-your-notes"></a>Growing Your Notes</h2>
<p><img src="https://images.evantravers.com/articles/2021/10/growth.jpg" alt="showing a progression from weak to strong, representing notes" /></p>
<p>Note-making is idea <em>development</em>. To create and discover we must capture new and risky ideas and connections, not just recording the safe and the known. There is great value in capturing unproven thoughts so we can nurture them to maturity.<sup class="footnote-ref"><a href="#fn-scientific" id="fnref-scientific" data-footnote-ref>1</a></sup></p>
<p>There are many ways to implement notes with a lifecycle, but all such systems should consider:</p>
<ul>
<li>allow easy capture of new ideas</li>
<li>easy identification of the strength of an idea</li>
<li>clear path for weak ideas to become strong</li>
</ul>
<h2><a href="#capture-the-interesting" aria-hidden="true" class="anchor" id="capture-the-interesting"></a>Capture the Interesting</h2>
<p><img src="https://images.evantravers.com/articles/2021/10/capture.jpg" alt="everything should have a home" /></p>
<p>Our Creativity Systems should support capturing and placing all kinds of notes into their own &quot;home&quot;, both weak and strong.</p>
<p>If we restrict our system to strong ideas we limit our ability to capture new and wonderful ideas. A huge part of a Creativity System is to allow us to capture and nuture anything that grabs and holds our interest.</p>
<h2><a href="#clear-identification" aria-hidden="true" class="anchor" id="clear-identification"></a>Clear Identification</h2>
<p><img src="https://images.evantravers.com/articles/2021/10/identification.jpg" alt="hunch &lt; observation &lt; insight &lt; hypothesis &lt; theory &lt; law" /></p>
<p>Our systems should have some sort of way of discerning what is a weak note, and what is a strong note. There are many such ways to do this (I'll detail mine in a later post) but it should make sense to you and be natural to your system and your goals.</p>
<p>Having this sort of identification can help us deal with a subtle but deadly cognitive bias: Humans believe we are critical of new ideas. The cold reality: our minds <strong>default to believing all we hear or read</strong>. We would like to think that when encountering a new idea we consider its truthfulness before believing… but it is far easier to just accept what we are given. We optionally (and rarely) consider a new idea's truthfulness after our minds have already accepted it.<sup class="footnote-ref"><a href="#fn-belief" id="fnref-belief" data-footnote-ref>2</a></sup> By encoding new &quot;weak&quot; ideas with a structure that denotes their fragility, we can help ourselves defeat this bias and navigate critically in new areas of thought.</p>
<h2><a href="#path-to-maturity" aria-hidden="true" class="anchor" id="path-to-maturity"></a>Path to Maturity</h2>
<p>Once we have a way to capture all interesting ideas, and a clear way to discern the different kinds of thoughts and notes, we will often find notes traveling up or down the lifecycle. Once all our thoughts and notes are swimming around in the same sea, there are many lovely ways that they can grow, be disproven, or continue to flourish. Just revisiting a note after the passage of time can change its position in our minds.</p>
<p>Sometimes while working I'll find strong surrounding arguments through search or links which will &quot;promote&quot; the idea in my mind.</p>
<p><img src="https://images.evantravers.com/articles/2021/10/maturation.jpg" alt="1. a note appears. 2. a note is connected to stronger notes. 3. the note gets more strength from its stronger connections" /></p>
<p>Sometimes while researching and writing I'll suddenly see a strong opinion that links together lots of weaker facts. The pattern suddenly shifts, and I'll have a new hypothesis to start studying.</p>
<p><img src="https://images.evantravers.com/articles/2021/10/theorycrafting.jpg" alt="diagram showing how you can find a stronger idea by finding lots of weaker thoughts that all connect." /></p>
<p>There are many ways that allowing weak and strong ideas to co-exist in our notes can improve our thinking. I've started &quot;debate&quot; notes, linked notes arguing either side of a controversy. I've found patterns in my own thinking that were then encoded as a &quot;weak&quot; note, studied, and ultimately rejected because there's no proof.</p>
<h2><a href="#" aria-hidden="true" class="anchor" id=""></a>***</h2>
<p>In previous versions of my note-taking systems I either restricted my system to only &quot;worthy&quot; or &quot;strong&quot; notes, or I threw <em>everything</em> into the system but without a way to tell what was weak and what was strong. When only strong notes were in my system my thinking never grew, I only reinforced prior thoughts. When all thoughts were un-evaluated it was hard to navigate. By capturing everything while discerning weak and strong thoughts my Creativity System and my creative thinking has benefitted dramatically.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-scientific">
<p>There is a very good comparison here to the scientific method: hypothesis being proven by experiment into theories that stand the test of time until law… but there are <em>many</em> such metaphors appropriate for different Creativity Systems. I didn't want to limit people's imaginations to only one. <a href="#fnref-scientific" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-belief">
<p>I cannot for the life of me remember where I first heard this. Proverbs 14:15 says it better than I could:</p>
<blockquote>
<p>Fools believe every word they hear, but wise people think carefully about everything.</p>
</blockquote>
<p>While the <a href="https://en.wikipedia.org/wiki/Replication_crisis">replication crisis</a> makes me leary of <em>every</em> social experiement, there are some works out there that highlight this idea:</p>
<ul>
<li><a href="https://explorable.com/understanding-and-belief">Understanding and Belief - explorable.com</a> has a good summary of the Gilbert experiment.</li>
<li><a href="https://pubmed.ncbi.nlm.nih.gov/8366418/">You can't not believe everything you read - D T Gilbert 1, R W Tafarodi, P S Malone</a></li>
<li><a href="https://www.scholars.northwestern.edu/en/publications/the-consequences-of-reading-inaccurate-information">The Consequences of Reading Inaccurate Information - David Neil Rapp</a></li>
</ul>
<a href="#fnref-belief" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The History of My Creativity System</title>
       <link>http://evantravers.com/articles/2021/09/30/the-history-of-my-creativity-system/</link>
       <pubDate>Thu, 30 Sep 2021 07:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/09/30/the-history-of-my-creativity-system/</guid>
       <description><![CDATA[ <p>While <a href="http://evantravers.com/articles/2021/02/25/reflection-and-recall/">mapping my inputs and outputs</a>… I realized the tools I used and goals I aimed for shaped my <a href="/articles/series/creativity-systems">Creativity System</a> over the years.</p>
<p>This section was originally part of an overly long post… but for those of you who interested in the path I have taken to my current strategy… here you go:</p>
<h3><a href="#inputs" aria-hidden="true" class="anchor" id="inputs"></a>Inputs</h3>
<h4><a href="#-links" aria-hidden="true" class="anchor" id="-links"></a>💻 Links</h4>
<p>I have spent my career working on websites or web applications. A lot of my personal and professional growth is through blog posts and essays… <a href="http://evantravers.com/articles/2020/04/15/reworking-my-rss-reading/">subscribed using RSS</a> and read in a browser or often in <a href="https://www.instapaper.com/">Instapaper</a>.</p>
<h4><a href="#-books" aria-hidden="true" class="anchor" id="-books"></a>📗 Books</h4>
<p>Recently I've been aping <a href="http://bookworm.fm">Bookworm</a> and making mind maps as I read… turning the standout themes into standalone zettel notes. I have been exporting Kindle highlights/notes using <a href="https://readwise.io/bookcision">Bookcision</a> manually… but now <a href="https://github.com/hadynz/obsidian-kindle-plugin">Obsidian Kindle Highlights</a> handles that for me. (More on all this soon!)</p>
<h4><a href="#-meetings" aria-hidden="true" class="anchor" id="-meetings"></a>🗒 Meetings</h4>
<p>While in meetings, listening to sermons, or even just conversations I'll often have Drafts or my Bullet Journal open, jotting down thoughts.</p>
<h4><a href="#-shower-thoughts" aria-hidden="true" class="anchor" id="-shower-thoughts"></a>🚿 Shower Thoughts</h4>
<p>Never underestimate shower thoughts. 🤷 More often than not… a new question or line of inquiry will suggest itself in the quiet nothingness of a walk, shower, or workout. If the notion has value… I want to be able to connect and use it later.</p>
<p><strong>Many</strong> of my blog posts have started from such a note!</p>
<h3><a href="#outputs" aria-hidden="true" class="anchor" id="outputs"></a>Outputs</h3>
<h4><a href="#-thinking" aria-hidden="true" class="anchor" id="-thinking"></a>🧠 Thinking</h4>
<p>I want to invest in <a href="https://notes.andymatuschak.org/z7kEFe6NfUSgtaDuUjST1oczKKzQQeQWk4Dbc">better thinking</a>. Well made notes (especially linked!) have allowed me to have meaningful conversations with my own brain… finding new connections and revisiting old ones.</p>
<h4><a href="#-bible-study" aria-hidden="true" class="anchor" id="-bible-study"></a>📖 Bible Study</h4>
<p>I've always admired those whose Bibles are dog-eared and covered in marginalia. I've acquired half a dozen collections of notes and highlights across different apps and printed editions… I want to build something more permanent, portable, and searchable.</p>
<p>I'm about six months-ish into this process… and it's starting to bear fruit. When the pastor mentions a passage… I can find every note, highlight, journal entry, or booknote that references that passage. It's hugely powerful, and hopefully over time will reduce the &quot;huh, where did I hear that before?&quot; feeling.</p>
<h4><a href="#️-writing" aria-hidden="true" class="anchor" id="️-writing"></a>✍️ Writing</h4>
<p>I like to write blog posts. I have always toyed with the idea of writing a book someday? 🤷‍♂️</p>
<h4><a href="#-ux-work" aria-hidden="true" class="anchor" id="-ux-work"></a>💼 UX Work</h4>
<p>In my role as a User Experience Designer I deal with complex context: lost users, UX debt, oral histories, nuances of product surface, operations practices, and more. These product hypotheses and individual user insights don't belong to any single project… so hypertext notes are an <em>awesome</em> tool.</p>
<h2><a href="#constraints" aria-hidden="true" class="anchor" id="constraints"></a>Constraints</h2>
<h3><a href="#-data" aria-hidden="true" class="anchor" id="-data"></a>🔐 Data</h3>
<p>I need to own my own data and avoid vendor lock-in. I prefer a <a href="https://0data.app/">0data</a> style application like Obsidian, and an easily portable file format like markdown.</p>
<h3><a href="#-tool-investment" aria-hidden="true" class="anchor" id="-tool-investment"></a>🔨 Tool Investment</h3>
<p>I've invested a lot of time in <a href="http://evantravers.com/articles/tags/vim/">Vim</a> and <a href="http://evantravers.com/articles/tags/drafts-app/">Drafts.app</a>. If you don't use these tools, some of my constraints may not matter, but it's worth noting.</p>
<h3><a href="#history-and-obstacles" aria-hidden="true" class="anchor" id="history-and-obstacles"></a>History and Obstacles</h3>
<p>Here's the tangled tale of my digital plaintext notes so far. I think it's most helpful to see the things that <em>didn't</em> work, worked for a while… how I got here.</p>
<h4><a href="#1️⃣-random-plain-text" aria-hidden="true" class="anchor" id="1️⃣-random-plain-text"></a>1️⃣ Random plain text.</h4>
<p>I started making simple Notepad ++/TextEdit notes at my first job and college.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<h4><a href="#2️⃣-evernote" aria-hidden="true" class="anchor" id="2️⃣-evernote"></a>2️⃣ Evernote</h4>
<p>I flirted with this briefly… but I didn't want to be locked in a walled garden. (I was already investing in vim.)</p>
<h4><a href="#3️⃣-nvaltsimplenote" aria-hidden="true" class="anchor" id="3️⃣-nvaltsimplenote"></a>3️⃣ nvAlt/SimpleNote</h4>
<p>This was the answer for <em>years</em>. I am 95% sure that I owe the link to Merlin Mann on MacBreak Weekly. It simplified capture by combining search and new note creation… still one of my favorite applications. I believe an nvAlt release note about <code>[[wikilinks]]</code> introduced me to the idea of a Zettelkasten.</p>
<h4><a href="#4️⃣-vimwiki" aria-hidden="true" class="anchor" id="4️⃣-vimwiki"></a>4️⃣ VimWiki</h4>
<p>Back when I was programming for a living VimWiki was an amazing option. Note-taking was always available in the same application as my work. I <a href="https://web.archive.org/web/20170912030513/https://www.dailydrip.com/blog/vimwiki.html">wrote a (now archived) article</a> on it because I couldn't find the info I wanted online.</p>
<h4><a href="#5️⃣-homebrew-zettelkasten-in-vim" aria-hidden="true" class="anchor" id="5️⃣-homebrew-zettelkasten-in-vim"></a>5️⃣ Homebrew Zettelkasten in Vim</h4>
<p>I became frustrated by vimwiki taking over my markdown syntax in vim, and it had weird options… it's gotten a lot better since. Part of the problem for me is that I was attempting to do both a productivity system and a creativity system. Vimwiki and plaintext was absolutely capable… I just didn't have the discipline and practices required to <a href="http://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">keep from feeling overwhelmed</a>. After I had <a href="http://evantravers.com/articles/tags/bullet-journal/">used a Bullet Journal for a while</a>… I was better prepared to understand and work productivity systems… and start to understand the value of a Creativity System.</p>
<h4><a href="#6️⃣-obsidian-using-zk-id" aria-hidden="true" class="anchor" id="6️⃣-obsidian-using-zk-id"></a>6️⃣ Obsidian using ZK ID</h4>
<p>I started toying with Obsidian… and while reading about paper zettelkasten I bought into a (faulty) usage of the permanent ID. I <a href="https://github.com/evantravers/plaintext-migration">wrote a transformation script</a> to take all my old sources of plaintext notes and make a flat markdown folder with unique IDs.</p>
<h4><a href="#7️⃣-obsidian-using-titled-notes" aria-hidden="true" class="anchor" id="7️⃣-obsidian-using-titled-notes"></a>7️⃣ Obsidian using Titled Notes</h4>
<p>After discovering I was wrong… I arrived at the simpler <a href="http://evantravers.com/articles/2021/09/28/simple-markdown-zettelkasten-1-5/">current version</a>. It's been stable and slowly growing for six months. Less tinkering, more thinking and using. 🧠</p>
<h2><a href="#themes" aria-hidden="true" class="anchor" id="themes"></a>Themes</h2>
<p>I doubt <em>anyone</em> is going to read this… but self-documentation is interesting.</p>
<p>Some random takeaways as I consider my particular tooling journey:</p>
<ul>
<li><strong>Plaintext is king</strong>. Easily trackable, diff-able, portable.</li>
<li>Consistent formats makes transformation by script easier.</li>
<li>I should have tracked my notes in git <em>years</em> ago. Having a consistent backup I understand allows me to fearlessly experiment.</li>
<li>Notes are more just remembering facts. I never had a vision for tying together all the areas of my life… I guess I just kept my work/personal/family life compartmentalized before. Part of that productivity journey I guess.</li>
<li>Simpler is better.</li>
</ul>
<p>I'm going to be talking more in the coming weeks about specific tweaks and customizations that I've made… hopefully they'll make more sense given this context, and I'll likely link back to this where it makes sense.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Up until my first job, each project or context (being school!) had come pre-packaged with a place to put context: a workbook, study guides, etc. Suddenly I needed a place to put useful info, and no adult was going to remember it for me. In my first year of college, I used google docs to build a note wiki… and six months into school they banned laptops in the classroom. I was an unhappy computer science major… but my handwriting did improve drastically. 😜 <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Simple Markdown Zettelkasten 1.5</title>
       <link>http://evantravers.com/articles/2021/09/28/simple-markdown-zettelkasten-1-5/</link>
       <pubDate>Tue, 28 Sep 2021 07:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/09/28/simple-markdown-zettelkasten-1-5/</guid>
       <description><![CDATA[ <p>I've been quietly using a new format of my zettelkasten<sup class="footnote-ref"><a href="#fn-zk" id="fnref-zk" data-footnote-ref>1</a></sup> for almost six months. I wrote <a href="https://github.com/evantravers/undo-zk">yet another giant migration script</a>… but I wanted my system to stabilize before I wrote about it again.<sup class="footnote-ref"><a href="#fn-stable" id="fnref-stable" data-footnote-ref>2</a></sup></p>
<p>In short: I'm doing the easiest possible thing that Obsidian recommends.<sup class="footnote-ref"><a href="#fn-gk" id="fnref-gk" data-footnote-ref>3</a></sup> 🤷</p>
<ul>
<li>I <strong>no longer</strong> use a &quot;Zettelkasten ID&quot; in the filename of every file.</li>
<li>I'm using YAML frontmatter instead of MultiMarkdown.</li>
</ul>
<p>Simply:</p>
<p>Filename: <code>Sentence style notes.md</code></p>
<p>Content:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">optional</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># Sentence Style Notes
</div><div class="line" data-line="7"></span>
</div><div class="line" data-line="8">I&#39;m using simple markdown notes for evergreen notes. This makes [[linking]] easier and doesn&#39;t mean I have to use aliases to compensate for a ZK ID in the filename… making [[Note-Making]] *much* easier. The YAML frontmatter is optional… mostly tags and aliases.
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">Related:
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>I&#39;ll often have a block of related notes
</div><div class="line" data-line="12"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>Maps of Content or hubs
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span>links to daily notes that make sense
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">[Optional link to a source or reference](https://fakesourceorreference.com/facts)
</div></code></pre>
<h2><a href="#zettelkasten-id-in-filename" aria-hidden="true" class="anchor" id="zettelkasten-id-in-filename"></a>Zettelkasten ID in Filename</h2>
<p>The reason I wanted to have the ZK ID in the filename was to preserve links throughout rewriting notes. While robust, this strategy sacrifices ease of writing… and creativity is what this is for!</p>
<p>If the filename contains the ZK-ID (something like <code>2021092723-fake-name.md</code>) then you have three options to reference another file as a link:</p>
<ul>
<li>know the exact second you created an unseen note from memory (impossible!)</li>
<li>have the computer autocomplete the title (difficult, since most file autocompletes start from the first character)</li>
<li>use the Alias feature in Obsidian to create a duplicate title… that you will mostly like use anyway. (extra useless typing!)</li>
</ul>
<p>As soon as I made the conversion back… there was no going back. Composing a note with links was <em>easy</em> no matter what app I was using. I could even handwrite and scan a reference to <code>[[Exodus]]</code> or <code>[[Border of the Known]]</code> and <em>know</em> which note to which I was linking.</p>
<p>What about link robustness you may ask? Well… in part I am relying on Obsidian's toolchain for now, but I'm also a software developer, and my whole Creativity System is now backed up in Git. If I find a link missing, I can <a href="http://evantravers.com/articles/2018/09/28/code-spelunking/">do some spelunking</a> and find the missing file. If I need to apocalypse-proof my knowledge system… I have shown myself to be perfectly able to write textfile migrations. I'll generate a unique ID for each note and can append it to every link for printing.</p>
<h2><a href="#yaml-frontmatter" aria-hidden="true" class="anchor" id="yaml-frontmatter"></a>YAML Frontmatter</h2>
<p>Using YAML frontmatter instead of MultiMarkdown is a less contentious choice… most Markdown applications these days support a version of YAML frontmatter even before Obsidian… and few indeed supported MMD.</p>
<h2><a href="#where-to-now" aria-hidden="true" class="anchor" id="where-to-now"></a>Where To Now?</h2>
<p>I've been doing a lot more writing and thinking with my Creativity System now that the friction of creation has decreased. I've got a lot more thinking and tricks to post… but I figured I'd talk about it in bite-sized chunks… I've been rewriting the same 3k word post for six months.</p>
<p>The longer I learn about this world of PKM/ZK/Creativity Systems the more convinced I am that each person should be building their system to suit their needs and mind. It's a <em>deeply</em> personal tool. You shouldn't copy my methods or tools directly… unless you have similar goals.</p>
<p>Thank you especially to all the readers and internet friends who have sent me encouraging emails and questions. I don't have analytics on this blog… so your kind words keep me going!</p>
<blockquote>
<p>I have often had a fancy for writing a romance about an English yachtsman who slightly miscalculated his course and discovered England under the impression that it was a new island in the South Seas.</p>
</blockquote>
<p>I too have set sail to find the best zettel format… and found myself back home at the original and simplest.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-zk">
<p>Some will point out that this is no longer a &quot;true Luhrmann Zettelkasten.&quot; You'd be right. This is what has inspired my definition of <a href="http://evantravers.com/articles/series/creativity-systems">Creativity Systems</a>: a system designed to connect and create ideas. <a href="#fnref-zk" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-stable">
<p>I'm kind of regretting not originally writing a stand-alone &quot;moc&quot;-style essay page with a permalink. I had no clue the post would take off like it did. I may yet do that. <a href="#fnref-stable" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-gk">
<p>I'm reminded of the glorious word picture from <em>Orthodoxy</em> by G.K. Chesterton: <a href="#fnref-gk" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Note-Making on Physical Books in Drafts</title>
       <link>http://evantravers.com/articles/2021/09/19/note-making-on-physical-books-in-drafts/</link>
       <pubDate>Sun, 19 Sep 2021 17:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/09/19/note-making-on-physical-books-in-drafts/</guid>
       <description><![CDATA[ <p><a href="https://docs.getdrafts.com/changelog/#280">Drafts 28</a> has been released and with it the new Scan Document feature. Even before I got my hands on it, I knew that this feature is <em>huge</em>… this is the missing link in getting notes and quotes from physical books into my digital <a href="http://evantravers.com/articles/series/creativity-systems/">Creativity System</a>.</p>
<p>The simplest version is already done: simply use the Scan Documents feature. From a new draft, hold the <code>+</code> Button in the top left to select Scan Documents. Scan your document, and hey presto! The image is OCR'd and brought into a new draft.</p>
<p>Of course this is Drafts, and so more <a href="http://evantravers.com/articles/tags/automation/">automation</a> is possible. You can use <a href="https://actions.getdrafts.com/g/16J">the &quot;Booknotes&quot; family of Actions I wrote</a> to build a &quot;shelf&quot; of books you are currently reading, then link scanned Drafts to your main booknote with an MLA styled link… or just use the &quot;Insert MLA Citation&quot; action I created to create a reference to your scanned note. It's up to you!</p>
<p>I'm sure over the coming months the community will figure out even more clever ways to manage this, but I'm thrilled to have OCR in the Drafts toolbox. I'll probably start writing actions here to auto-fix some of the quirks of the scanning process… combining newlines into paragraphs, prefixing with <code>&gt;</code> for quotes… and honestly it'll probably cause me to buy some more physical books.</p>
<p>I'm eyeing a couple of volumes I haven't started reading yet… excited to be able to capture notes and quotes without having to retype the whole passage.</p> ]]></description>
    </item>
    <item>
       <title>Whomst styles the whostyles?</title>
       <link>http://evantravers.com/articles/2021/08/21/whomst-styles-the-whostyles/</link>
       <pubDate>Sat, 21 Aug 2021 09:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/08/21/whomst-styles-the-whostyles/</guid>
       <description><![CDATA[ <style>
.robin {
  all: revert;
  background: #fcfcfc;
  font-size: 1rem;
  color: rgb(3, 3, 3);
  font-style: normal;
  font-family: Source Sans Pro, sans-serif;
  margin: 0;
  padding: 1.5em;
  border: 1em solid rgb(242, 236, 0);
  border-radius: 0.5rem;
  line-height: 1.4rem;
}
</style>
<p>I <em>love</em> this idea… and who better to introduce it to me than <a href="https://www.robinsloan.com/">Robin Sloan</a>, <a href="https://www.robinsloan.com/books/">writer</a>, <a href="https://every.to/superorganizers/tasting-notes-with-robin-sloan-25629085">note-maker</a>, and ambassador of Keep the Blogosphere Weird in his note <a href="https://www.robinsloan.com/notes/whomst-styles/">Whomst styles?</a>:</p>
<blockquote class="robin">This is a “whostyle”: an attempt to carry the ~timbre~ of an author’s voice, in the form of their design sensibility, through into a quotation. It’s the author who defines their whostyle; the quoting site just honors it, a frame around their words.</blockquote>
<p>The idea of giving each personality a little speech bubble to represent their creative identity is lovely, and reminds me of <a href="https://en.wikipedia.org/wiki/Microsoft_Comic_Chat">Microsoft Comic Chat</a>. Let's keelhaul tiktok and <a href="https://chrisgliddon.com/a-trip-down-memory-lane-microsoft-comic-chat-6f23b8a64295">bring back altcomix-inspired IRC chats</a>!</p>
<p><img src="https://images.evantravers.com/articles/2021/08/comic.jpg" alt="image from Chris Gliddon's article" /></p>
<p>Robin frankly didn't make this easy <strong>at all</strong>, with his subtly changing background and header colors<sup class="footnote-ref"><a href="#fn-colors" id="fnref-colors" data-footnote-ref>1</a></sup>. Jacob Hall made this easier with a lovely reference to <code>all: revert</code>, and <a href="https://jacobhall.net/2021/08/horton-hears-a-whostyle/">the resulting conversation</a> in his indie-web comments is a sort of <em>charming</em> internet House of Leaves, which Robin echoes:</p>
<blockquote class="robin">I’ll add that even this glancing encounter with whostyles sharpens my annoyance with Twitter, the way it “smooshes” contributions into uniform, stackable blocks. But a timeline demands this, right? Maybe; I think a timeline of tweets brimming over with typographic variation would be tons of fun. Give us a miniature grid, let us play Müller-Brockmann!</blockquote>
<p>Hear hear! I may very well try to make my own whomstyle.css... just for giggles.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-colors">
<p>I gave up Robin... I'll try again later. :P <a href="#fnref-colors" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section><p><a href="https://www.robinsloan.com/notes/whomst-styles/" class="u-in-reply-to  is-reply">Whomst styles? - www.robinsloan.com</a></p> ]]></description>
    </item>
    <item>
       <title>Review: Gentle and Lowly by Dane C. Ortlund</title>
       <link>http://evantravers.com/articles/2021/08/19/review-gentle-and-lowly-by-dane-c-ortlund/</link>
       <pubDate>Thu, 19 Aug 2021 07:14:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/08/19/review-gentle-and-lowly-by-dane-c-ortlund/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/08/gentle.jpeg"></p><blockquote>
<p>the sweep of the New Testament teaching is that it is the sun of Christ's heart, not the cloud of my sins, that now defines me.</p>
</blockquote>
<p>I was encouraged to read this by my dad. I found it lovely both inside and out. I struggle with what Ortlund graciously calls “law-ishness…” an inordinate focus on my own works and worthiness. Mr. Ortlund redirecting my gaze towards the heart of Christ, a heart brimming with compassion that <em>runs</em> towards the sinner<sup class="footnote-ref"><a href="#fn-sinner" id="fnref-sinner" data-footnote-ref>1</a></sup>, has been a <strong>blessing</strong>.</p>
<p>I found the book’s style to be patterned after its title. It is <em>very</em> readable and re-visitable. Even the breakdown of Greek words is poetic and joyful rather than academic and snobby. It has a puritan-esque<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup> feeling to it in that way.</p>
<p>I found myself inspired and convicted in equal measure. I did not find it to be inordinately &quot;grace-oriented&quot; or ignoring the importance of God's justice and holiness. I thought it handled the divine dichotomy well. I’ll gladly revisit it again in a book study or in my future study of Christ’s character… and have been doing so regularly since I put the book down.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-sinner">
<p>Here Ortlund references yet another puritan…</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&gt; whatsoever Christ did… he did it out of love, and graced and mercy… he did it inwardly from his very bowels.
</div></code></pre>
<p>Richard Sibbes. <em>Works of Richard Sibbes</em>. Banner of Truth, 2000. <a href="#fnref-sinner" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>Hardly a surprise given the frequent quoting of John Owen, Thomas Goodwin, Sibbes and others. You are what you eat, I suppose. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>One Bag: Dirty Laundry</title>
       <link>http://evantravers.com/articles/2021/08/17/dirty-laundry/</link>
       <pubDate>Tue, 17 Aug 2021 07:32:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/08/17/dirty-laundry/</guid>
       <description><![CDATA[ <p>Having just come back from the beach, I found the following link interesting. For years I've been <a href="http://evantravers.com/articles/2018/12/10/whats-in-my-bag/#overnight-workout">taking a second empty packing cube</a> on trips. As clothes get dirty, they move into the second packing cube. when I get home I throw the contents and cube into the laundry.</p>
<p>I am not surprised to learn that Tom Bihn, king of one bag travel, has an interesting solution: a double sided stuff sack dubbed the <a href="https://www.tombihn.com/collections/instock/products/travel-laundry-stuff-sack?variant=14986380083263">Travel Laundry Stuff Sack</a>. It has a movable divider that depletes as you put on clean clothes, making the perfect amount of room for your dirty laundry on the other side. Clever.</p>
<p>I may give this a whirl… especially <a href="https://outsidebusinessjournal.com/brands/camping-and-hiking/eagle-creek-to-cease-operations-by-late-2021/">with Eagle Creek sliding into oblivion</a>.</p>
<p><em>Update</em>: My wonderful wife bought me one of these for Christmas… I've already had a chance to use it on the return trip, and am giving away a couple packers it replaces. It's great!</p>
<p>Credit to /u/mug3n on <a href="https://www.reddit.com/r/onebag/comments/p5uhhr/comment/h98mi5i/">/r/onebag</a></p> ]]></description>
    </item>
    <item>
       <title>Snowballing the Angel of Death</title>
       <link>http://evantravers.com/articles/2021/08/04/snowballing-the-angel-of-death/</link>
       <pubDate>Wed, 04 Aug 2021 10:29:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/08/04/snowballing-the-angel-of-death/</guid>
       <description><![CDATA[ <p>In <a href="https://www.workfutures.io/p/wrestling-with-the-angel-of-death">Wrestling With The Angel of Death</a>, Stowe Boyd addresses <a href="https://www.wired.com/story/to-do-apps-failed-productivity-tools/">an essay in Wired by Clive Thompson</a>.</p>
<p>I tend to agree with Mr. Boyd's points. He does a great job of walking through many of the problems… including the problem of being overwhelmed:</p>
<blockquote>
<p>“We call it snowballing,” says Amir Salihefendić, who founded the app Todoist in 2007; it currently has 30 million users. “They keep postponing stuff. And then suddenly you have a hundred tasks that you need to do.” Weeks or months later, your Todoist app is a teetering ziggurat of tasks, too painful even to behold. Omer Perchik, the creator of another app—Any.do—calls this problem “the List of Shame.”</p>
</blockquote>
<p>I do believe that Stowe is a little uncharitable to those behind him on the work-life maturity. After all, he spends his professional life imagining healthier and better information work! As Stowe mocks some of the strategies people use to avoid snowballing, I believe Stowe is forgetting the personal growth, personality, or work-culture that teach people to not treat their task lists as &quot;must do.&quot; It's not natural to most folks. I had to &quot;be enlightened:&quot; a list of tasks is a map of things I <em>could</em> do. I can <a href="http://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/">stop pushing the sisyphean boulder</a>.</p>
<p>I am always a fan of learning about other people's systems, so I enjoyed Stowe's comments and description of <a href="https://workings.substack.com/p/the-taskora-convention">his &quot;Taskora&quot; system</a>. It seems tailored to his work and writing, and I would personally characterize it as a &quot;<a href="http://evantravers.com/articles/series/creativity-systems/">creativity system</a>.&quot;</p>
<p>Stowe correctly identifies that the connective tissues between context and tasks are often lost in many task systems. I think that is part of why I love Things.app… and why emacs org-mode persists through the decades.</p>
<blockquote>
<p>Thompson describes various approaches he's used to manage tasks and they share one glaring characteristic: they were isolated from the tools and methods he uses to keep track of everything other than tasks.</p>
</blockquote>
<p>I think this is the missing link between the essays: Thompson blames the snowball effect, claiming that overwhelmed users declare bankruptcy and trying a new silver bullet tool, there fore all the tools are useless. Stowe scoffs because he has built a Stowe-shaped system based on basic principles that work for him. I too believe in principles over tools. Bullet Journaling, Omnifocus, GTD, won't fix your problem, but the principles they employ.</p>
<p>If you read my blog, you'll probably enjoy both essays. They are worth reading… but look to cherry-pick principles that apply to where you are in your productivity journey. Wholesale adoption of systems doesn't work. Understanding and building your own based on useful principles is very worthwhile.</p><p><a href="https://www.workfutures.io/p/wrestling-with-the-angel-of-death" class="u-in-reply-to  is-reply">Wrestling With The Angel of Death - www.workfutures.io</a></p> ]]></description>
    </item>
    <item>
       <title>Hamilton is an Obnoxious Aggressive</title>
       <link>http://evantravers.com/articles/2021/07/28/hamilton-is-an-obnoxious-aggressive/</link>
       <pubDate>Wed, 28 Jul 2021 07:07:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/07/28/hamilton-is-an-obnoxious-aggressive/</guid>
       <description><![CDATA[ <p>I'm in the middle of reading <em>Radical Candor</em> by Kim Scott… so the quadrants of guidance labels are kind of floating at the top of my brain. As a <em>quick</em> recap:</p>
<p>Scott presents the following diagram:</p>
<p><img src="https://images.evantravers.com/articles/2021/07/radical.png" alt="radical candor quadrants" /></p>
<p>The ideal scenario is Radical Candor<sup class="footnote-ref"><a href="#fn-definition" id="fnref-definition" data-footnote-ref>1</a></sup>, challenging directly while caring personally. The quickest way to understand the idea is to imagine a colleague entering the room with his fly down:</p>
<p><strong>Radical Candor</strong>: immediately walks up, privately whispers: &quot;Hey, your fly is down. You are good… nobody saw but me. You ok?&quot;<br />
<strong>Obnoxious Aggressive</strong>: Stretches and yells: &quot;Hey, Davis! Your fly is down… fix it.&quot;<br />
<strong>Manipulative Insincerity</strong>: Turns to their computer and direct messages ten colleagues: &quot;Davis walked out with his fly down, lol.&quot;<br />
<strong>Ruinous Empath</strong>: Freezes, and thinks &quot;Oh no! I don't want to embarrass them, what if they hate me? Surely they'll realize it before walking into that board meeting… no one will notice!&quot;</p>
<p>It honestly troubles me that the second most effective guidance style is Obnoxious Aggressive. Scott muses that this may be the &quot;jerk's advantage&quot;: even without personal care a direct challenger is still effective as a leader… but may leave a trail of bodies in his wake.</p>
<p>Which brings me to our favorite ten-dollar founding father without a father… what's his name? I think you know…</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/DSCKfXpAGHc"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>Thinking about the obnoxious aggressive personality in the light of the like-able Hamilton has helped me understand a bit more. Obnoxious aggressive is an effective, if destructive, communication style and contributes to Hamilton's success. His frenemy, Burr, sings in frustration:</p>
<blockquote>
<p>Hamilton doesn’t hesitate.<br />
He exhibits no restraint.<br />
He takes and he takes and he takes<br />
and he keeps winning anyway.</p>
</blockquote>
<p>In contrast, Burr displays more &quot;slick empathy&quot; than the bombastic Hamilton, (who manages to out-brag and out-boast a cast of <em>very</em> forceful characters!) Burr's mantra struts into the forefront in his first interaction with Hamilton… providing some free advice:</p>
<blockquote>
<p>talk less, smile more. Don't let them know what you're against or what you're for…</p>
</blockquote>
<p>This is the definition of what Scott calls Manipulative Insincerity. Someone who is able to get what they want by detecting emotional needs but playing them.</p>
<p>The show is full of characters shouting direct guidance… but Washington stands tall: His lyrics seem to embody the idea of Radical Candor: caring deeply, but challenging directly. His paternal relationship with Hamilton both recognizes Hamilton's deep need for approval and family and provides some examples of good guidance:</p>
<blockquote>
<p>WASHINGTON<br />
It’s alright, you want to fight, you’ve got a hunger. I was just like you when I was younger.<br />
Head full of fantasies of dyin’ like a martyr?<br />
HAMILTON Yes.<br />
WASHINGTON<br />
Dying is easy, young man. Living is harder.</p>
</blockquote>
<p>With three of Kim Scott's labels covered I started searching the show for an example of the last quadrant of guidance: the Ruinous Empath. This is unfortunately the one I fall into the most. It's a bit of a stretch, but I feel the closest contender is Angelica in the show-stopping toast <em>Satisfied</em>:</p>
<blockquote>
<p>I know my sister like I know my own mind<br />
You will never find<br />
Anyone as trusting or as kind<br />
If I tell her that I love him she'd be silently resigned<br />
He'd be mine<br />
She would say, &quot;I'm fine.&quot;<br />
[Angelica and Company:]<br />
She'd be lying.</p>
</blockquote>
<p>Angelica knows the truth of how she feels. She can see the danger in Hamilton's character and position. Despite this she doesn't speak because she doesn't want to hurt Eliza's heart… setting in motion a course of events that will end with at <em>least</em> three broken hearts.</p>
<p>Every person loves the strengths and weaknesses of his personality type… and despises other types' weaknesses. I am sadly no exception. Hamilton is an excellent character to examine the &quot;obnoxious aggressive&quot; communication style: I can empathize with Hamilton's motivations that drive his communication, because the show shows us his internal struggles and frailties. I will keep on looking for different personality and communication styles in fiction… it's a good way to learn to recognize patterns without being emotionally affected by the actions.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-definition">
<p>Scott regrets saying &quot;radical&quot; now, she meant &quot;new and novel&quot; but people have taken that to mean &quot;extreme without restraint.&quot; <a href="#fnref-definition" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Review: Do More Better</title>
       <link>http://evantravers.com/articles/2021/06/21/review-do-more-better/</link>
       <pubDate>Mon, 21 Jun 2021 13:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/06/21/review-do-more-better/</guid>
       <description><![CDATA[ <blockquote>
<p>Productivity is effectively stewarding my gifts, talents, time, energy, and enthusiasm for the good of others and the glory of God.</p>
</blockquote>
<p>This concise book starts with a clear theology of work, and then (borrowing heavily from other books on productivity) boils the topic down to some essential practices. This is a good thing: there is no need to reinvent the wheel, just to re-examine through a biblical worldview.</p>
<p>I like that Challies starts by discussing through the lens of <strong>stewardship</strong>. Challies argues that is not enough for the Christian to do the right things, <em>we must do them for the right reason</em>… the glory of God.</p>
<p>He resets our worldview of productivity in the light of Genesis 3: we are hindered by laziness and busyness within and thorns and thistles without.</p>
<p>He then guides the reader through a stripped-back GTD setup, focusing on crafted mission statements for each of our varied roles.</p>
<p>Challies does present a wonderful perspective on execution: that we should live <em>coram deo</em>:</p>
<blockquote>
<p>to live <em>coram deo</em> is to live once’s entire life in the presence of God, under the authority of God, to the glory of God.</p>
</blockquote>
<p>This idea is <em>like</em> the &quot;Greatness in the moment&quot; concept from <a href="http://evantravers.com/articles/2021/05/29/review-12-week-year/">12 Week Year</a>, but with a biblical bent.</p>
<p>He reset my ideas on interruptions with this great quote from C.S. Lewis:</p>
<blockquote>
<p>the great thing, if one can, is to stop regarding all the unpleasant things as interruptions of one’s “own,” or “real” life. The truth is of course that what one calls the interruptions are precisely one’s real life – the life God is sending day by day; what one calls one’s “real life” is a phantom of one’s own imagination.</p>
</blockquote>
<p>To measure how you are doing in review use the “serve and surprise” paradigm. Serve, and you’ll succeed. Surprise and you’ll excel. Ask yourself this question for each area.</p>
<p>Do More Better didn't contribute much to my tactical knowledge of productivity, but it did redeem and recalibrate my strategy. My action items:</p>
<ul>
<li>Add prayer to daily plan and review</li>
<li>Contemplate productivity &quot;coram deo&quot;.</li>
<li>Add “How can I serve and surprise?” to my questions for weekly planning for each area.</li>
<li>Write mission statements for each area of life.</li>
</ul>
<p>I believe this would be a good book for someone wanting to get to the core of &quot;how can I get organized?&quot; or a producivity-minded believer who wants to recenter on the reason we work in  the first place.</p> ]]></description>
    </item>
    <item>
       <title>Review: Farewell</title>
       <link>http://evantravers.com/articles/2021/06/18/review-farewell-the-greatest-spy-story-of-the-twentieth-century/</link>
       <pubDate>Fri, 18 Jun 2021 08:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/06/18/review-farewell-the-greatest-spy-story-of-the-twentieth-century/</guid>
       <description><![CDATA[ <p>Farewell is about a soviet double-agent towards the end of the Cold War. He exposed a massive operation of technical theft, contributing to the economic pressure western powers were exerting on the Soviet Union. It is a fascinating portrait: what sort of man betrays his country. It's also interesting as a window behind the iron curtain.</p>
<p>The authors take their time<sup class="footnote-ref"><a href="#fn-time" id="fnref-time" data-footnote-ref>1</a></sup> building the picture of Vetrov as a man… what drove him, his family life, his weaknesses until escalating into double-agent territory and then a dramatic finale.</p>
<p>After Vetrov's documents made their way to western powers, their sneaky responses were fascinating:</p>
<ul>
<li>they abused their knowledge of what targeted by the KGB to &quot;send&quot; components with bugs and viruses to cause damage to soviet technology.<sup class="footnote-ref"><a href="#fn-explosion" id="fnref-explosion" data-footnote-ref>2</a></sup></li>
<li>the US deliberately misled soviet scientists by pretending to invest in dead end technology.<sup class="footnote-ref"><a href="#fn-misdirection" id="fnref-misdirection" data-footnote-ref>3</a></sup></li>
</ul>
<p>Honestly, this feels Stephenson-esque or like the Three Body Problem… it's hard to believe that all this was going down around the time I was born. I also don't think that Russia and China didn't pay attention, you can see the same shenanigans repeated these days.<sup class="footnote-ref"><a href="#fn-shenanigans" id="fnref-shenanigans" data-footnote-ref>4</a></sup></p>
<p>Another anecdote that stood out to me: The soviets felt threatened by the US building the space shuttle, so they directed their scientists to build a clone of it called the Buran. They flew it only once… they didn’t know what to do with it!</p>
<blockquote>
<p>The Buran spacecraft is a revealing illustration of this. Before questioning its utility, simply out of mimicry or out of fear of falling behind in the arms race, the Soviets launched their own space shuttle program, based on designs stolen from Western technology. This shuttle completed only one experimental spaceflight. When asked after the Cold War why they made that spacecraft, a few engineers answered they had no idea why, it was just about copying the Americans. (location: <a href="kindle://book?action=open&amp;asin=B004GKNIWM&amp;location=3066">3066</a>)</p>
</blockquote>
<p>The success criteria for the Buran seems to be was “build a space shuttle”… they had no greater outcome (like &quot;do science in space.&quot; <a href="http://evantravers.com/articles/2020/07/09/outcomes-over-outputs/">Outcomes over Outputs</a>, anyone?</p>
<p>I enjoyed the book. It was intriguing as a study in history, in human psychology, in learning a little bit about a time and culture that is still relevant today, and a little bit about spy tradecraft. I am still amused that Vetrov got away with it for so long by <em>ignoring</em> normal tradecraft procedure… because that's what the KGB were looking for. 🤷</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-time">
<p>It may be the translation from French to English, or the fact I was reading it slowly before bed. <a href="#fnref-time" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-explosion">
<blockquote>
<p>Weiss’s plan allowed everybody to agree. He arranged to have software delivered to Line X through a Canadian company. This software was meant to control gas pipeline valves and turbines, and it was delivered with viruses embedded in the code by one of the contractors. The viruses were designed to have a delayed effect; at first the software seemed to work as per the contract specifications. The sudden activation of the viruses in December 1983 led to a huge three-kiloton gas explosion in the Urengoi gas field, precisely in Siberia where, ironically, Vetrov had just started his jail time for a crime of passion. (location: <a href="kindle://book?action=open&amp;asin=B004GKNIWM&amp;location=4446">4446</a>)
More reading<a href="https://www.risidata.com/Database/Detail/cia-trojan-causes-siberian-gas-pipeline-explosion">CIA Trojan Causes Siberian Gas Pipeline Explosion</a></p>
</blockquote>
<a href="#fnref-explosion" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a>
</li>
<li id="fn-misdirection">
<blockquote>
<p>Convinced that the Soviets had a serious interest in that particular isotope, secret services of the Western alliance decided to encourage, in a subtle way, the Russians to err further. The American journal Physical Review and the British magazine Nature published a few articles signed by renowned physicists detailing the number and the diversity of osmium-187 energy levels. Then, technical papers on the subject stopped. When this happens in technical and scientific areas, it signals to all intelligence services that this is of strategic importance. Directorate T (the soviet technology espionage group) immediately ordered its operatives to follow that trail, and more specifically in France, where the KGB had attempted to recruit quite a few scientists. At scientific conventions, where intelligence officers spent a lot of time, renowned researchers from all over the world started discussing with credibility osmium properties, describing the metal as a good candidate for use in a possible “graser.” A few labs went as far as publishing posters claiming successful experiments conducted in highly protected research centers. And last, American labs conspicuously bought significant quantities of natural osmium from the Soviet Union, major provider of this metal on world markets. (location: <a href="kindle://book?action=open&amp;asin=B004GKNIWM&amp;location=4488">4488</a>)</p>
</blockquote>
<a href="#fnref-misdirection" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a>
</li>
<li id="fn-shenanigans">
<p><a href="https://www.breitbart.com/national-security/2021/02/12/report-china-used-computer-chips-spy-american-pc-systems/">Report: China Used Computer Chips to Spy on American P.C. Systems</a> <a href="#fnref-shenanigans" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>UXLondon 2021</title>
       <link>http://evantravers.com/articles/2021/06/07/uxlondon-2021/</link>
       <pubDate>Mon, 07 Jun 2021 11:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/06/07/uxlondon-2021/</guid>
       <description><![CDATA[ <p>My team and I were able to virtually attend UXLondon 2021 last week. The team at ClearLeft did a <em>fantastic</em> job on the event. I thought it was well designed as a 100% virtual and intentionally danced between the poles of awkward and advantage. I thought the interview segments after the talks were inspired and kept a sense of engagement and momentum, and the Miro board was a great way to make people feel like they were sharing notes and insights from the discussion.</p>
<p>There was a through-line of ethics through the whole conference that I enjoyed. The &quot;design is the underdog&quot; narrative is tired and no longer true. I think that asking ourselves &quot;now that we are here, how do we avoid causing harm?&quot; is a much more mature conversation.</p>
<p>I did make some sketchnotes… but I was utterly humbled by the <a href="https://twitter.com/uxlondon/status/1400539380289347584?s=21">gorgeous work</a> of <a href="https://www.instagram.com/zldrawings/">Zsofi Lang</a>… which I ended up aping. 🤷 I think the monochrome strategy will be a permanent addition to my toolbox.</p>
<p>I need to go back and rewatch some of the sessions, but here is a sampling of sketch notes with my main takeaway:</p>
<h3><a href="#continuous-discovery-by-theresa-torres" aria-hidden="true" class="anchor" id="continuous-discovery-by-theresa-torres"></a>Continuous Discovery by <a href="https://www.producttalk.org/">Theresa Torres</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/continuousdiscovery.jpg" alt="continuous discovery">
  <figcaption>Interview to discover, not to confirm.</figcaption>
</figure>
<h3><a href="#killing-products-by-amy-zima" aria-hidden="true" class="anchor" id="killing-products-by-amy-zima"></a>Killing Products by <a href="https://amyzima.com/">Amy Zima</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/killingproducts.jpg" alt="killing products">
  <figcaption>Think of products as portfolios of features. Prune your portfolio.</figcaption>
</figure>
<h3><a href="#already-a-researcher-by-gregg-bernstein" aria-hidden="true" class="anchor" id="already-a-researcher-by-gregg-bernstein"></a>Already a Researcher by <a href="http://gregg.io/">Gregg Bernstein</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/alreadyaresearcher.jpg" alt="already a researcher">
  <figcaption>Everyone can research… so make it easy for everyone.</figcaption>
</figure>
<h3><a href="#designing-for-cognitive-bias-by-david-dylan-thomas" aria-hidden="true" class="anchor" id="designing-for-cognitive-bias-by-david-dylan-thomas"></a>Designing for Cognitive Bias by <a href="https://www.daviddylanthomas.com/">David Dylan Thomas</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/cognitivebias.jpg" alt="cognitive bias">
  <figcaption>Framing bias is a tool for good and evil.</figcaption>
</figure>
<h3><a href="#how-to-get-wicked-good-by-karen-vanhouten" aria-hidden="true" class="anchor" id="how-to-get-wicked-good-by-karen-vanhouten"></a>How to Get Wicked Good by <a href="https://karenvanhouten.com/">Karen VanHouten</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/wickedgood.jpg" alt="how to get wicked good">
  <figcaption>Endurance is to be trained. Tools are gear.</figcaption>
</figure>
<h3><a href="#better-onboarding-by-krystal-higgins" aria-hidden="true" class="anchor" id="better-onboarding-by-krystal-higgins"></a>Better Onboarding by <a href="https://www.kryshiggins.com/">Krystal Higgins</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/betteronboarding.jpg" alt="better onboarding">
  <figcaption>It's the whole journey until the user achieves the main goal of the product.</figcaption>
</figure>
<h3><a href="#practical-growth-design-by-molly-norris-walker" aria-hidden="true" class="anchor" id="practical-growth-design-by-molly-norris-walker"></a>Practical Growth Design by <a href="https://www.norris-walker.design/">Molly Norris Walker</a></h3>
<figure>
  <img src="https://images.evantravers.com/articles/2021/06/practicalgrowthdesign.jpg" alt="practical growth design">
  <figcaption>Optimize low-barriers to action before high-barriers to action to move the user along the value path.</figcaption>
</figure>
<hr />
<p>It was a great event, and I look forward to the Festival throughout the rest of the month!</p> ]]></description>
    </item>
    <item>
       <title>Review: 12 Week Year</title>
       <link>http://evantravers.com/articles/2021/05/29/review-12-week-year/</link>
       <pubDate>Sat, 29 May 2021 20:14:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/05/29/review-12-week-year/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/05/12wy.JPG"></p><p>After several false starts I finally finished reading <em>The 12 Week Year</em> at the end of last year. I have mixed feelings about the full system they sell… but I heartily recommend the base principles.</p>
<p>The book starts with a simple claim: we already know what to do, we just don't do it:</p>
<blockquote>
<p>The barrier standing between you and the life you are capable of living is a lack of consistent execution.</p>
</blockquote>
<p>This really did grab me. Even with all my systems and automation, the most important tasks and projects seem perpetually shunted into a never-arriving future. The first half of the book argues that we abandon our systems before a chance of effect. They present a useful a mental model called the Emotional Cycle of Change:</p>
<ol>
<li><strong>Uninformed optimism</strong>: &quot;Running will be awesome!&quot;</li>
<li><strong>Informed pessimism</strong>: &quot;My feet hurt!&quot;</li>
<li><strong>Valley of despair</strong>: &quot;Is it always like this?&quot; (This is where we usually quit!)</li>
<li><strong>Informed optimism</strong>: &quot;It's just sore… and I can do this tomorrow.&quot;</li>
<li><strong>Success and fulfillment</strong>: &quot;I'm a runner.&quot;</li>
</ol>
<p>The authors recommend a two-fold system: first creating an aspirational vision, then planning within the twelve weeks. I tend to fight the touchy-feely aspects of the aspirational vision, but it has helped me:</p>
<blockquote>
<p>the critical first step to executing well is creating and maintaining a compelling vision of the future that you want even more than you desire your own short-term comfort.</p>
</blockquote>
<p>After you've designed the vision, you plan within the constraints of the twelve weeks… and use the bounds to create what the authors call &quot;productive tension&quot;:</p>
<blockquote>
<p>a heightened sense of urgency and increased focus on the critical few…</p>
</blockquote>
<p>While I'm all about the <a href="http://evantravers.com/articles/2019/09/01/review-essentialism-by-greg-mckeown/">critical few</a>, I find constant deadlines to be <em>stressful</em>. However, I know folks who love deadlines. Everyone responds <a href="https://bookworm.fm/107/">differently to the same motivations</a>.</p>
<p>Despite my apprehension with the celebration of urgency, I've been experimenting with some of the core principles over the last six months.</p>
<p>In my task manager I have had a couple odd &quot;projects&quot;: Leadership at Work. House. Marriage. They contain tasks but they never really complete. It's hard to feel like I'm making progress, no celebration or review… these areas are simultaneously the most important areas of my life… and the places where the most important tasks go to hide for <em>years</em>.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2021/05/Q2images.jpeg" alt="Projects in a task manager, showing Q2">
</figure>
<p>I &quot;canceled&quot; the Eternal Projects, and migrated their contents to new projects labeled something like &quot;&lt;project&gt; Q1&quot;. I also gave each project a Deadline corresponding with the end of my first 12 week year. I'm now on my second or third 12 week year. Merely having a goal of what I want to accomplish in the formerly &quot;Eternal Projects&quot; within those 12 weeks, and having regular times to review and adjust my strategies for accomplishing those tasks means that many formerly &quot;stuck&quot; tasks have been completed.</p>
<p>This past quarter I started a proper 12WY plan: identifying the two or three practices that will bring me closer to our family's aspirational goal. I also am using their idea of &quot;strategic blocks&quot; (very similar to <a href="http://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/">Newport's Deep Work time</a>) to make sure that I put time on those critical few actions. I still lack a proper scoreboard like they recommend, but I will certainly implement this next quarter. (Probably in my <a href="http://evantravers.com/articles/series/simple-markdown-zettelkasten/">Simple Markdown Zettelkasten</a>!) For now, I can see the completed tasks in each project at the end of a 12WY.</p>
<p>In many ways this has all pointed out a weakness in my previous implementations of <a href="http://evantravers.com/articles/2020/12/28/plan-your-year/">Plan Your Year</a> (which I still <em>love</em>!) In previous years I never revisited the plan so the first quarter of the year was bursting with productive action… dying somewhere around April. I think the two systems are fully compatible and intend to use them together. I would say that Plan Your Year is more family oriented, and less deadline-focused, if that is something that tends to drag your motivation more than propel it.</p>
<p>I still feel <em>very</em> strangely toward the book. I first feel aversion towards the celebration of deadlines, but the wisdom of being diligent with the time we have coupled with the helpful mental model of the Emotional Cycle of Change has made this a book I keep talking about.</p> ]]></description>
    </item>
    <item>
       <title>Scifi Drives the Future</title>
       <link>http://evantravers.com/articles/2021/04/14/scifi-drives-the-future/</link>
       <pubDate>Wed, 14 Apr 2021 07:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/04/14/scifi-drives-the-future/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/04/scifi_history.jpg"></p><p>A couple of weeks ago, I opened Overcast and saw an episode title that immediately grabbed me: <a href="https://www.omnibusproject.com/341">The Memex</a>.</p>
<p>The Memex is a fictional piece of hardware in an essay &quot;As We May Think.&quot; The Memex predicts that as available knowledge becomes overwhelming, the critical task for a knowledge worker is to extend their own ability to access relevant information. The Memex anticipated technology advances and miniaturization to imagine a desk that could contain hundreds of tiny records, which could be projected onto a screen for the reader. In 1945, Bush described voice to text, document scanning, and hypertext documents.</p>
<p>I had become aware of the idea of the of the Memex through my reading and researching on note-taking and networked thought… it often gets referenced by Zettelkasten devotees. I had even mentioned it in <a href="http://evantravers.com/articles/2021/03/03/creativity-systems/">a previous article</a>… but until the Omnibus episode I was not aware of the remarkable life of Vannevar Bush, and some of the connections that were teased out by The Omnibus.</p>
<p>As I listened to Ken and John free-associate about this fantastic story… it reminded me of another scifi imagination experiment: <a href="https://en.wikipedia.org/wiki/Knowledge_Navigator">The Knowledge Navigator</a>.</p>
<p>Last December I attended a <a href="http://evantravers.com/articles/2020/12/14/sketchnotes-ux-vision-intensive/">UX Vision Intensive</a>, where I was re-exposed to this little piece of technology history. In 1987, a team at Apple made a video depicting a knowledge worker, sitting a desk, accessing interactive information through voice control. Sound familiar?</p>
<p>And there's a direct connection between the two. If you are a student of computing history, you won't be surprised by the name: Douglas Engelbart.</p>
<p>While a few of the connections here are conjecture and somewhat mythological, the power of a &quot;scifi&quot; User Experience Vision is evident.</p>
<h4><a href="#1945-as-we-may-think" aria-hidden="true" class="anchor" id="1945-as-we-may-think"></a>(1945) As We May Think</h4>
<p><img src="https://images.evantravers.com/articles/2021/04/memex.jpeg" alt="memex" /></p>
<blockquote>
<p>Consider a future device …  in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.</p>
</blockquote>
<p>Vannevar Bush, <em><a href="https://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/">As We May Think</a></em>, The Atlantic, 1945<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>1</a></sup>.</p>
<h3><a href="#1961-douglas-engelbart-reads-as-we-may-think" aria-hidden="true" class="anchor" id="1961-douglas-engelbart-reads-as-we-may-think"></a>(1961) Douglas Engelbart reads As We May Think</h3>
<blockquote>
<p>The pioneer of human–computer interaction Douglas Engelbart was inspired by Bush's proposal for a co-evolution between humans and machines. In a 1999 publication, Engelbart recollects that reading &quot;As We May Think&quot; in 1945 infected him with the idea of building a mechanism that could navigate and extend the pool of human knowledge. Around 1961, Engelbart re-read Bush's article and from 1962 onward Engelbart developed a series of technical designs.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>2</a></sup></p>
</blockquote>
<h3><a href="#1968-the-mother-of-all-demos" aria-hidden="true" class="anchor" id="1968-the-mother-of-all-demos"></a>(1968) The Mother of All Demos</h3>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/yJDv-zdhzMY"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<blockquote>
<p>The live demonstration featured the introduction of a complete computer hardware and software system called the oN-Line System or, more commonly, NLS. The 90-minute presentation essentially demonstrated almost all the fundamental elements of modern personal computing: windows, hypertext, graphics, efficient navigation and command input, video conferencing, the computer mouse, word processing, dynamic file linking, revision control, and a collaborative real-time editor (collaborative work). Engelbart's presentation was the first to publicly demonstrate all of these elements in a single system.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>3</a></sup></p>
</blockquote>
<p>Engelbart's work at SRI didn't just stay there... the ideas and his collaborators spread throughout what would become the future of Silicon Valley.</p>
<blockquote>
<p>Engelbart slipped into relative obscurity by the mid-1970s. As early as 1970, several of his researchers became alienated from him and left his organization for Xerox PARC, in part due to frustration, and in part due to differing views of the future of computing.<sup class="footnote-ref"><a href="#fn-parc" id="fnref-parc" data-footnote-ref>4</a></sup></p>
</blockquote>
<h3><a href="#1979-apple-visits-the-xerox-labs" aria-hidden="true" class="anchor" id="1979-apple-visits-the-xerox-labs"></a>(1979) Apple visits the Xerox labs.</h3>
<p>Inspired by Engelbart's ideas, the engineers at Xerox had designed the Alto. At some point, a team from Apple came to visit this team.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>5</a></sup></p>
<p>This is the most contentious connection in the story, mostly having to do with Apple-haters claiming theft or Apple-lovers claiming collaboration. Whatever the actual truth, there is definitely some kind of connection:</p>
<blockquote>
<p>But a number of Apple engineers were already familiar with PARC, its work, or technologies like the mouse. Bill Atkinson had read about Smalltalk as an undergraduate. Some had worked at PARC: Jef Raskin spent time there during a sabbatical year at Stanford, and had a number of friends who were researchers there. Finally, there were even <mark>some Apple employees whose had learned about the mouse while working for Douglas Engelbart at SRI in the 1960s and early 1970s</mark>, or Tymshare in the later 1970s.<sup class="footnote-ref"><a href="#fn-stanford" id="fnref-stanford" data-footnote-ref>6</a></sup> (emphasis mine)</p>
</blockquote>
<h3><a href="#1987-apple-imagines-the-knowledge-navigator" aria-hidden="true" class="anchor" id="1987-apple-imagines-the-knowledge-navigator"></a>(1987) Apple imagines the Knowledge Navigator</h3>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/umJsITGzXd0"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>After the success of their early computers and looking to the future, Apple produces a video imagining a hypertext enabled computing object that sits on a desk, accesses information through voice commands, and supports a knowledge worker. (In this case, a rather surly professor.) The Knowledge Navigator shows a (then) impossible vision including:</p>
<ul>
<li>hypertext</li>
<li>interactive graphics</li>
<li>collaborative real-time editing</li>
<li>video conferencing</li>
</ul>
<p>That vision caught on, and they were able to keep it in their eye for 23 years until...</p>
<h3><a href="#2010-apple-inc-releases-the-first-ipad" aria-hidden="true" class="anchor" id="2010-apple-inc-releases-the-first-ipad"></a>(2010) Apple Inc releases the first iPad</h3>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/QaEYIYJLVlw"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<blockquote>
<p>Apple co-founder Steve Jobs stated in a 1983 speech about the company:[9]</p>
<blockquote>
<p>&quot;[Our] strategy is really simple. What we want to do at Apple, is we want to put an incredibly great computer in a book that you can carry around with you and learn how to use in 20 minutes ... And we really want to do it with a radio link in it so you don't have to hook up to anything and you're in communication with all of these larger databases and other computers.&quot;<sup class="footnote-ref"><a href="#fn-jobs" id="fnref-jobs" data-footnote-ref>7</a></sup></p>
</blockquote>
</blockquote>
<p>But they weren't done yet...</p>
<h3><a href="#2011-apple-releases-version-10-of-siri" aria-hidden="true" class="anchor" id="2011-apple-releases-version-10-of-siri"></a>(2011) Apple releases version 1.0 of Siri</h3>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/agzItTz35QQ"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<blockquote>
<p>The notion of Siri was firmly planted at Apple 25 years ago though “Knowledge Navigator” with the voice of the assistant was only a concept prototype.[2] In one of the videos, a man is seen asking the assistant to search for an article published 5 years before his time, the assistant finds it and tells the article being dated to 2006, and due to this we can conclude that the video is set to take place in September 2011. In October 2011, Apple relaunched Siri, a voice activated personal assistant software vaguely similar to that aspect of the Knowledge Navigator[5] just a month after their initial prediction.<sup class="footnote-ref"><a href="#fn-5" id="fnref-5" data-footnote-ref>8</a></sup></p>
</blockquote>
<h3><a href="#---" aria-hidden="true" class="anchor" id="---"></a>---</h3>
<p>I'm fascinated at the staying power of this concept... the futuristic, scifi visions of The Memex, The Mother of All Demos, and the Knowledge Navigator form a chain of progress that leads to the device on which I wrote and researched most of this article. This device's capabilities were imagined in 1945... a vision of a potential future passed down for <em>sixty-six</em> years until it reaches my hands. 🤯</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-3">
<p><a href="https://www.omnibusproject.com/341">Omnibus Project #341</a> <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-4">
<p><a href="https://en.wikipedia.org/wiki/Memex#Legacy">Memex#Legacy | Wikipedia</a> <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-1">
<p><a href="https://en.wikipedia.org/wiki/The_Mother_of_All_Demos">The Mother of All Demos | Wikipedia</a> <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-parc">
<p><a href="https://en.wikipedia.org/wiki/Douglas_Engelbart#Tymshare_and_McDonnell_Douglas">Douglas Engelbart | Wikipedia</a> <a href="#fnref-parc" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-2">
<p><a href="https://www.mac-history.net/computer-history/2012-03-22/apple-and-xerox-parc">Mac History: Apple and Xerox Parc</a> <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-stanford">
<p><a href="https://web.stanford.edu/dept/SUL/sites/mac/parc.html">Mac and Parc | web.stanford.edu</a> <a href="#fnref-stanford" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="fn-jobs">
<p><a href="https://en.wikipedia.org/wiki/IPad_(1st_generation)#History">iPad 1st Generation#History | Wikipedia</a> <a href="#fnref-jobs" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="fn-5">
<p><a href="https://en.wikipedia.org/wiki/Knowledge_Navigator#Siri">Knowledge Navigator#Siri | Wikipedia</a> <a href="#fnref-5" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="8" aria-label="Back to reference 8">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Atomic Notes Are Not Tied to Note Taking Strategies</title>
       <link>http://evantravers.com/articles/2021/03/30/atomic-notes-are-not-tied-to-note-taking-strategies/</link>
       <pubDate>Tue, 30 Mar 2021 07:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/30/atomic-notes-are-not-tied-to-note-taking-strategies/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I'm struggling to get my arms around the next post in my Creative Systems series. It's not that I'm not sure about it… I've been using my latest iteration happily for a month or so… it's just hard to concisely encapsulate the decisions and mistakes that lead to this particular version.</p>
<p>While I am working on it, here's one lovely realization: a beautiful thing about atomic notes is that capture an <em>idea</em> not a moment tied to context. Therefore, they can be extracted out from any note-taking strategy:</p>
<ul>
<li>Mindmaps</li>
<li>Sketchnotes</li>
<li>Outlines/bullets</li>
<li>Highlights from on Kindle</li>
</ul>
<p>I've come to value this quality pretty highly, because I like to vary my note-taking style depending on the kind of knowledge I'm learning. I can be creative and varied in capture, but after I have filtered and discerned the vital few atomic notes… they all have a singular format and home.</p> ]]></description>
    </item>
    <item>
       <title>Building Habits with Streaks iOS</title>
       <link>http://evantravers.com/articles/2021/03/24/building-habits-with-streaks-ios/</link>
       <pubDate>Wed, 24 Mar 2021 11:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/24/building-habits-with-streaks-ios/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/03/home.PNG"></p><p>For the past two years, I have been habit tracking in my bullet journal. It worked very well for some habits… but others seemed to slip through my grasp. I pick up my journal at the start of the workday, so using the bullet journal as a habit tracker was less of a prompt, and more of a report. I also found I was prone to lie to myself about completion. 😓</p>
<p>Last month, I decided to give <a href="https://apps.apple.com/us/app/streaks/id963034692">Streaks</a> another whirl.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> I have seen some progress on my goals, and am pretty encouraged.</p>
<p>Some things that have made it stick:</p>
<h2><a href="#focused-goals" aria-hidden="true" class="anchor" id="focused-goals"></a>Focused Goals</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2021/03/stats.PNG">
</figure>
<p>I am attempting to build three habits:</p>
<ol>
<li>Consistent quiet time in the morning</li>
<li>A mindfulness minute at the beginning and end of the workday</li>
<li>Writing my wife a thoughtful note.</li>
</ol>
<p>I'm also trying to break one bad habit: <em>messing with my phone before the other three are complete</em>. 🤷‍♂️</p>
<p>Streaks can support all kinds of habits… but I'm focusing on the three that I believe will help me achieve my overall goals for the year. I'm also leaving out habits that are already habits… brushing my teeth, working out, etc.</p>
<h2><a href="#targeted-notifications" aria-hidden="true" class="anchor" id="targeted-notifications"></a>Targeted Notifications</h2>
<figure class="iphone">
  <img src="https://images.evantravers.com/articles/2021/03/notifications.PNG">
</figure>
<p>I've deliberately created a timeline of notifications to help me fight the battle of an intentional morning. I think of them as a little sherpa, nudging me to stay on the path. Some targets:</p>
<ul>
<li>I wake up at 6a, so there's a notification waiting for me on my Lock Screen to remind me to do First Things First.</li>
<li>I usually wrap up my run/FitBod at 7a, so there's another notification on my Lock Screen encouraging me to get into my Quiet Time.</li>
</ul>
<h2><a href="#staring-me-in-the-face" aria-hidden="true" class="anchor" id="staring-me-in-the-face"></a>Staring me in the Face</h2>
<figure class="iphone">
  <img src="https://images.evantravers.com/articles/2021/03/homepage.PNG">
</figure>
<p>I really like the widget living on my Home Screen. Building habits creates action. Actions determine my future… so it's important enough to demand the real estate every time I open my phone.</p>
<p>I really like the app… it's well suited to help me battle for intentional, screen-less mornings. I am aware of the irony of using an iPhone app to promote a morning without screens… but it's working.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I had played with it when The Sweet Setup first posted it, but I didn't want to add another app to my world. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Robin Rendle ･ Every website is a gift</title>
       <link>http://evantravers.com/articles/2021/03/23/robin-rendle-every-website-is-a-gift/</link>
       <pubDate>Tue, 23 Mar 2021 22:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/23/robin-rendle-every-website-is-a-gift/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>In general, I love Robin's essays… and this is definitely how I feel about this website.</p>
<blockquote>
<p>“Let a website be a worry stone,” Ethan wrote last year and I believe that’s so very true. We can treat our personal sites like stress balls and use all that pent up anxiety about the state of the world; we can tidy up the fonts, improve the Lighthouse score, tweak the colors, or edit the copy of an old blog post just because it helps.</p>
</blockquote>
<p>👏👏👏</p>
<p><a href="https://www.robinrendle.com/notes/every-website-is-a-gift.html">Robin Rendle ･ Every website is a gift</a></p> ]]></description>
    </item>
    <item>
       <title>Weekly Reviews: Things.app  Plaintext</title>
       <link>http://evantravers.com/articles/2021/03/23/weekly-reviews-things-app-to-plaintext/</link>
       <pubDate>Tue, 23 Mar 2021 09:01:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/23/weekly-reviews-things-app-to-plaintext/</guid>
       <description><![CDATA[ <p>I'm still using Things.app to handle the recurring checklists for rituals in my life: planning, review, etc.</p>
<p>Since I <a href="http://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/">released my automated weekly review in Things</a>, I have been recording a summary of the week in the Notes field of the generated Things Project.</p>
<p>As I work on building a more plaintext view of my life, I thought it would be cool to bring this into Obsidian, so that I could tie Weekly Review updates about projects to their development and completion.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<p>So I wrote some automation! First I backed up my wiki folder, (using git finally!) then I ran some test runs until I arrived at this:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">currentApplication</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">includeStandardAdditions</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tagNames</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Rituals</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Weekly</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">status</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;completed&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">completionDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">formatted_date</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getFullYear</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getMonth</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padStart</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;0&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padStart</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;0&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`## $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> #rituals/weekly</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">doShellScript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`echo &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; &gt; ~/Dropbox/wiki/weeklyreview/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">formatted_date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">doShellScript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`echo &quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- [[weeklyreview/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">formatted_date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|Weekly Review]]&quot; &gt; ~/Dropbox/wiki/journal/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">formatted_date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>It iterates through my completed projects, filters to projects that have a tag and a name structure, then yanks out their notes, shells out to write a file and appends a link to that file to a daily note.</p>
<p>I'm imagining a daily note as a sort of bullet journal, linking out to other notes. That's not how I wrote daily notes in the past… so I'm tempted to write more regexes to reformat… but I should probably just forgive myself and move on.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I'm pretty excited about the possibility of a project being resurrected, and being able to find old decisions via unlinked mentions and searches. It's probably another step driving me towards org-mode. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Headspace v1.0</title>
       <link>http://evantravers.com/articles/2021/03/20/headspace-v1-0/</link>
       <pubDate>Sat, 20 Mar 2021 17:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/20/headspace-v1-0/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/03/headspace-v1.png"></p><p>I've been working daily with Headspace <a href="http://evantravers.com/articles/2020/08/07/headspace-block-all-the-things/">since I finished it</a>… and I've made a couple updates!</p>
<h2><a href="#-its-a-spoon" aria-hidden="true" class="anchor" id="-its-a-spoon"></a>🥄 It's a spoon</h2>
<p>I've <a href="https://github.com/evantravers/headspace.spoon">pulled the script out into a spoon</a>, so you can use it without having to clone my entire setup. 🎉</p>
<h2><a href="#-requiring-intent" aria-hidden="true" class="anchor" id="-requiring-intent"></a>🧭 Requiring intent</h2>
<p><img src="https://images.evantravers.com/articles/2021/03/intent.png" alt="requiring intent" /></p>
<p>A huge reason I fell in love with using Toggl to track my time was declaring my intent on how I intended to spend my time. I have added a field for a space called <code>intentRequired</code>. If <code>true</code>, Headspace won't let you enter that space without prompting for a Description (which will be logged to Toggl.)</p>
<p>Headspace now pull the frontmost window's title as a suggestion, so you can just roll with that or enter your own. Using the window title is <em>really</em> good for entering meetings! I'm excited to have more definition to my weekly Toggl reports.</p>
<p>As before, you can also just enter a description by inclosing the description in quotes.</p>
<h2><a href="#-pomodoro-timers" aria-hidden="true" class="anchor" id="-pomodoro-timers"></a>⏲ Pomodoro Timers</h2>
<p>While I was rewriting the parser for the query, I added the ability to add a timer to a space. When typing out the first query, you can specify the time you want to stay in that space in minutes with <code>:&lt;integer&gt;</code>. So <code>shall :5</code> will match the space named Shallow for 5 minutes, then it'll play a sound and prompt for a new space. This is great for time-blocking for play or email.</p>
<h2><a href="#-faster" aria-hidden="true" class="anchor" id="-faster"></a>🏎 Faster!</h2>
<p>Most importantly for my daily use… it's a <em>lot</em> faster. By making the HTTP request to toggl.com asynchronous, the UI can display immediately instead of blocking for the response. <strong>Much</strong> better.</p>
<h2><a href="#breaking-changes" aria-hidden="true" class="anchor" id="breaking-changes"></a>Breaking Changes:</h2>
<ul>
<li>all <code>snake_case</code> variables are now <code>camelCase</code>, update your space definitions accordingly.</li>
<li><code>layout</code> now uses <code>hs.window.layout.apply()</code> instead of my Autolayout library… I'm going to slowly switch over everything to use that anyway.</li>
<li>I changed the API to match what seems to be the Spoon standard, and that also means <a href="https://github.com/evantravers/hammerspoon-config/commit/8cdbd816c5fd687ffcbb97ed5426a1fd856d88a5">the way that the Toggl API key is loaded</a> (decoupled from secrets.lua).</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Defining Creativity Systems</title>
       <link>http://evantravers.com/articles/2021/03/08/defining-creativity-systems/</link>
       <pubDate>Mon, 08 Mar 2021 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/08/defining-creativity-systems/</guid>
       <description><![CDATA[ <h2><a href="#1" aria-hidden="true" class="anchor" id="1"></a>1.</h2>
<p>In the <a href="http://evantravers.com/articles/2021/03/03/creativity-systems/">last article</a>, I proposed that there exists a set of note-taking strategies and systems that generate or discover connections between ideas: &quot;Creativity Systems.&quot;</p>
<p>The reason for this extra definition: the PKM/Zettelkasten<sup class="footnote-ref"><a href="#fn-definitions" id="fnref-definitions" data-footnote-ref>1</a></sup> community fights small holy wars over technique. While technique is important, we forget to study and celebrate the shared benefits of linked notes. (Don't believe me? Search for &quot;ZK ID in digital systems&quot; or &quot;folgezettel&quot;. I'll wait.)</p>
<p>The idea of Creativity Systems frees each person to pursue the techniques and strategies that best empower their desired outputs. Sascha said it best in the <a href="https://zettelkasten.de/introduction/#a-zettelkasten-is-a-personal-tool-for-thinking-and-writing">Zettelkasten Introduction</a>:</p>
<blockquote>
<p>there is one Zettelkasten per person, and one person per Zettelkasten. Thinking is a different process from communicating with another person. You want your Zettelkasten to be a personal thinking tool.</p>
</blockquote>
<p>Through the transformations of my Creativity System (or <a href="http://evantravers.com/articles/series/simple-markdown-zettelkasten/">Simple Markdown Zettelkasten</a>), I admit to having been tool and technique focused. The experimentation and research has identified a few advantages of an intentional Creativity System (or note-taking) system:  Connecting the dots, filtering to the vital few, and developing original thought.</p>
<h2><a href="#2" aria-hidden="true" class="anchor" id="2"></a>2.</h2>
<h3><a href="#filtering-to-the-vital-few" aria-hidden="true" class="anchor" id="filtering-to-the-vital-few"></a>Filtering to the Vital Few</h3>
<p><img src="https://images.evantravers.com/articles/2021/03/filtering.jpeg" alt="" /></p>
<blockquote>
<p>In the beginner’s mind there are many possibilities, but in the expert’s there are few.</p>
</blockquote>
<p>― Shunryu Suzuki, <em>Zen Mind, Beginner's Mind: Informal Talks on Zen Meditation and Practice</em></p>
<p>Since I started taking hyper-textual and atomic<sup class="footnote-ref"><a href="#fn-principles" id="fnref-principles" data-footnote-ref>2</a></sup> notes it has changed the way I read and listen. Every book, article, blogpost, conversation and sermon become part of a giant conversation that your mind is having with itself. No longer attempting to drink the ocean and capture <strong>everything</strong>, I find myself hunting for the vital few<sup class="footnote-ref"><a href="#fn-vitalfew" id="fnref-vitalfew" data-footnote-ref>3</a></sup>, fleeting slips that fit into that greater conversation.</p>
<p>Because I hold to the &quot;restate, not quote&quot; constraint, I find myself taking <strong>more</strong> notes on <em>less</em> topics. I am constantly asking myself in process and techniques: &quot;<mark>is this worth taking a note on?</mark>&quot; For now, my process is usually:</p>
<ol>
<li>Capture into Drafts.app or Bullet Journal.<sup class="footnote-ref"><a href="#fn-instant" id="fnref-instant" data-footnote-ref>4</a></sup></li>
<li>Let it stew until the end of the day... many potential notes show their lack of value simply by sitting.</li>
<li>At the end of the day, I adjust and re-state the remaining few into my Creativity System.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>5</a></sup></li>
</ol>
<p>If nothing else, this process of &quot;stewing&quot; and &quot;restating&quot; is a form of spaced repetition<sup class="footnote-ref"><a href="#fn-spaced" id="fnref-spaced" data-footnote-ref>6</a></sup>. Since I've started putting several layers of filters between my hand and my system, I'm surprised how often a note doesn't make it all the way.</p>
<h3><a href="#developing-original-thought" aria-hidden="true" class="anchor" id="developing-original-thought"></a>Developing Original Thought</h3>
<p><img src="https://images.evantravers.com/articles/2021/03/developing.jpeg" alt="" /></p>
<p>I wish I had learned this a decade ago. I spent so much of my life as merely an aggregator and router of knowledge. I used to have Google Reader hooked up to Twitter, and as a result I mindlessly blasted some 20k+ links. (I am <em>not</em> proud.) I wanted to share and create… but I merely added to the noise.</p>
<p>I am no longer content to consume and regurgitate. I want to contribute something new and personal. A useful first step is the &quot;restating&quot; of an idea that I talked about in Filtering the Vital Few. After you've made a note, you must <mark>cultivate and revisit the most promising trains of thought</mark>. Having filtered to the Vital Few, high-quality dots ready to connect… something personal and creative can emerge!</p>
<p>Some of the ways I've used to develop ideas…</p>
<ul>
<li>Rewriting.</li>
<li>Outlining.</li>
<li>Transforming a written idea to visual and back.</li>
<li>Mind mapping.</li>
</ul>
<p>Mike Schmitz's<sup class="footnote-ref"><a href="#fn-schmitz" id="fnref-schmitz" data-footnote-ref>7</a></sup> article about <a href="https://thefocuscourse.com/why-mind-mapping-works/">why mind mapping works</a> drove home me that capturing ideas isn't enough, they have to be developed. I don't think it's an accident that he chose mind mapping for developing ideas. Relating ideas by strong connections allows exploration and discovery… <em>so</em> powerful.</p>
<h3><a href="#connecting-the-dots" aria-hidden="true" class="anchor" id="connecting-the-dots"></a>Connecting the Dots</h3>
<p><img src="https://images.evantravers.com/articles/2021/03/connecting.jpeg" alt="" /></p>
<blockquote>
<p>Creativity is about connections, and connections are not made by siloing everything off into its own space. New ideas are formed by interesting juxtapositions, and interesting juxtapositions happen when things are out of place.</p>
</blockquote>
<p>― Austin Kleon, <em>Keep Going: 10 Ways to Stay Creative in Good Times and Bad</em></p>
<p>This is <em>the</em> reason to try a Creativity System or zettelkasten. Creating high-quality links between thoughts is powerful and fun. A link between two thoughts allows you to:</p>
<ul>
<li>ask the question &quot;how are these related?&quot; (Often creates more notes)</li>
<li>follow a train of thought</li>
<li>Discover related ideas that you would not have put together.</li>
<li>so much more!</li>
</ul>
<p>Other advantages I've noticed while working in a digital hyperlinked system (a zettelkasten):</p>
<ul>
<li>I have found that &quot;what does this relate to?&quot; is easier to answer than &quot;where does this belong?&quot; (Especially for abstract ideas.)</li>
<li>In most note-taking systems I've used the only relationship type is &quot;proximity&quot;: same tag, same folder, similar title or date. Nick Milo (<a href="https://www.linkingyourthinking.com/">Linking Your Thinking (LYT)</a>) wrote a <em>very</em> good <a href="https://medium.com/@nickmilo22/in-what-ways-can-we-form-useful-relationships-between-notes-9b9ec46973c6">article about the value of useful relationships between notes</a>.</li>
<li><strong>Trails of links can record and &quot;replay&quot; a train of thought</strong>. As I navigate through my system, leaving links in my wake... I record the thinking I had. I am even starting to &quot;fork&quot; a thought, pursuing multiple courses of thinking simultaneously! This feels as powerful as branching in git, and I can't wait to see how it improves my thinking and writing.<sup class="footnote-ref"><a href="#fn-forking" id="fnref-forking" data-footnote-ref>8</a></sup></li>
</ul>
<h2><a href="#3" aria-hidden="true" class="anchor" id="3"></a>3.</h2>
<p>These three attributes of Creativity Systems fascinate me. While I favor atomic, hypertextual notes, there are <em>so</em> many ways to accomplish the same goals. A different system that jumps to mind is Jerry Seinfeld's system for developing standup, <a href="https://tim.blog/2020/12/09/jerry-seinfeld-transcript/">as described to Tim Ferris</a>:</p>
<ol>
<li>Capture into a little notebook.</li>
<li>Restate the good captures onto the legal pad. (<strong>Filter</strong> raw material)</li>
<li>Sit down regularly in front the work: <strong>Developing</strong> and <strong>Connecting</strong> the raw observations into polished jokes.</li>
</ol>
<p>I do believe that this Filter -&gt; Develop -&gt; Connect framework describes the work practices of many successful writers and thinkers.</p>
<p>The goal of any Creativity System is to build a consistent, pleasant system that helps you filter, develop, and connect. Atomic hypertextual notes are simply one (highly effective!) path to get there. Your system should be your own… pick and choose the tools and techniques based on who you are and what you are trying to do.</p>
<p>Next up… I'm going to discuss the recent transformations of my system, the problems I've faced, and my current implementation.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-definitions">
<p>One could argue that you could simply use the existing Personal Knowledge Management (PKM) initialism, however PKM contains systems that only answer &quot;where does this go&quot; and don't have any connecting power.</p>
<p>Using the phrase Creativity System allows freedom of invention in your particular system…  and it keeps me from being a hypocrite when I call my mutant system a &quot;Zettelkasten&quot;. 🤣 <a href="#fnref-definitions" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-principles">
<blockquote>
<p>Let us begin with the most important traits of a Zettelkasten:</p>
<ul>
<li>It’s hyper-textual.</li>
<li>It adheres to the <em>Principle of Atomicity</em>.</li>
<li>It is personal.</li>
</ul>
</blockquote>
<p><a href="https://zettelkasten.de/introduction/#why-are-we-so-interested-in-luhmann-s-zettelkasten">Introduction to the Zettelkasten Method • Zettelkasten Method</a> <a href="#fnref-principles" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-vitalfew">
<p>I believe this comes from the Pareto Principle, but it entered my lexicon after reading <a href="http://evantravers.com/articles/2019/09/01/review-essentialism-by-greg-mckeown/">Essentialism by Greg McKeon</a>. <a href="#fnref-vitalfew" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-instant">
<p>Instant capture means that you can capture anything, but it doesn't mean that you should <em>keep</em> or process everything. <a href="#fnref-instant" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-1">
<p>Nick Milo calls the difference between capture and restating notes &quot;taking notes vs. making notes.&quot; <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-spaced">
<p>Spaced repetition is the principle that long lasting learning is created through repetitive re-engagement with the material.</p>
<blockquote>
<p>The single biggest change that Anki brings about is that it means memory is no longer a haphazard event, to be left to chance. Rather, it guarantees I will remember something, with minimal effort. That is, Anki makes memory a choice.</p>
</blockquote>
<p><a href="http://augmentingcognition.com/ltm.html">Augmenting Long-term Memory</a> <a href="#fnref-spaced" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="fn-schmitz">
<p>And he's recently playing around with Obsidian. 🤷‍♂️ <a href="#fnref-schmitz" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="fn-forking">
<p>I believe (and could be wrong) that this aspect of forking and trains of thought is the &quot;truest&quot; attribute of a Luhmann Zettelkasten, and is one that I intend to foster and continue in my implementation. <a href="#fnref-forking" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="8" aria-label="Back to reference 8">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Creativity Systems</title>
       <link>http://evantravers.com/articles/2021/03/03/creativity-systems/</link>
       <pubDate>Wed, 03 Mar 2021 09:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/03/03/creativity-systems/</guid>
       <description><![CDATA[ <p>As the interest in zettelkasten grows, I've become aware that I've been using the word wrongly. A <a href="https://zettelkasten.de/introduction/">Luhmann Zettelkasten</a> is a very specific system, one of a whole family of related systems and tools, all united by the linking of notes.</p>
<p>All of these are Personal Knowledge Systems (PKM), but within the realm of PKM there are other systems focused only on storage and retrieval. Idea generation through idea connection is a special quality of systems similar to a Luhmann Zettelkasten. I am finding it helpful to categorize these idea-linking systems as <strong>Creativity Systems</strong>.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>1</a></sup></p>
<h2><a href="#from-productivity-to-creativity" aria-hidden="true" class="anchor" id="from-productivity-to-creativity"></a>From Productivity to Creativity</h2>
<p>Ever since David Allen released <em>Getting Things Done</em> there has been a healthy cottage industry constantly talking about &quot;Productivity Systems,&quot; new ways to… get things done.</p>
<p>I have studied &quot;productivity&quot; for over a decade. If I've learned one thing, it is that <strong>not everyone needs Omnifocus</strong>. Some problems are best served by a simple paper list.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup> Each time I have chased a tool (solution) instead of understanding my particular needs (problem) I end up frustrated. Simple is better. As you encounter more complex problems you can adopt more complex solutions, but start simple.</p>
<p>A progression of increasingly complex problems for Productivity Systems to solve:</p>
<ol>
<li>Remember you have <em>something</em> to do. (String tied around finger, flip a ring, etc.)</li>
<li>Remember the actual task you have to do. (Paper to-do list, writing on hand)</li>
<li>Be reminded at the right time to do the task (Reminders.app, calendar, Bullet Journal)</li>
<li>Hide most of your increasingly large list of tasks so that you can focus on that which is doable in this context. (GTD, Things, Bullet Journal, Omnifocus)</li>
</ol>
<p>A temptation is to skip steps 1-3 to attempt solving a basic problem with a complex solution. I'm often guilty of skipping because one of my internet heroes gushes about a useful tool that solves a specific need for them… and I adopt it just because it is cool.</p>
<p>Do not adopt a &quot;level 4&quot; solution <em>unless</em> you have a &quot;level 4&quot; problem to solve.</p>
<p>Hang onto that thought…</p>
<h3><a href="#note-taking-memory-and-creativity" aria-hidden="true" class="anchor" id="note-taking-memory-and-creativity"></a>Note-taking, Memory, and Creativity</h3>
<blockquote>
<p>Consider a future device …  in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.”<sup class="footnote-ref"><a href="#fn-memex" id="fnref-memex" data-footnote-ref>3</a></sup></p>
</blockquote>
<p>Long before Vannevar Bush wrote about his &quot;memex,&quot;<sup class="footnote-ref"><a href="#fn-memex" id="fnref-memex-2" data-footnote-ref>3</a></sup> people have been figuring out ways to extend or empower their memory.</p>
<p>In many &quot;Productivity Systems&quot; notes are simply &quot;context that isn't actionable.&quot; (This is largely the way I have used notes most of my life.) We acknowledge the benefit of being able to find things later, and we also have an innate understanding that the act of recording seems to help us remember even without the tool.</p>
<p>Describing some levels of complexity for notes similar to my outline for Productivity:</p>
<ol>
<li>Quickly store information for near-future use.</li>
<li>Archive information for long-term recall.</li>
<li>Organize the archive such that recall is easier for the future.</li>
<li>Use the structure and organization of the archive to surface new ideas.</li>
</ol>
<p>Just like to-dos, not everyone needs a system with contexts, reviews, domains, custom queries, etc. Each person should choose the simplest system that solves their particular needs.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>4</a></sup></p>
<p>During the process of <a href="http://evantravers.com/articles/2021/02/25/reflection-and-recall/">considering my inputs and outputs</a> I realized that I <em>do</em> have a &quot;level 4&quot; notes problem. Not only do I need to store and recall simple facts, but my creative outputs benefit from connecting the dots in new ways.</p>
<p>That's what attracts me to Creativity Systems: not simply to remember and recall, but to <mark>discover and generate new ideas</mark>.</p>
<p>This is the core attribute of a Creativity System: it allows us to explore and create connections between ideas. The value of a Creativity System increases with the strength of those connections and the signal/noise ratio of the ideas.</p>
<p>That's where these posts are headed… talking about my zettelkasten-esque creative system, how it's changing and what I'm trying, and why I think it's helpful.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-4">
<p>By this definition, a true Luhmann Zettelkasten is a species of Creativity System, and so is LYT Kit, and Zettelkasten + Folgetezettel, and so on. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>Products and systems like <a href="https://ugmonk.com/products/analog-starter-kit">Ugmonk's Analog</a> and the <a href="http://evantravers.com/articles/tags/bullet-journal/">Bullet Journal</a> have capitalized on the shift away from raw efficiency towards effective focus on the vital few. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-memex">
<p>Vannevar Bush, <em><a href="https://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/">As We May Think - The Atlantic</a></em>, The Atlantic, 1945. For a frightening futurist take on the same idea, check out: Charles Stross. <em>Accelerando</em>. Penguin, 2005. <a href="#fnref-memex" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a> <a href="#fnref-memex-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3-2" aria-label="Back to reference 3-2">↩<sup class="footnote-ref">2</sup></a></p>
</li>
<li id="fn-1">
<p>For the past ten years, simple plaintext with a powerful search has been the recall tool of choice for me, although I still like to write notes by hand. It's good for my soul. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Reflection and Recall</title>
       <link>http://evantravers.com/articles/2021/02/25/reflection-and-recall/</link>
       <pubDate>Thu, 25 Feb 2021 11:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/25/reflection-and-recall/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/02/analog-digital.jpeg"></p><p>I'm in the middle of a large refactoring of my input and outputs<sup class="footnote-ref"><a href="#fn-inspired" id="fnref-inspired" data-footnote-ref>1</a></sup>: cataloging (and limiting!) the kinds of input I receive, and creating systems for how I handle those inputs.</p>
<p>While the above is a <em>very</em> imperfect picture, I've found this exercise incredibly useful. By formalizing &quot;where does this thing go,&quot; I also simplify the answer to the question &quot;where <em>did</em> that thing go?&quot;</p>
<p>Some of the inputs<sup class="footnote-ref"><a href="#fn-throughline" id="fnref-throughline" data-footnote-ref>2</a></sup> I'm examining…</p>
<ul>
<li>Reading books.</li>
<li>Talking with people. (Meetings or conversations.)</li>
<li>Digital reading (blog posts and documentation).</li>
</ul>
<p>Some of the outputs I'm optimizing for…</p>
<p><strong>Doing.</strong> There are things you have to do. 🤷‍♂️ Having a good capture -&gt; execution system is very useful for adulting. In addition to projects with a start and finish, there are also things I should do… forever. Quiet time, eating, sleeping, and exercise.</p>
<p><strong>Creating.</strong> Professionally I synthesize context and user insights into written documentation or design artifacts. I <em>recall</em> ideas from the inputs as <a href="https://austinkleon.com/2012/05/04/tedx-talk-steal-like-an-artist/">&quot;dots&quot; to connect in new ways</a> revealing new insights and creative work.</p>
<p><strong>Growing.</strong> I'm not a machine that just can take infinite amounts of information and create infinite quantities of output. I need to take a step back, assess, and make a call as to what I spend my limited time on. For years I optimizing purely for throughput and never took the time to <em>reflect</em> on my purpose. By over-optimizing for efficiency, I was wasting my time in a thousand directions at once.</p>
<p>I am <em>not</em> done yet… but here are some insights so far. Two primary reasons to design a system is to <em>recall and reflect</em>. Recall so I don't forget, reflect so that I don't optimize myself into pointless burnout.</p>
<p>With recall and reflection as two of the goals, I've found: <strong>Analog processes make reflection effective. Digital systems make recall easy.</strong></p>
<p>If this sounds familiar, this is basically a rediscovery of what <a href="https://twitter.com/bobbleheadjoe">Mike Schmidt</a> said: Paper is for thinking, digital is for creating.</p>
<p><strong>Doing creates more input.</strong> Anything you do is going to increase your exposure to people and material that creates input. I'm not 100% sure what to do with this thought yet… but I feel like if I'm overwhelmed by the amount coming in… I may need to look at my Doing area.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-inspired">
<p>I was inspired by <a href="https://faithbasedproductivity.com/my-input-workflow/">Mike Schmidt's thoughtful refactoring</a> of his own production system. <a href="#fnref-inspired" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-throughline">
<p>There's a through-line here… all inputs are related to people… some are ideas to remember, some are tasks to accomplish… but all come from written or spoken conversations. <a href="#fnref-throughline" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Automate Your User Experience</title>
       <link>http://evantravers.com/articles/2021/02/23/automate-your-user-experience/</link>
       <pubDate>Tue, 23 Feb 2021 09:29:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/23/automate-your-user-experience/</guid>
       <description><![CDATA[ <p>As a User Experience Designer, I help design tools for a living.</p>
<p>I work among folks with an eye for user-centric design principles, affordances, and user research. Even though we work in this industry, it's not uncommon to hear or voice complaints about the tools and software we use… with no effort to fix it.  &quot;I wish that X worked a little more like Y&quot; or &quot;why can't I get straight to Z functionality without all these menus?&quot;</p>
<p>While you can't change <em>everything</em> about the software you use, you can certainly tweak and hack your way to a better experience. You can employ user experience principles on your own digital toolset… making you designer, stakeholder, and user all in one! It's terribly fun, but then again… I <em>love</em> <a href="http://evantravers.com/articles/tags/automation/">making tools</a>.</p>
<p>The key phrase here is <em>automation</em>. Automation is the gateway to improving your own work experience through applying UX principles on your own tools… or even creating a brand new tool. Automation can allow you to connect the scattered parts of the different tools in your life to allow for a better, more personalized experience.</p>
<h2><a href="#tools" aria-hidden="true" class="anchor" id="tools"></a>Tools</h2>
<p>There's <em>so</em> much to say here, but here are some places to start looking:</p>
<h3><a href="#ios-shortcuts" aria-hidden="true" class="anchor" id="ios-shortcuts"></a>iOS Shortcuts</h3>
<p>The best thing to start automating is the device you use the most… the <span class="strike">dopamine addiction factory</span> powerful computer in your pocket.</p>
<p><strong>One function</strong>: I like using Shortcuts to get deep into an app to accomplish the one task that I opened the app to do. Strava for instance, has inboxes, news feeds, addictive comments and likes... but I only need to open it to &quot;go run.&quot; I've basically replaced Strava with an iOS Shortcut that starts a run, and I find myself on the trail faster by bypassing the gameification and social aspects.</p>
<p><strong>Chaining</strong>: Another great use of iOS Shortcuts is to tie together common workflows. When I'm away from home and I get in the car, 90% of the time I text my wife to let her know when I'll be home, open Google Maps directions just to get the traffic avoidance, and start a podcast with my AirPods connected. Now that's just one button on my phone.</p>
<h3><a href="#airtable" aria-hidden="true" class="anchor" id="airtable"></a>Airtable</h3>
<p>Airtable is a very cool tool. Think of it as a super spreadsheet app with many connections and automatable hooks, and the ability to view your spreadsheet in different forms and views. <a href="https://twitter.com/sirupsen">@sirupsen</a> has already written <a href="https://sirupsen.com/minimum-viable-airtable/">the quintessential article</a> on this, so I'll just quote him.</p>
<blockquote>
<p>While you may have the ambition to turn your idea into a full-blown app, that takes hours, days or weeks. Creating an Airtable for your first prototype to get intimate with the data and get something out there takes minutes. Some systems just don’t deserve the time investment of a full-blown app up front. Worse, good ideas never get started because the upfront cost is high. That’s why today any personal system I build starts as an Airtable. I follow this 4-phase system when prototyping with Airtable, starting with the Minimum Viable Airtable:</p>
</blockquote>
<p>Airtable in particular works really well as a custom database to prototype something you wished existed for storing and relating data.</p>
<h3><a href="#iftttzapier" aria-hidden="true" class="anchor" id="iftttzapier"></a>IFTTT/Zapier</h3>
<p><a href="http://ifttt.com">If This, Then That</a> and <a href="https://zapier.com">Zapier</a> are to the web what iOS Shortcuts is to your iPhone. If you kind of wished that every post you made to Instagram was automatically saved to a Dropbox folder, or every workout was automatically inserted into a Google Docs spreadsheet, these are the tools for you. IFTTT isn't as powerful as Zapier, but is often a good starting point for most folks.</p>
<h2><a href="#look-behind-you" aria-hidden="true" class="anchor" id="look-behind-you"></a>Look Behind You</h2>
<p>One way to teach yourself to find these opportunities is to look backward through your day... what did you do? Do you do that every time? Is there a checklist of tasks that you do the same way every time that needs to be consistent? Is there something that's particularly tedious? If you are a UX practitioner... these are a sort of desire path. We can <strong>optimize our own workflows</strong> using the principles we use in our day jobs.</p>
<p>I was a &quot;programmer&quot; for <em>years</em> before I started thinking this way.</p>
<p>Nowadays, my <a href="http://evantravers.com/articles/tags/automation/">automation tag</a> is <em>filled</em> with these realizations: <a href="http://evantravers.com/articles/2020/12/15/automatic-newsletter-using-drafts/">newsletters</a>, <a href="http://evantravers.com/articles/2020/11/06/one-button-workout-shortcut/">working out</a>, <a href="http://evantravers.com/articles/2020/09/03/automating-blog-images-using-alfred-file-actions/">moving files to new folders</a>, <a href="http://evantravers.com/articles/2020/06/12/hammerspoon-handling-windows-and-layouts/">moving windows on screen</a>... the list goes on.</p>
<hr />
<h2><a href="#other-resources" aria-hidden="true" class="anchor" id="other-resources"></a>Other Resources</h2>
<h3><a href="#how-to-build-your-idea-into-an-mvp-and-fake-it-into-reality--capiche" aria-hidden="true" class="anchor" id="how-to-build-your-idea-into-an-mvp-and-fake-it-into-reality--capiche"></a>How to Build Your Idea Into an MVP and Fake it Into Reality | Capiche</h3>
<blockquote>
<p>Start by thinking through your app idea. Sketch out how a basic version would work. What data would you need to store, how would it be entered, and what would be the best way to display and organize the data? Do you need to do anything with the data once you have it?</p>
<p>Then think through what tools would be needed. You could start with a form app to collect data, and a spreadsheet or database to store the data. Built-in integrations or a tool like Zapier or IFTTT could connect the two. Or, you could use a tool like Airtable or Zoho Creator that includes forms and a database in one.</p>
<p>Then, what do you want to do with the data? With Google Sheets, say, you could embed a filtered spreadsheet into a website for an easy way to share the data. Or in Airtable, you could build kanban boards, calendars, and organized lists of the data. If you want to do more than just show it off, integration tools could come to the rescue again. Connect your spreadsheet or database to Twilio, say, to send SMS messages, or to Gmail and MailChimp to send emails. Treat apps like LEGO and pull them together, and you can bring your idea to life in an app built from apps.</p>
</blockquote>
<p><a href="https://capiche.com/e/minimum-viable-product-guide">How to Build Your Idea Into an MVP and Fake it Into Reality | Capiche </a></p>
<h3><a href="#automators---relay-fm" aria-hidden="true" class="anchor" id="automators---relay-fm"></a>Automators - Relay FM</h3>
<blockquote>
<p>Automation makes your life easier and everyone can do it. We tell you how.</p>
</blockquote>
<p><a href="https://www.relay.fm/automators">Automators - Relay FM </a></p> ]]></description>
    </item>
    <item>
       <title>A Sheep All My Life</title>
       <link>http://evantravers.com/articles/2021/02/15/a-sheep-all-my-life/</link>
       <pubDate>Mon, 15 Feb 2021 07:55:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/15/a-sheep-all-my-life/</guid>
       <description><![CDATA[ <blockquote>
<p>[15] And [Jacob] blessed Joseph and said,</p>
<p>“The God before whom my fathers Abraham and Isaac walked,
<mark>the God who has been my shepherd all my life</mark> long to this day,
[16] the angel who has redeemed me from all evil, ….” <sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
</blockquote>
<p>Oh Lord,</p>
<p>I love this <strong>so</strong> much. I unfortunately see myself in Jacob the Deceiver, thief of birthright and blessing, practicer of shady shepherding, foolish husband, fearful brother, and favorite-playing father.</p>
<p>But.</p>
<p>I <em>also</em> identify with Israel, heir to a promise, chosen before the foundation of the world, receiver of visions, wrestler with God, disarmed and renamed to the Glory of God.</p>
<p>It brings me so much joy to read this prayer of Jacob's, here at the end of his tale. It's so personal. You are <em>his</em> God.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup> You are <em>his</em> shepherd.<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup> You are the wrestling, redeeming angel.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>4</a></sup> Most importantly, after <em>years</em> of Jacob's conniving and bargaining with God, Jacob confesses: You have been there the all his life.</p>
<p>Lord, give me the same gospel-soaked vision and confession. That unworthy as I am, you have been my shepherd <em>my</em> whole life. This morning I am a grateful, humble sheep. Amen.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p><a href="https://www.esv.org/verses/Genesis48:15">Genesis 48:15</a>–16a, ESV. Emphasis mine. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>Jacob spends much of Genesis describing God as merely &quot;the God of my father.&quot; Here at the end, we get to see a much more intimate view. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>Jacob spent a lot of time as a shepherd. Well he knew that sheep are <em>stupid</em>, prone to wander, helpless, and defenseless. It's impossible to imagine that for him &quot;My shepherd&quot; is merely a figure of speech. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-4">
<p>Jacob choosing to say redeeming instead of renaming here is fascinating. He understands what is at play… not his reputation, not his place in history… something deeper. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Curly Underlines in Kitty + Tmux + Neovim</title>
       <link>http://evantravers.com/articles/2021/02/05/curly-underlines-in-kitty-tmux-neovim/</link>
       <pubDate>Fri, 05 Feb 2021 09:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/05/curly-underlines-in-kitty-tmux-neovim/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/02/curly.png"></p><p>Curly Underlines (or &quot;undercurls&quot;) started with Kitty<sup class="footnote-ref"><a href="#fn-kitty" id="fnref-kitty" data-footnote-ref>1</a></sup>, but has been pulled into Neovim<sup class="footnote-ref"><a href="#fn-neovim" id="fnref-neovim" data-footnote-ref>2</a></sup> and looks especially good with the fancy new Language Server stuff.<sup class="footnote-ref"><a href="#fn-languageserver" id="fnref-languageserver" data-footnote-ref>3</a></sup></p>
<p>It's only in tmux 3.x, so if you are on OS X you may need to <code>brew uninstall tmux &amp;&amp; brew install tmux --HEAD</code>. The config is simple, but <em>hard</em> to find! I eventually found <a href="https://github.com/yokenzan/dotfiles/blob/374cd5951ecd3403b8032a8f39d0524bca10f12e/.tmux.conf">@yokenzan's dotfiles on GitHub</a> with the solution:</p>
<p>Put the following in your .tmux.conf:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">set -as terminal-overrides &#39;,*:Smulx=\E[4::%p1%dm&#39;  # undercurl support
</div><div class="line" data-line="2">set -as terminal-overrides &#39;,*:Setulc=\E[58::2::%p1%&lbrace;65536&rbrace;%/%d::%p1%&lbrace;256&rbrace;%/%&lbrace;255&rbrace;%&amp;%d::%p1%&lbrace;255&rbrace;%&amp;%d%;m&#39;  # underscore colours - needs tmux-3.0
</div></code></pre>
<p>If your terminal supports it, and you have tmux 3.x, you should be able to see curly underlines when you paste <code>printf '\e[4:3mUnderlined\n'</code> into a terminal. 🙌</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-kitty">
<p>Curly and colored underlines · Issue #1145 · xtermjs/xterm.js</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&gt; This is originally a feature of Kitty, now also adopted by VTE (GNOME Terminal and friends). Technically two separate features, but they mostly make sense together, e.g. for spell checking.
</div><div class="line" data-line="2">&gt; 
</div><div class="line" data-line="3">&gt; Apparently vim and neovim have already / are about to support these, see e.g. vim undercurl, vim color, neovim.
</div></code></pre>
<p><a href="https://github.com/xtermjs/xterm.js/issues/1145">Curly and colored underlines · Issue #1145 · xtermjs/xterm.js </a> <a href="#fnref-kitty" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-neovim">
<p>tui: handle Smulx extension capability (extended underline) (#9097) · neovim/neovim@42f492a</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&gt; tui: handle Smulx extension capability (extended underline) (#9097)
</div><div class="line" data-line="2">&gt; 
</div><div class="line" data-line="3">&gt; This was added to ncurses terminfo for vte and tmux.
</div><div class="line" data-line="4">&gt; 
</div><div class="line" data-line="5">&gt; Ref: tmux/tmux#1492 (comment)
</div><div class="line" data-line="6">&gt; 
</div><div class="line" data-line="7">&gt; Assumes color support is available when extended underline is supported.
</div><div class="line" data-line="8">&gt; 
</div><div class="line" data-line="9">&gt; Ref: tmux/tmux#1492 (comment)
</div></code></pre>
<p><a href="https://github.com/neovim/neovim/commit/42f492ac99058bd1cd56c3c7871e7e464b2a5e24">tui: handle Smulx extension capability (extended underline) (#9097) · neovim/neovim@42f492a </a> <a href="#fnref-neovim" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-languageserver">
<p>Thank you <a href="http://megalithic.io">@megalithic</a> for helping me get it set up! <a href="#fnref-languageserver" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Update: RSS Feed Without Links</title>
       <link>http://evantravers.com/articles/2021/02/03/rss-feed-update/</link>
       <pubDate>Wed, 03 Feb 2021 14:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/03/rss-feed-update/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Quick Update: I'm planning on experimenting with changing up my monthly link-dump posts (currently found in the <a href="/articles/tags/links">links</a> tag) and doing more single posts with commentary... mostly things coming out of my note-taking and zettelkasten.</p>
<p>Just in case some of y'all don't like that, but you <em>still</em> want to read my original content... there's a different RSS feed... it basically blocks the <code>links</code> tag. You can see both of them at the new <a href="/feeds">feeds</a> page.</p>
<p>Since y'all, loyal <strong>RSS Club Members</strong>, are the &quot;main&quot; audience of the blog... if you have an opinion on this, just <a href="/contact">let me know</a>.</p> ]]></description>
    </item>
    <item>
       <title>Drafts to Cardhop</title>
       <link>http://evantravers.com/articles/2021/02/02/drafts-to-cardhop/</link>
       <pubDate>Tue, 02 Feb 2021 23:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/02/02/drafts-to-cardhop/</guid>
       <description><![CDATA[ <p>I've fallen in love with <a href="https://apps.apple.com/us/app/cardhop/id1448744070">Cardhop</a> as a way to keep track of relationships… especially after dumping Facebook.</p>
<p>I'll frequently open Drafts to jot down notes after a chat with someone… prayer requests, interests, whatever. I would then copy / paste it over to Cardhop, but after a month or two of this, I have found a better way. (And no JavaScript!)</p>
<p>It's a simple Drafts action with two steps:</p>
<p>First I grab the body of the draft and stick it in the clipboard.</p>
<p><img src="https://images.evantravers.com/articles/2021/02/clipboard.png" alt="clipboard" /></p>
<p>Second I search open Cardhop, searching for the title of the Draft.</p>
<p><img src="https://images.evantravers.com/articles/2021/02/cardhop-url.png" alt="cardhop-url" /></p>
<p>I can now select the right contact in Cardhop, and paste in my notes. Since CardHop has that lovely large Notes field with a &quot;Add Timestamp&quot; button, I can add a time stamp, and paste in my notes.</p>
<p><img src="https://images.evantravers.com/articles/2021/02/johnsmith.png" alt="johnsmith" /></p>
<p>I'm sure that with some Shortcuts shenanigans, you could achieve the exact same result in Contacts.app as well.</p>
<p>I hope to write more about how I'm using Contacts and Cardhop to keep in contact with people after largely leaving social media… but I need to live in the system for a while first.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: January</title>
       <link>http://evantravers.com/articles/2021/01/31/books-and-links-january/</link>
       <pubDate>Sun, 31 Jan 2021 17:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/31/books-and-links-january/</guid>
       <description><![CDATA[ <p>Happy new year! 2021 hasn't let up where 2020 left off... I hope y'all are safe and filling up your journals with notes on the goodness around you.</p>
<p>I'm really enjoying starting to actually work with rather than simply work <em>on</em> my PKM/zettelkasten/thing... it's starting to really bear fruit in blog posts, documentation, and hopefully deeper thoughts.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>On deck: Leadership Strategy and Tactics by Jocko Willinck, Design Systems by Alla Kholmatova, Do More Better by Tim Challies</p>
<h3><a href="#the-12-week-year-by-brian-p-moran-and-michael-lennington" aria-hidden="true" class="anchor" id="the-12-week-year-by-brian-p-moran-and-michael-lennington"></a>The 12 Week Year by Brian P. Moran and Michael Lennington</h3>
<p>I'll likely do a separate review post on this book at some point, I'm still swishing around the ideas and trying a few of them. I like to have tried some of the ideas from a book before I speak about them.</p>
<p>I really resonated with this central idea:</p>
<blockquote>
<p>we don't have a knowledge problem, we have an execution problem.</p>
</blockquote>
<p>The whole book is a system of creating a personal engagement with long-term strategic goals, and attaining them by simply executing and measuring the most impactful actions. I feel that this book will work best for highly motivated people who work well with urgency.</p>
<p>I also have been thinking about the Emotional Cycle of Change a <em>lot</em> since reading the book... especially with my three year old. She is experiencing many new things these days.</p>
<h3><a href="#house-of-leaves-by-mark-z-danielewski" aria-hidden="true" class="anchor" id="house-of-leaves-by-mark-z-danielewski"></a>House of Leaves by Mark Z. Danielewski</h3>
<p>Content Warning: Foul language and graphic sexual depictions (which I skipped).</p>
<p>What a strange, textural, meta experience. I just finished it, and I can't decide how I feel about it. To talk about House of Leaves is to spoil House of Leaves, so if you are curious, message me directly and I'll talk about my thoughts wtih you.</p>
<p>The colors, fonts, typography, fictional and real sources, edits, footnotes, poetry, and mythology entice us to enter this labyrinth of a book again and again… but I don’t think I will.</p>
<p>Sometimes a house is just a house.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#the-underground-market-for-300000-pet-fish" aria-hidden="true" class="anchor" id="the-underground-market-for-300000-pet-fish"></a>The underground market for $300,000 pet fish</h3>
<p>This is really wild.</p>
<blockquote>
<p>Owners will go above and beyond to keep their fish aesthetically pleasing.</p>
<p>Dedicated “fish beauticians run profitable businesses performing plastic surgery on fish. In a bid to flaunt the most beautiful specimen, owners give their pets eye lifts ($90), chin jobs ($60), and tail alterations ($60).</p>
</blockquote>
<p><a href="https://thehustle.co/the-underground-market-for-300000-pet-fish/">The underground market for $300,000 pet fish</a></p>
<h3><a href="#that-xor-trick" aria-hidden="true" class="anchor" id="that-xor-trick"></a>That XOR Trick</h3>
<p>As someone who spends most of his coding time in contrived puzzles ala Advent of Code, this was a fun read.</p>
<blockquote>
<p>The XOR trick: If we have a sequence of XOR operations a ^ b ^ c ^ ..., then we can remove all pairs of duplicated values without affecting the result.</p>
</blockquote>
<p><a href="https://florian.github.io//xor-trick/">That XOR Trick</a></p>
<h3><a href="#convex-and-concave-dispositions" aria-hidden="true" class="anchor" id="convex-and-concave-dispositions"></a>Convex and Concave Dispositions</h3>
<blockquote>
<p>in high-dimensional environments the most common setting that you can expect to find yourself in is not a universally convex or universally concave one, but rather a saddle point: a point where the local region is convex in some directions but concave in other directions.</p>
</blockquote>
<p>This is an interesting mental model. Anecdotally, I believe that it's true. Theoretically, I can't decide if it's related to relativism vs absolutism in regards to truth, it merely personality differences. I do appreciate the acknowledgment that both positions are valuable.</p>
<p><a href="https://vitalik.ca/general/2020/11/08/concave.html">Convex and Concave Dispositions</a></p>
<h3><a href="#the-great-unraveling" aria-hidden="true" class="anchor" id="the-great-unraveling"></a>The Great Unraveling</h3>
<p>This is an odd article… while I certainly don't agree with Bari's worldview, I find that I agree with many of the sentiments within.</p>
<p>I'm not sure I'm willing to simply &quot;blame the machines,&quot; to blame a technological oligarchy as the blind tool masters of our broken universe.</p>
<blockquote>
<p>How did Heine see it? How, a hundred years before Hitler, did he possess the terrible vision that “a play would be performed in Germany which will make the French Revolution look like an innocent idyll”?</p>
<p>He understood, first, that the “talisman” was fragile, that the veneer of civilization was so much thinner than most people understood. And he understood that if it was torn “the ancient stony gods,” who never really died, could be awakened from their sleep once again.</p>
<p>Second, <strong>Heine saw with total clarity that revolutions in the street begin as revolutions in sense-making</strong>. “Do not laugh at one who foresees in the region of the visible the revolution that has already occurred in the invisible domain of the spirit. Thought precedes action as lightning precedes thunder.”</p>
<p>The invisible revolutions of the 21st century — revolutions that began with word games and lies — are increasingly apparent in the “region of the visible.”</p>
</blockquote>
<p>(Emphasis mine.)</p>
<p>This reminded me of Proverbs 4:23:</p>
<blockquote>
<p>[23] Keep your heart with all vigilance,
for from it flow the springs of life.</p>
</blockquote>
<p><a href="https://bariweiss.substack.com/p/the-great-unraveling">The Great Unraveling</a></p>
<p>I found this a good caution with which to enter 2021.</p> ]]></description>
    </item>
    <item>
       <title>First Look: Goruck Claymore Sling Bag</title>
       <link>http://evantravers.com/articles/2021/01/27/first-look-goruck-claymore-sling-bag/</link>
       <pubDate>Wed, 27 Jan 2021 17:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/27/first-look-goruck-claymore-sling-bag/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/claymore.jpg"></p><p>Goruck announced <a href="https://www.goruck.com/products/claymore">a simple clone of the classic Claymore bag</a> for $35, and I ordered one within hours. It arrived today.</p>
<p>For over a year, I have been looking for a small-ish dad bag for church and coffeeshop use… just big enough for a water bottle, book, pen… maybe an iPad. Fully aware that I'm <a href="http://evantravers.com/articles/2018/12/10/whats-in-my-bag/">a Goruck fan-boy</a>, but so far it is <em>perfect</em>.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/pocket_size.jpg" alt="fits up to a field pocket" /></p>
<p>It is <strong>simple</strong>: one zippered document pocket, two book sized pockets with small sewn in loops for pens or keychains. The twin front pockets are quite expandable… they pretty much <em>exactly</em> fit a <a href="https://www.goruck.com/products/gr1-field-pocket-black">GR1 Field pocket</a>. The ever-present loop field for patches is color-matched and in the front. Simple buckles, no strap adjustment.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/bag_in_bag.jpg" alt="it fits in the main pocket of the GR1 like it was made for it." /></p>
<p>The minimalism results in a <em>very</em> lightweight and flat profile… it reminds me of the similarly brilliant <a href="https://hillpeoplegear.com/Products/CategoryID/7/ProductID/55">HPG Tool Roll</a>, although that may just be the coyote colorway. I think it’ll be a perfect “personal item” for on-plane use (whenever we get to do that again!). I am also looking forward to using this on my next long trip… most trips I wind up carrying a small duffel or sling bag for camera, water, snacks when I'm headed to a museum or other location where a huge ruck can draw raised eyebrows… this fulfills that mission wonderfully, and the size of it's pocket means that my existing inserts and organization will work 100%. Is it leaving the path of one bag freedom? Yes. Do I wander the earth out of one bag in zero drop shoes doing ecotourism? No.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/bag_detail.jpg" alt="bag detail" /></p>
<p>I'll keep playing with it, but I have every expectation that I'll be loading it up with my mask, iPad and external keyboard for a coffeeshop expedition soon. 👍</p> ]]></description>
    </item>
    <item>
       <title>Update: Hammerspoon Snipping Tool</title>
       <link>http://evantravers.com/articles/2021/01/27/updated-hammerspoon-snipping-tool/</link>
       <pubDate>Wed, 27 Jan 2021 16:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/27/updated-hammerspoon-snipping-tool/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/snippet.png"></p><p>Part of my knowledge system is saving critical highlights from blogs and documentation and storing it for use in newsletters, documentation, texts, or my zettelkasten.</p>
<p>I was using Brave's &quot;run Javascript from Apple Events&quot; feature for <a href="http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/#bonus-snip-browser-highlight-to-drafts-as-a-simple-markdown-zettelkasten">the last version</a>… but I decided to move to some UI scripting so that it works with <em>every</em> browser in OS X. Here's the code:</p>
<p>The desired format that I've programmed into Drafts's built-in share feature looks like this:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">Title
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Highlighted content inside of quotes
</div><div class="line" data-line="4"></span>
</div><div class="line" data-line="5">[Title](http://theurl.com/of/the/story)
</div></code></pre>
<p>The hardest part of this was ensuring that <code>&gt; </code> characters for a quote were in front of every line in the snippet... I found a <a href="https://stackoverflow.com/questions/19326368/iterate-over-lines-including-blank-lines">concise iterator on stack overflow</a> (because I'm still horrible at lua!)</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magiclines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>gmatch<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(.-)</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>I wrap the whole thing in a <code>hs.hotkey.modal</code> called <a href="http://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper</a>, then I go ahead and grab the focused window, and its title.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;s&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> function<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Now for some crufty UI Scripting! I grab the highlight by sending <code>⌘+C</code> to copy the selection to the clipboard. I go ahead and use <code>magiclines</code> to put <code>&gt; </code> in front each line.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;c&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pasteboard</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">readString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">line</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magiclines</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlight</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&gt; &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">line</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>More UI scripting lets me hit <code>⌘+L</code> for the &quot;location bar,&quot; letting me grab the URL for the current page and save it to variable.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;l&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;command&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;c&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pasteboard</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">readString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Now that I have all the pieces, I can use <code>string.format</code> to build the template. (It's a little hard to read because I don't want to introduce leading whitespace.)</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">format</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[%s
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">%s
</div><div class="line" data-line="4">[%s](%s)]]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">quote</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Now I just use <a href="https://docs.getdrafts.com/docs/automation/urlschemes">URL schemes</a> to send it to Drafts.app, and I'm done!</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;drafts://x-callback-url/create?tag=links&amp;text=&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encodeForQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Snipped!&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;The snippet has been sent to Drafts&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>With this code, I can highlight and snip <em>any</em> text in Firefox or Webkit browsers. I use these markdown-formatted quotes in either my <a href="http://evantravers.com/articles/2020/12/15/automatic-newsletter-using-drafts/">newsletter automations</a> or <a href="http://evantravers.com/articles/2020/12/08/smz-updated-drafts-actions/">saved to my zettelkasten</a>. You can see the whole thing in the <a href="https://github.com/evantravers/hammerspoon-config/blob/b508d89823053b31d87a6a03b855594b22ea1500/init.lua#L247-L272">total config on github</a>.</p> ]]></description>
    </item>
    <item>
       <title>Generating a Blogroll from Your .opml File</title>
       <link>http://evantravers.com/articles/2021/01/23/generating-a-blogroll-from-your-opml-file/</link>
       <pubDate>Sat, 23 Jan 2021 09:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/23/generating-a-blogroll-from-your-opml-file/</guid>
       <description><![CDATA[ <p>I've been thinking about having a blogroll on my site for a little while. If nothing else, I owe <em>so</em> much to smarter people on the internet, the best thing I could do for others is to show where some of the connecting dots are that eventually become these posts.</p>
<p>I had been puzzling over how to connect my actual act of reading in my RSS reader... so I took my <code>.opml</code> file out of <a href="https://www.reederapp.com/">Reeder</a><sup class="footnote-ref"><a href="#fn-reeder" id="fnref-reeder" data-footnote-ref>1</a></sup> and I exported it into my source folder.</p>
<p>I made a helper that used nokogiri to select a &quot;folder&quot; in the opml using xpath, and printed that out sorted by name. Hey presto, a quick blogroll that actually can update with my reading!</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blogroll</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./Feeds.opml</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">open</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Nokogiri</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">XML</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">xpath</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">//outline[@title=&#39;blogroll&#39;]/outline</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">value</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">downcase</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Then in erb, it's as simple as displaying the fields that I want from the xml.</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> blogroll().each do |blog| <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">htmlUrl</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">htmlUrl</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>If I still was using newsboat, I probably could automate this and do fancy things, but anywho. If I'm reading a blog in my feed-reader and think it's worth representing here, I can simply move it to my 'blogroll' folder and re-export the OPML.</p>
<p>I'll figure out where I want it to appear in the navigation eventually, but until then you can see it at <a href="/blogroll">/blogroll</a>.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-reeder">
<p>my current RSS reader, yes I dropped newsboat, don't @ me. <a href="#fnref-reeder" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Feeding and Tending the Zettelkasten</title>
       <link>http://evantravers.com/articles/2021/01/21/feeding-and-tending-the-zettelkasten/</link>
       <pubDate>Thu, 21 Jan 2021 08:29:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/21/feeding-and-tending-the-zettelkasten/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>Thanks to Obsidian, I've got enough tooling to really dig into my Simple Markdown Zettelkasten. I'm starting to converse with it to generate ideas… some of the references in recent blog posts have emerged from wandering from link to link. I do lean towards the &quot;garden&quot; metaphor because playing around in obsidian, snipping notes and trimming connections <em>does</em> feel like tending. 🪴</p>
<p>Despite all the commitment and focus on tooling, a new and simple practice has had the most impact:</p>
<p>I added &quot;Pull thoughts from daily journaling&quot; as a task in my shutdown routine checklist.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/daily_review.jpeg" alt="daily_review" /></p>
<p>At the end of the day as part of my review, I now go through my bullet journal entries and recapture into Drafts. I often record tiny insights and thoughts, as I talk to people, but the ability to re-discover and engage with the insight is limited unless my spatial memory is able to locate or connect to threading system. Because I already had the habit of processing my Drafts inbox, some get sent to Things as tasks and projects, others I tag<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>, expand, and save to the Zettelkasten. I often wind up chasing the interesting ones into Obsidian to link up with other recent and related notes… which triggers some gardening behavior.</p>
<p>It's been a small and useful addition to my afternoon routine. It's profound enough that I may go back at least six months and re-capture scattered insights to the Zettelkasten. I probably should also build a habit that any time I find myself looking something up in my bullet journal… I probably should be making sure it has a home in my Zettelkasten.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I <em>really</em> like my <a href="http://evantravers.com/articles/2021/01/09/tags-representing-tags/">new tagging methodology</a>. Before I was treating Drafts like a text editor, and trying to put YAML metadata in the header the entire lifetime of the thought… Dealing with the native controls in Drafts until it's time to transfer to the final location feels like <strong>The Way</strong>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Remote Work and Submarine Warfare</title>
       <link>http://evantravers.com/articles/2021/01/20/remote-work-and-submarine-warfare/</link>
       <pubDate>Wed, 20 Jan 2021 08:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/20/remote-work-and-submarine-warfare/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/submarine.jpeg"></p><p>You are in your submarine deep under the waves. You have been pursuing your critical objectives for weeks. Although other ships are all around you, you are isolated from them by depth and distance. Your <strong>sole link</strong> to the friendly fleet is your precious radio. If the radio goes dark, you've learned to brace for impact: either everyone is celebrating a victory (and forgot to tell you), or (<em>much</em> more likely) everyone is reacting to something <em>disastrous</em>.</p>
<p>Feel familiar?</p>
<p><em>Remote work can feel like submarine warfare</em>… you can't hear or see the action outside. Whatever chat app or system serves as your radio, you have to build practices and systems to communicate and align your team. <strong>Clear practices of communication are not included in the box</strong>. Critical information can slip by completely invisible to your team, both disasters requiring reinforcements and morale-raising victories. Each of us is responsible for surfacing the information and intelligence we encounter on our own missions.</p>
<p>Some things to keep in mind:</p>
<p><strong>Find an open channel.</strong> For this to work, we all have to be able to send and receive. Don't make it too complicated. If your whole company uses five different systems… just use email. Whatever is an accessible common denominator.</p>
<p><strong>Bad news travels farther.</strong> By default your team will hear about more negative events than positive. Intentionally broadcast encouragements and victories loud and clear.</p>
<p><strong>Boost the broadcasters.</strong> There are people in your fleet who have gifts of encouragement and community. Re-post, share, and reward those who create alignment and cooperation.</p>
<p><strong>Start from the brass.</strong> Executives have access on the biggest wins and most urgent problems… but often get focus-locked on only problems. Without a commitment to clear communication, the only messaging coming from them can be negative. Be intentional.</p>
<p><strong>Build people.</strong> Unless you visit with your team, your only interactions will be demands and commands. Invest in relationships. Push through the awkwardness of zoom lunches and one on ones.</p>
<p>Remember that in remote work… everyone is alone together. With care and coordination, we can be tune in to each other and work as a team.</p> ]]></description>
    </item>
    <item>
       <title>Handrails and Backstops</title>
       <link>http://evantravers.com/articles/2021/01/19/handrails-and-backstops/</link>
       <pubDate>Tue, 19 Jan 2021 09:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/19/handrails-and-backstops/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/orienteering.jpg"></p><p>Orienteering is a sport that practices navigation by map and compass, constantly reassessing your current location and readjusting your course towards your next objective.</p>
<p>The first time I set out, I consulted my friend who is a competitive orienteer. He gave me two mental models to interpret the map for effective navigation across unknown terrain: He told me to find handrails and backstops.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/handrail.png" alt="handrail" /></p>
<p>A &quot;handrail&quot; is a terrain feature that runs alongside your prospective route. As long as you keep it on one side and in sight, you can follow it to your goal.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/backstop.png" alt="backstop" /></p>
<p>A &quot;backstop&quot;<sup class="footnote-ref"><a href="#fn-backstop" id="fnref-backstop" data-footnote-ref>1</a></sup> is a terrain feature usually perpendicular to travel and just beyond or right at your next waypoint. If you cross the backstop, you've gone too far.</p>
<p>These principles work in my nearby state park… but also apply to more abstract problem terrains.</p>
<p>Effective planning requires identifying your current position in the problem space, and realigning with your desired outcomes. Classifying elements of your domain as &quot;handrails&quot; or &quot;backstops&quot; can speed decision-making and course selection.</p>
<p>Two examples: when working on a front-end performance budget, your current bundle size can be a backstop<sup class="footnote-ref"><a href="#fn-performance" id="fnref-performance" data-footnote-ref>2</a></sup>. If your bundle size increases, it's time to turn around, you've gone too far. North Star metrics<sup class="footnote-ref"><a href="#fn-northstar" id="fnref-northstar" data-footnote-ref>3</a></sup> (if well constructed) can serve as a handrail. As long as that KPI continues to improve, you are headed in a good direction.</p>
<p>By classifying possible outcomes or KPIs as handrails and backstops, I can give my team the ability to move with autonomy knowing the right direction to sprint... and a safety net to avoid overcommitting.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-backstop">
<p>I've also seen a &quot;backstop&quot; referred to as a &quot;<a href="http://qoc.nova.org/5_skills.htm">catching feature</a>.&quot; Same concept, different name. <a href="#fnref-backstop" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-performance">
<blockquote>
<p>Time and again I hear clients discussing their performance budgets in terms of goals: We’re aiming toward a budget of 250KB uncompressed JavaScript; we hope to be interactive in 2.75s. While it’s absolutely vital that these goals exist and are actively worked toward, this is not part of your budgeting. Your budgeting is actually far, far simpler:</p>
<blockquote>
<p>Our budget for [metric] is never-worse-than-it-is-right-now.</p>
</blockquote>
</blockquote>
<p><a href="https://csswizardry.com/2020/01/performance-budgets-pragmatically/">Performance Budgets, Pragmatically – CSS Wizardry – Web Performance Optimisation</a> <a href="#fnref-performance" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-northstar">
<blockquote>
<p>Custom metrics connected to the humans getting value from your product -- and how they are getting value from your product -- are much more compelling. Our key product bet manifests in the metric, and that transparency is powerful.</p>
</blockquote>
<p><a href="https://cutlefish.substack.com/p/tbm-3253-beyond-generic-kpis">TBM 32/53: Beyond Generic KPIs - The Beautiful Mess</a> <a href="#fnref-northstar" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Scaling Yourself: Scott Hanselman</title>
       <link>http://evantravers.com/articles/2021/01/15/scaling-yourself-scott-hanselman/</link>
       <pubDate>Fri, 15 Jan 2021 07:22:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/15/scaling-yourself-scott-hanselman/</guid>
       <description><![CDATA[ <div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/FS1mnISoG7U"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<blockquote>
<p>The less you do, the more of it you can do.</p>
</blockquote>
<p>I think about this talk <em>every</em> day. It transformed how I work. <a href="https://hanselman.com/">Mr. Hanselman</a> inspired me to write thoughtfully instead of sharing mindlessly<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>. It's a twenty minute primer on the core aspects of focus that evolved my youthful interest in &quot;lifehacks&quot; into an ongoing study on living effectively.</p>
<p>I was first exposed to this by <a href="https://www.anthonycrumley.com/">Anthony Crumley</a>, one of his many thoughtful gifts.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>If it wasn't for this talk, this blog post would instead be ten texts to ten friends saying &quot;watch this!&quot; <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section><p><a href="https://www.youtube.com/watch?v=FS1mnISoG7U" class="u-in-reply-to  is-reply">Scaling Yourself • Scott Hanselman • GOTO 2012 - www.youtube.com</a></p> ]]></description>
    </item>
    <item>
       <title>What Do You Want to See Here?</title>
       <link>http://evantravers.com/articles/2021/01/13/what-do-you-want-to-see-here/</link>
       <pubDate>Wed, 13 Jan 2021 09:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/13/what-do-you-want-to-see-here/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>You, as an official member of RSS Club, matter to me. (All three of you!) Y'all were super kind and supportive when I posted this little experiment… I appreciated all the notes that I got.</p>
<p>What would you like to read? Is there an older topic I should revisit, or something you are curious about? Please <a href="http://evantravers.com/contact/">send me a note</a>, and I'll do my best to get back with y'all or write a post here. I don't have analytics on this thing… and I'd like to know y'all so leave your blog address (if you have one) and I'll subscribe, and maybe shoot me a book recommendation. ✌</p> ]]></description>
    </item>
    <item>
       <title>Middleman Helper for Responsive Youtube Videos</title>
       <link>http://evantravers.com/articles/2021/01/12/middleman-helper-for-responsive-youtube-videos/</link>
       <pubDate>Tue, 12 Jan 2021 09:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/12/middleman-helper-for-responsive-youtube-videos/</guid>
       <description><![CDATA[ <p>I've always hated how YouTube videos look when embedded on my site. They are always the wrong width, letterboxed, or just weird.</p>
<p>After reading <a href="https://avexdesigns.com/blog/responsive-youtube-embed">this post</a>, I decided to make writing the containing element easier on myself, especially since I write blog posts from my phone or iPad these days.</p>
<p>The finished helper looks like this  and accepts a normal (non-embed) youtube watch link:</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1">youtube(&quot;https://www.youtube.com/watch?v=boro0iyBjjM&quot;)
</div></code></pre>
<p>Because this is a ruby helper, any blog post that uses it will have to have the <code>.erb</code> file extension so that the ruby server will parse it.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<p>Here's the helper:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">youtube</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@video_id</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">decode_www_form</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_h</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">v</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">concat</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="4">&lt;div class=&quot;youtube-container&quot;&gt;
</div><div class="line" data-line="5">  &lt;iframe
</div><div class="line" data-line="6">    width=&quot;100%&quot;
</div><div class="line" data-line="7">    height=&quot;100%&quot;
</div><div class="line" data-line="8">    src=&quot;https://www.youtube.com/embed/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@video_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="9">    frameborder=&quot;0&quot;
</div><div class="line" data-line="10">    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
</div><div class="line" data-line="11">    allowfullscreen&gt;
</div><div class="line" data-line="12">  &lt;/iframe&gt;
</div><div class="line" data-line="13">&lt;/div&gt;
</div><div class="line" data-line="14">    </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Here's the corresponding CSS:</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">youtube-container</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">height</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">position</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> relative<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padding-bottom</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">56.25</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">padding-top</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">30</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">px</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">overflow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> hidden<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">iframe</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">object</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">embed</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">width</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">height</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">position</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> absolute<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">top</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>And here's the final result!</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1">youtube(&quot;https://www.youtube.com/watch?v=j2_dJY_mIys&quot;)
</div></code></pre>
<p>Transforms into:</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/j2_dJY_mIys"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>Now that I think about it, I could re-implement this as a Vue component, and then it would not depend on having <code>.erb</code> at the end of the file… but this works. I could also write shortcuts or Drafts actions to insert the correct HTML, but whatever. It works. Enough over optimizing, back to writing!</p>
<p>Fun fact: this post started as a copy/paste of the <a href="http://evantravers.com/articles/tags/git/">git</a> commit for the change (Literally <code>git show | pbcopy</code> -&gt; Drafts.app). Now I'm thinking about writing a transformation script that changes a <code>git show</code> into a postable markdown blog post... 🤔</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I started down the path of registering a custom renderer for <code>RedCarpet</code> and then decided that I was being overly clever. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Newgrass</title>
       <link>http://evantravers.com/articles/2021/01/12/newgrass/</link>
       <pubDate>Tue, 12 Jan 2021 07:22:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/12/newgrass/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>I realized that I'm in a newgrass mood, but as my brother pointed out… I'm <em>always</em> in a newgrass mood. Here's some new discoveries as well as favorites that keep bubbling back up.</p>
<h2><a href="#im-with-her" aria-hidden="true" class="anchor" id="im-with-her"></a>I'm With Her</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/7WNmrsbu-hc"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>A super-duper supergroup of folks whose discography I was already super familiar with… their absolutely precise and pure harmonies sweep me away <em>every</em> time.</p>
<h2><a href="#mandolin-orange" aria-hidden="true" class="anchor" id="mandolin-orange"></a>Mandolin Orange</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/EdP8S0uKP5U"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>I must be at least 15% of the views on this concert video. Mandolin Orange ambles quietly through dreamscapes of loneliness and history, picking lyrical flowers as they go.</p>
<h2><a href="#billy-strings" aria-hidden="true" class="anchor" id="billy-strings"></a>Billy Strings</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/3lGjS3yGoRU"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>Billy is a recent discovery… this week even. His work is often dark, but I'm excited to hear an old soul with <a href="https://www.youtube.com/watch?v=W4hrE42-l-I">blistering guitar-talent</a> bring some new sounds to some old themes.</p>
<h2><a href="#kasey-waldon" aria-hidden="true" class="anchor" id="kasey-waldon"></a>Kasey Waldon</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/gVx2qTczl2Q"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>I first heard Kasey through The Bitter Southerner. The Goldmine smells just like the small town I grew up in… and Ms. the thousand yard stare in Ms. Waldon's lyrics confront both the good and hardship of the south.</p>
<h2><a href="#caleb-caudle" aria-hidden="true" class="anchor" id="caleb-caudle"></a>Caleb Caudle</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/boro0iyBjjM"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>Another quiet favorite of mine… just four chords and a sweet truth.</p>
<h2><a href="#the-lone-bellow" aria-hidden="true" class="anchor" id="the-lone-bellow"></a>The Lone Bellow</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/zJyf5NqiMNE"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>From the moment they start, The Lone Bellow's harmonic belting grabs my throat and heart and doesn't let go. Brutally loving writing always holds me to the end of the song.</p>
<h2><a href="#lori-mckenna" aria-hidden="true" class="anchor" id="lori-mckenna"></a>Lori McKenna</h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
  <iframe src="https://www.youtube.com/embed/d4yVj0MdhmI"
          style="position:absolute;top:0;left:0;width:100%;height:100%;"
          frameborder="0" allowfullscreen></iframe>
</div>
<p>I will never not cry at this song.</p> ]]></description>
    </item>
    <item>
       <title>Welcome to RSS Club</title>
       <link>http://evantravers.com/articles/2021/01/11/welcome-to-rss-club/</link>
       <pubDate>Mon, 11 Jan 2021 18:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/11/welcome-to-rss-club/</guid>
       <description><![CDATA[ <em>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="16" width="16">
    # <path fill="currentColor" d="M 4 4.44 v 2.83 c 7.03 0 12.73 5.7 12.73 12.73 h 2.83 c 0 -8.59 -6.97 -15.56 -15.56 -15.56 Z m 0 5.66 v 2.83 c 3.9 0 7.07 3.17 7.07 7.07 h 2.83 c 0 -5.47 -4.43 -9.9 -9.9 -9.9 Z M 6.18 15.64 A 2.18 2.18 0 0 1 6.18 20 A 2.18 2.18 0 0 1 6.18 15.64"></path>
  </svg>
  This is an RSS-only post. It's a secret! Read more about <a href="/rss-club">RSS Club</a>.
</em>
<p>If you are reading this, then welcome to RSS Club. I've had a goal to join Dave's secret society since <a href="https://daverupert.com/2018/01/welcome-to-rss-club/">his post in 2018</a>.</p>
<p>I more or less coded the same solution as Dave.</p>
<p>On this blog post, I have a special metadata for RSS Club:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Welcome to RSS Club</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2021-01-11 18:35 CST</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">code</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rss_club</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div></code></pre>
<p>I did some old-skool ruby metaprogramming evil and monkeypatched <code>Middleman::Blog</code> in config.rb:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Middleman</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">BlogData</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filtered_articles</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reject</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:page</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:rss_club</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>This means that in middleman anywhere that I would type <code>blog.articles</code> I can use <code>blog.filtered_articles</code>:</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> blog(&#39;main&#39;).filtered_articles.each do |article| <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h-entry</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">partial</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article_header</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">locals</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">article</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>I just added that to my pages for archives, tags, calendars... everywhere <em>except</em> my feed.xml builder and voila! Secret RSS-only pages! I added a quick helper to display the RSS Club badge and there we go. I could see myself making a directory of RSS-only posts eventually, but anyway.</p>
<p>I'm still not sure what I'm going to use this space for... it's basically made for &quot;die-hard&quot; fans, and I don't have any of those. 🤷 I will <em>definitely</em> abide by Dave's rules:</p>
<ul>
<li>1st rule of RSS Club is “Don’t Talk About RSS Club”.</li>
<li>2nd rule of RSS Club is “Don’t Share on Social Media”.</li>
<li>3rd rule of RSS Club is “Provide Value”.</li>
</ul>
<p>I already know the first thing I'm going to post... stay tuned! ✌</p> ]]></description>
    </item>
    <item>
       <title>Meta-Tasks, When, and Things</title>
       <link>http://evantravers.com/articles/2021/01/11/meta-tasks-when-and-things/</link>
       <pubDate>Mon, 11 Jan 2021 09:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/11/meta-tasks-when-and-things/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/when.jpeg"></p><p>Over the past two years the way I use the &quot;When&quot; system for To-dos in Things has shifted. I have realized that When is a tool of <strong>intention</strong>, rather then &quot;snooze&quot; or &quot;deferral&quot;<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>.</p>
<p>Before, I would assign a When date to to-dos based on the next time I wanted to look at them. I now <em>only</em> use When to denote &quot;when&quot; I am going to start a task.</p>
<p>The ability to &quot;defer&quot; looking at a task is however <em>very</em> useful… I'm sure I'm not the only one doing a lot of deferring in these strange times. There is a way to stay true to When's original purpose and still defer: Instead of assigning a When date merely to &quot;hide until a certain day&quot; you should instead create a meta-task to &quot;check on &lt;item&gt;.&quot; If you use Things.app's Copy Link functionality, you can even hop straight from the &quot;deferral to-do&quot; to the list or to-do in question.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/metatodo.jpeg" alt="metatodo" /></p>
<p>These sorts of &quot;meta-to-dos,&quot; (tasks for working on your tasks) are <em>super</em> handy… I first started using them in my bullet journal practice.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I think my heavy use of Google Inbox's Snooze feature caused me to treat &quot;when&quot; as a snooze. <a href="https://twitter.com/peterakkies/status/1280144753246568450">Peter Akkies helped me understand this a bit better</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Tags Representing Tags</title>
       <link>http://evantravers.com/articles/2021/01/09/tags-representing-tags/</link>
       <pubDate>Sat, 09 Jan 2021 09:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/09/tags-representing-tags/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/draft-with-tags.jpeg"></p><p>In <a href="https://getdrafts.com">Drafts</a>, I use the tagging system to organize within the application. For instance since this draft started, I've used the <code>writing:develop</code> tag to place it in the Workspace for writing that I'm actively working on.</p>
<p>Drafts is where text starts, but pretty much all of it flows out of Drafts and is used elsewhere… and those documents need tags too!</p>
<p>I've been playing with tags that start with a hash<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> like <code>#drafts-app</code>. In my custom actions they are passed on in the right format (usually YAML front after for a blog post or Zettel.) Here's an example code snippet that built this blog post:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// draft.tags is readonly… this is a hack to make a copy.</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> 
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;,&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;#&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;, &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`---
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">title: $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">displayTitle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="17">date: $&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%F %R %Z&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="18">tags: $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="19">
</div><div class="line" data-line="20">---
</div><div class="line" data-line="21">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">processTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;[[body]]&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="22">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>This would be easier if Drafts provided an Array of strings as <code>drafts.tags</code>, but it's not too much work. (But Greg if you are reading… it'd be nice!)</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>yes, I know it's an octothorpe. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>UX Black Markets</title>
       <link>http://evantravers.com/articles/2021/01/06/ux-black-markets/</link>
       <pubDate>Wed, 06 Jan 2021 13:34:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/06/ux-black-markets/</guid>
       <description><![CDATA[ <p>A <a href="https://en.wikipedia.org/wiki/Black_market">black market</a> forms when people can't meet their needs in officially provided channels. I define a UX &quot;black market&quot; similarly: Users are hacking or sidestepping the official system because the official system doesn't provide the desired functionality.</p>
<p>That's right, it's just an ugly way of saying &quot;desire path.&quot;<sup class="footnote-ref"><a href="#fn-desirepath" id="fnref-desirepath" data-footnote-ref>1</a></sup> 🤷</p>
<p>While negative, it can be useful phrasing <em>especially</em> when stakeholders are jaded from long exposure to the product's &quot;normal use&quot; or (worse) have an antagonistic relationship with users. Such stakeholders are tired of trying to get users to &quot;play by the rules,&quot; and forget to listen to user's behavior to learn from them and collaborate with them.</p>
<p>Where do &quot;black markets&quot; appear? <em>Any</em> plain text field you give a user that they can search on (titles, tags, group names, etc.) Export and upload systems are frequently hacked by power users, reporting systems, even foreign keys in databases. Basically, if you build it, they will <span class=strike>come</span> hack it.</p>
<p>While &quot;black markets&quot; can be a frustration for your operations and customer support teams, you can co-opt this &quot;desire path/black market&quot; energy into product insights. You can ask support personnel for anecdotal evidence (&quot;what's a weird way a user uses our system?&quot;) or crawl support tickets for patterns. Your legal team may have stories of people breaking your TOS to achieve a goal. You can even use &quot;<a href="https://uxdesign.cc/how-we-run-a-fake-door-test-in-notino-ux-case-study-c7138940c1ec">fake door</a>&quot; tests to create a sort of &quot;honey pot&quot; for desire paths hypotheses… I'm sure there's more. So far I've simply taught product owners and other stakeholders what a &quot;black market&quot; is. They've brought me <em>loads</em> of examples which I am slowly teaching them to understand as <strong>users expressing their unmet needs</strong>.</p>
<p>If you ask your stakeholders &quot;what are your users trying to tell you, what do they desire?&quot; and you get blank stares… try asking for &quot;black markets&quot; and see where it takes you.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-desirepath">
<p>A <a href="https://en.wikipedia.org/wiki/Desire_path">desire path</a> is a manifestation of a user communicating that the provided system doesn't meet their needs. Here's <a href="https://www.treehugger.com/desire-paths-shortcuts-public-sidewalks-4867870">an article from treehugger</a> talking about physical desire paths. <a href="#fnref-desirepath" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Grace Over Haste</title>
       <link>http://evantravers.com/articles/2021/01/05/grace-over-haste/</link>
       <pubDate>Tue, 05 Jan 2021 13:46:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/05/grace-over-haste/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2021/01/grace.jpeg"></p><p>Some time ago I took an emergency medicine course. We studied common injuries, and worked with <em>amazing</em> life-saving tools. The class often left the classroom, practicing in stressful workshops with fake gore and groaning actors.</p>
<p>Under the watchful eyes of Hugh, the EMT trainer, I was presented with a fake car accident. Faced with a severely-wounded actor I started on the most life-threatening: a chest wound. As the timer started and the theatre blood sprayed, my hands began to shake. In what seemed <em>an eternity</em>, I fumbled through the trauma kit… dropping bandages and gauze…  I could not secure the chest seal!<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup> Finally pulling it… I couldn't open it. I even attempted to tear through the slick packaging with my teeth. Hugh calmly put his hands on my shoulders. He pulled me back for a beat and whispered &quot;It's ok. <strong>Grace, not haste</strong>.&quot; I breathed, slowed my hands, and easily opened the package and took care of the &quot;patient.&quot;</p>
<p>Hugh's wisdom has applied to more than stress-inoculation training. Knowing that <strong>under stress I default to haste over grace</strong> has transformed how I approach stressful situations.</p>
<p>I recently read a story about an early champion runner<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup>. People couldn't understand his success until they evaluated his races with slow motion photography. Comparing his behavior with his competition they discovered the key: In the final stretch other runners around him tried harder, straining for speed but flailing and wasting precious energy. The champion ran the end of his race with <em>exactly</em> the same form, effort, and speed with which he started. The winner used haste <em>without</em> compromising grace.</p>
<p>One of the differences between a proficient and a beginner is that the proficient expends <em>just</em> enough effort to achieve a result.<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup> A proficient does not waste emotional energy on things they can not change. They run their race with endurance, knowing there will be more races in the future. The beginner leans into the immediate problem with <strong>all</strong> of their physical and emotional might, <strong>willing</strong> it to budge, straining in the last stretch of the race like it was the only and final race.</p>
<p>It's a good lesson for any stressful or competitive situation. You can employ haste… just make sure you balance it with grace.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>A chest seal is a big, clinically sterile sticker to cover a puncture wound. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>My memory is failing, but I want to say the story was about Jesse Owens in Atomic Habits? I am only 30% sure. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>Just watch <em>Jiro Dreams of Sushi</em> and you'll see a life-long proficient spending <em>just</em> enough energy to accomplish a pure result. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Building Middleman using GitHub Actions</title>
       <link>http://evantravers.com/articles/2021/01/01/building-middleman-using-github-actions/</link>
       <pubDate>Fri, 01 Jan 2021 08:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2021/01/01/building-middleman-using-github-actions/</guid>
       <description><![CDATA[ <p>My site now posts from <em>anywhere</em> thanks to GitHub actions!</p>
<p>I used <a href="https://blog.kylegalbraith.com/2019/12/09/deploying-your-static-websites-to-aws-in-style-using-github-actions/">this blog</a> as a jumping off point, but there were a few things I had to modify:</p>
<ul>
<li>there's an update to the <code>action/checkout</code> action, so version bump.</li>
<li>to handle the <a href="https://docs.github.com/en/free-pro-team@latest/actions/guides/building-and-testing-nodejs#specifying-the-nodejs-version">node</a> and <a href="https://docs.github.com/en/free-pro-team@latest/actions/guides/building-and-testing-ruby">ruby</a> dependencies, I'm using the provided actions.</li>
<li>my <a href="http://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/">changelog</a> relies on having access to the full git history. By default, <code>actions/checkout</code> only pulls the HEAD commit. I added <code>fetch-depth</code> to fix that.</li>
</ul>
<p>The final file in <code>.github/workflows/main.yml</code>:</p>
<pre class="lumis"><code class="language-yaml" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CI</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">branches</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">master</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jobs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">build</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">runs-on</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ubuntu-latest</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">steps</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">uses</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">actions/checkout@v2</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="12">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fetch-depth</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Configure AWS Credentials</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">uses</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws-actions/configure-aws-credentials@v1</span>
</div><div class="line" data-line="15">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="16">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws-access-key-id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secrets.AWS_ACCESS_KEY_ID</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="17">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws-secret-access-key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secrets.AWS_SECRET_ACCESS_KEY</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="18">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws-region</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">us-east-1</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Setup node</span>
</div><div class="line" data-line="20">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">uses</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">actions/setup-node@v1</span>
</div><div class="line" data-line="21">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="22">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">node-version</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;13.x&#39;</span>
</div><div class="line" data-line="23">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Install node dependencies</span>
</div><div class="line" data-line="24">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">npm</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ci</span>
</div><div class="line" data-line="25">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Setup ruby</span>
</div><div class="line" data-line="26">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">uses</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ruby/setup-ruby@v1</span>
</div><div class="line" data-line="27">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="28">          <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundler-cache</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="29">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Install ruby dependencies</span>
</div><div class="line" data-line="30">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundle</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">install</span>
</div><div class="line" data-line="31">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Build static site</span>
</div><div class="line" data-line="32">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundle</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">exec</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">middleman</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">build</span>
</div><div class="line" data-line="33">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Deploy static site to S3 bucket</span>
</div><div class="line" data-line="34">        <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">aws</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s3</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sync</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./build/</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s3://</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secrets.BUCKET_NAME</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--delete</span>
</div></code></pre>
<p>After some pushing and (shameful) <code>git commit --amend</code>, it's working!</p>
<p>As always, I write in <a href="http://evantravers.com/articles/tags/drafts-app">Drafts</a>. In the course of writing this post, I wound up hacking some quick actions in Drafts to make this process easier.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/Drafts_actions.png" alt="Drafts_actions" /></p>
<p>The first takes a typical Draft and write it to Working Copy in the format that Middleman expects.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// compute the date</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createdAt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// compute the filename</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">displayTitle</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename_title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toLowerCase</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">z</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">A</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Z</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">9</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;-&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`$&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%F&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename_title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.html.markdown`</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`---
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">title: $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">displayTitle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="16">date: $&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%F %R %Z&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">---
</div><div class="line" data-line="19">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">processTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;[[body]]&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="20">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">CallbackURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="23">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">baseURL</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;working-copy://x-callback-url/write/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="24">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addParameter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;key&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;itsasecretdonttell&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="25">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addParameter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;repo&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;evantravers.com&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addParameter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;path&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`source/articles/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addParameter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;text&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addParameter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;x-success&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;working-copy://&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">    
</div><div class="line" data-line="30"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// open in Working Copy</span>
</div><div class="line" data-line="31"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">success</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">open</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// error handling</span>
</div><div class="line" data-line="34"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">success</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="35"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="36"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="37">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">context</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fail</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="38">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">log</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cb</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">status</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="39"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>The next action is a convenience action for me… since my previous action bases the file name on the CreatedAt date of the Draft (which is stable) I can wind up in a position where I work on a post for a few days before I post it. Running &quot;Update Date to Last Edit&quot; does this:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createdAt</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">modifiedAt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Very ugly. Works just fine.</p>
<p>The last action uses Shortcuts to select a photo, place it in Working Copy in the correct month folder, and write the path back to the Draft.</p>
<p><img src="https://images.evantravers.com/articles/2021/01/image_shortcut.jpeg" alt="image_shortcut" /></p>
<p>Honestly… this post will be the first attempt… so let's see if it even works!</p> ]]></description>
    </item>
    <item>
       <title>Plan Your Year</title>
       <link>http://evantravers.com/articles/2020/12/28/plan-your-year/</link>
       <pubDate>Mon, 28 Dec 2020 14:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/28/plan-your-year/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/12/planyouryear.jpg"></p><p>This will be the fourth year my wife and I purchased and used <a href="https://thefocuscourse.com/plan-your-year/">Plan Your Year from The Focus Course</a>. This year I am going paperless… I even spent some time this morning scanning in all the previous year's editions.</p>
<p>I <strong>really</strong> like this tool. Some quick thoughts:</p>
<ul>
<li>I <em>love</em> that this is a system designed to be used as a family to build a shared vision.</li>
<li>It's encouraging to read back over these as an overview. Lots of <a href="http://evantravers.com/articles/2020/10/30/new-book-same-story/">reasons to praise the Lord for his faithful hand</a>.</li>
<li>That which we planned for… largely happened. Even in 2020!</li>
<li>Any month we didn't have a design for… fell into default behaviors. Good or bad. (Mostly bad.)</li>
<li>Plan Your Year does a great job of balancing personal growth vs. accomplishing projects. <em>Both</em> are critical.</li>
</ul>
<p>Shawn and the team at The Focus Course built a great tool and wisely modified this version for this specific and stressful year… flipping through its pages I'm excited to learn and grow with my little family, and I recommend it to y'all, <em>especially</em> if you don't have a shared vision for investing your time and talents in 2021.</p> ]]></description>
    </item>
    <item>
       <title>2020</title>
       <link>http://evantravers.com/articles/2020/12/23/2020/</link>
       <pubDate>Wed, 23 Dec 2020 17:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/23/2020/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/12/canyon.jpg"></p><p>Hindsight is 2020… but I'm glad to see 2020 in hindsight. 🥁 Truthfully, my family has been very blessed and protected in so many ways through this wild year.</p>
<p>We welcomed another little one safely, God continues to provide for us through my job (which I enjoy!), and our little family has had lots of time together... sometimes socially distanced but otherwise wonderful.</p>
<p><img src="https://images.evantravers.com/articles/2020/12/baby.jpg" alt="" /></p>
<p>This has also been a challenging year... mostly the external factors of The Unknown<sup class="footnote-ref"><a href="#fn-unknown" id="fnref-unknown" data-footnote-ref>1</a></sup> preying on my mind and creating the usual symptoms of stress on my body and mind. Running to the Lord first, and wisely limiting some of the sources of stress has really helped.</p>
<h2><a href="#creating" aria-hidden="true" class="anchor" id="creating"></a>Creating</h2>
<p>This year I wrote <a href="http://evantravers.com/articles/2020/"><strong>60 blog posts</strong></a> including this one.</p>
<p>While writing has been creatively satisfying in and of itself (and useful!<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup>) even more wonderful has been likes, comments, reblogs and the occasional email from a new internet friend. I got to <a href="https://brettterpstra.com/2020/01/13/the-indieweb-and-webmentions/">help a blogging hero of mine set up webmentions</a>, got a lot of folks talking about <a href="http://evantravers.com/articles/series/simple-markdown-zettelkasten/">zettelkasten</a>, and a few crazy souls <em>actually tried</em> my hammerspoon setup. This year I've <strong>received about 12 emails from y'all…</strong> and each made my day and inspired me to keep going. I have removed analytics from the site… getting emails from y'all is much nicer than tracking top keywords.</p>
<p>It's really hard to tell how much I added to my zettelkasten… the modified time has been clobbered by running the transition script too many times. Looking forward to investing in that more this year.</p>
<p>While I don't presently code for a living, GitHub counts <strong>872 contributions</strong>… probably mostly me dinking around on my blog, hammerspoon, or QMK. :-P</p>
<h2><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h2>
<p>I only read <strong>13 books</strong> this year. :( I'll blame a variety of factors, including discovering long-form podcasts and getting overly absorbed that I can borrow graphic novels on Hoopla that I can borrow comic books from the library (which don't count for me… although I definitely maxed out my 10 per month every single month this year. I suppose if I did count comic books, it'd be closer to 120?)</p>
<p>I've responded by deleting Hoopla off my phone, which seems to be helping. 😜</p>
<p>While I don't know how many articles I read this year, I apparently saved <strong>1,360 articles and videos</strong> in my instapaper… so something less than that. I saved 67 annotated links into my zettelkasten… although many more went into blog posts and newsletters.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2020/12/strava.jpeg">
</figure>
<p>According to strava I <strong>worked out 214 days</strong> in 2020. I doubled up on running, and set another sub-25m 5k just last week.</p>
<p>While (God be praised!) we've been well and haven't really gained any weight, I'm still wrestling with my diet, although a combination of macro tracking and looking at the graph every morning seems to be helping me in the last two months. Turns out sugar is the single most correlated stat for me and weight. I'll write more about that automation later I'm sure.</p>
<p>In all, I think this year I finally started to add sleep, water intake, and diet moderation to the mix. Now to make it an easy part of my life.</p>
<h2><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h2>
<p>In February, my wife and I got away to talk about the next four years and what we wanted to accomplish personally and in our family life. One of those things was that we wanted me to work from home by the end of those four years... and we got our wish the next week. 🤷</p>
<p>COVID remote has been a challenge, but a welcome one. I work well from home, and I've been glad that I could be home for the first six months of our newest. While I certainly pray for the pandemic to end, I kinda want to stay home.</p>
<p>Our team has grown both in size and capability. I don't think I've <em>ever</em> been this excited to get back into work for the next year, I know great things are ahead.</p>
<p>I've been tracking my time this year, although it really didn't become a habit till June (<a href="http://evantravers.com/articles/series/hammerspoon-headspace/">Headspace</a> was born in May.)</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/12/toggl.png">
  <figcaption>
    These are mostly since June:<br>
    Dark Blue is High Value. (298h, some of it hidden in the gray.)<br>
    Light Blue is shallow work (238h) and meetings (266h).<br>
    Green (47h) is "play" which includes blogging and working on dotfiles.
  </figcaption>
</figure>
<p>Looking at my stats... I'm kind of appalled of where the time was invested. I'm happy with the results, and so I guess this is an encouragement that I can do <em>even</em> better.</p>
<h2><a href="#spiritual-life" aria-hidden="true" class="anchor" id="spiritual-life"></a>Spiritual Life</h2>
<p>I'm still not where I want to be here. Half way through the year I realized my commitment to working out was choking my quiet times, so I've started turning that around: trading my workout time for prayer and the word. I still haven't gotten back to my study habit I had five years ago, I may need to find another time in the day because mornings are difficult with two little ones.</p>
<p>I think the next step is to reconnect with my wife and really prioritize shared time in the word and prayer. With the two smidgens it's easy to have a split schedule.</p>
<h2><a href="#relationships" aria-hidden="true" class="anchor" id="relationships"></a>Relationships</h2>
<p>Mid-COVID, I started realizing that while my introverted self was happy, there would be others that would be struggling, so I started reaching out to my friends for virtual lunches. I wound up doing <em>quite</em> a few... too many actually, I think that kind of undercut my family time. Going to find a sustainable pattern going forward, but definitely going to continue something intentional and personal over likes and comments on social media.</p>
<p>Unsurprisingly, I cut off personal social media. I'm still pretty active on twitter and linkedin for semi-professional reasons, but instagram... well I only posted twice this year. I think I'll probably close it down eventually. I'm already collecting an email list for those who want more personal family updates, but don't feel like feeding FB's giant algorithm monster.</p>
<p>While the wife and I got a lot of time together, it wasn't very restful for her... when I work from home I can leave my office, but if you work <strong>on</strong> the home it is <em>hard</em> to find that life-giving distance in COVID-land, especially with a newborn. We went on our first date <em>in six months</em> this past month, and we are prioritizing more dating time in 2021.</p>
<h2><a href="#2021" aria-hidden="true" class="anchor" id="2021"></a>2021</h2>
<p>In 2020 chose the theme of &quot;Clarity.&quot; I often asked myself when stressed if I had clarity on what was most important, and that really helped. If I knew what was most important (often my family) then I prioritized that. If I didn't know what was most important, then discovering my priorities was the next thing.</p>
<p>I look forward to revealing my 2021 theme... at another time. 😉</p>
<p>I still haven't finished my full yearly personal review and planning... that usually comes in the days before New Years, but I am excited to see what the Lord will do in my heart in 2021. He has been faithful through a very strange and stressful year, and I fully expect to see His hand clearly in 2021.</p>
<p>He is good. I trust him. Let's do this!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-unknown">
<p>Politics. Pandemics. Other P words. <a href="#fnref-unknown" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>I have been secretly pleased <em>every</em> time I send someone a previously written link to answer a question! <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: December</title>
       <link>http://evantravers.com/articles/2020/12/23/books-and-links-december/</link>
       <pubDate>Wed, 23 Dec 2020 15:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/23/books-and-links-december/</guid>
       <description><![CDATA[ <p>This year is almost done! I'm working on a year in review thingy... how many years have I done that now?</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I haven't finished any books this month... I've been burning down the remaining 15+ hours of a podcast entitled <a href="http://www.martyrmade.com/fear-loathing-in-the-new-jerusalem/">Fear and Loathing in the New Jerusalem</a>, a podcast series by Darryl Cooper. It examines the birth and growth of Zionism, starting in the late 19th century all the way up to the birth of the modern Israeli state.</p>
<p>I went into this idly interested, but wound up being enthralled… and horrified. I appreciated how he confronts the listener with the experience of people in that time and context, honestly asking the hard question: &quot;what would you have done?&quot;</p>
<p>On deck: The 12 Week Year, House of Leaves.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#whats-a-linkable-app-and-why-does-linkability-matter--hook" aria-hidden="true" class="anchor" id="whats-a-linkable-app-and-why-does-linkability-matter--hook"></a>What’s a Linkable App and Why Does Linkability Matter? – Hook</h3>
<p>I'm obsessed with this weird app at the moment.</p>
<blockquote>
<p>People have become so accustomed to the weird fact that, without Hook, information resources are not easily addressable on the Mac that they tend not to realize that its just as important to be able to address local (or cloud synced) resources as it is to address remote resources.</p>
</blockquote>
<p><a href="https://hookproductivity.com/help/integration/data-linkability-and-why-it-matters/">What’s a Linkable App and Why Does Linkability Matter? – Hook</a></p>
<h3><a href="#walmart-and-autonomous-trucks---marginal-revolution" aria-hidden="true" class="anchor" id="walmart-and-autonomous-trucks---marginal-revolution"></a>Walmart and autonomous trucks - Marginal REVOLUTION</h3>
<blockquote>
<p>Since last year, those trucks have been operating on a two-mile route between a “dark store” (a store that stocks items for fulfillment but isn’t open to the public) and a nearby Neighborhood Market in Bentonville, Arkansas. Since then, the vehicles have racked up 70,000 miles in autonomous mode with a safety driver.</p>
</blockquote>
<p>I guess that future is here.</p>
<p><a href="https://marginalrevolution.com/marginalrevolution/2020/12/walmart-and-autonomous-trucks.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+marginalrevolution%2Ffeed+%28Marginal+Revolution%29">Walmart and autonomous trucks - Marginal REVOLUTION</a></p>
<h3><a href="#by-the-numbers-a-year-and-half-with-atomic-css" aria-hidden="true" class="anchor" id="by-the-numbers-a-year-and-half-with-atomic-css"></a>By The Numbers: A Year and Half with Atomic CSS</h3>
<blockquote>
<p>The results speak for themselves. Refactoring our CSS to the functional approach led to a 30% decrease in size. It could have been even smaller, but we left some legacy styles in place to refactor at a later time.</p>
</blockquote>
<p><a href="https://medium.com/@johnpolacek/by-the-numbers-a-year-and-half-with-atomic-css-39d75b1263b4">By The Numbers: A Year and Half with Atomic CSS</a></p>
<h3><a href="#revised-blooms-taxonomy--center-for-excellence-in-learning-and-teaching--iowa-state-university" aria-hidden="true" class="anchor" id="revised-blooms-taxonomy--center-for-excellence-in-learning-and-teaching--iowa-state-university"></a>Revised Bloom’s Taxonomy • Center for Excellence in Learning and Teaching • Iowa State University</h3>
<blockquote>
<p>The authors of the revised taxonomy underscore this dynamism, using verbs and gerunds to label their categories and subcategories (rather than the nouns of the original taxonomy). These “action words” describe the cognitive processes by which thinkers encounter and work with knowledge.</p>
<p>A statement of a learning objective contains a verb (an action) and an object (usually a noun).</p>
</blockquote>
<p>While this is generally fascinating, this has direct application for us productivity nerds: how we write project and to-do titles. I heard CGPGrey say on Cortex that it's good to phrase projects or to-dos in the past tense… some taxonomy like this could be helpful.</p>
<p><a href="https://www.celt.iastate.edu/teaching/effective-teaching-practices/revised-blooms-taxonomy/">Revised Bloom’s Taxonomy • Center for Excellence in Learning and Teaching • Iowa State University</a></p> ]]></description>
    </item>
    <item>
       <title>Automatic Newsletter Using Drafts</title>
       <link>http://evantravers.com/articles/2020/12/15/automatic-newsletter-using-drafts/</link>
       <pubDate>Tue, 15 Dec 2020 07:39:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/15/automatic-newsletter-using-drafts/</guid>
       <description><![CDATA[ <p>In my <a href="http://evantravers.com/articles/2020/11/07/day-of-automation/">day of automation</a> post I mentioned a simple newsletter automation. It's grown since then. Some background:</p>
<p>A year ago, we were using Monday.com to post status updates on hard-to-see work streams for executives. Monday.com didn't catch on, but I thought there was value in having a historical log that stakeholders could check to stay current.</p>
<p>In addition, I spammed links to &quot;good to read&quot; blog posts in Slack… at all hours of the day. This was an excusable habit when I was just a colleague, once I became a manager I realized that it was <em>very</em> disruptive. 🤦</p>
<p>I started using the blog system in Confluence for both the stakeholder statuses and collect all my links and commentary for the week. At first I manually typed up each &quot;issue,&quot; occasionally copy/pasting the format of the previous week's entry, and finding links out of Instapaper's archive and making commentary by hand. Like an <em>animal</em>.</p>
<p>Until now.</p>
<p>As I read throughout my week, I save little snippets using <a href="http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/">my snip tool in Hammerspoon</a> or the Share API on iOS, and tag them <code>link</code> and <code>dayjob</code>. This forms the a queue of the links to share.</p>
<p><img src="https://images.evantravers.com/articles/2020/12/things-nag.png" alt="" /></p>
<p>On Monday I'm greeted by a prompt in my Task Manager with a URLscheme link to Drafts that runs the following action:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;uuid-of-my-template-draft&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">today</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">week_ago</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">today</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">7</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">workspace</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Workspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Day Job&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">drafts</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">workspace</span>
</div><div class="line" data-line="9">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;inbox&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">includes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;link&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createdAt</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">week_ago</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">drafts</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="16">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span>
</div><div class="line" data-line="17">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;### &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">
</div><div class="line" data-line="24"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">drafts</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">forEach</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">isArchived</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="25">
</div><div class="line" data-line="26"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newsletter</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newsletter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">links</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newsletter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">
</div><div class="line" data-line="30"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setClipboard</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newsletter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Short and sweet! After I've clicked the link from my Task Manager, I open Confluence, type <code>c</code> to create a page, choose the Blog template in the sidebar<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>, type <code>,,weekly</code> in the title field that Alfred.app text expands to &quot;UXWEEKLY (2020.51)&quot;, and then I paste the newsletter since the last line of my Drafts action copied the draft to the system clipboard. Voila!</p>
<p>Just what is in my clipboard? The contents of my template Draft! Let's take a (redacted) peek.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># ProctorU Weekly Template
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## 👷‍♂️ In Progress
</div><div class="line" data-line="4"></span>
</div><div class="line" data-line="5">[UX Kanban Board](link to our kanban board)
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Project #1: Fictional Title
</div><div class="line" data-line="8"></span>
</div><div class="line" data-line="9">📁: http://linktoprojectpageonconfluence.com/project-1
</div><div class="line" data-line="10">💬: [#proj-1-ux](https://dayjob.slack.com/archives/L337)
</div><div class="line" data-line="11">📈: [Link to dashboard or metrics associated with UX outcomes](http://fakelink.com/)
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">### Project #2: Fictional Boogaloo
</div><div class="line" data-line="14"></span>
</div><div class="line" data-line="15">📁: http://linktoprojectpageonconfluence.com/project-2
</div><div class="line" data-line="16">💬: [#proj-2-ux](https://dayjob.slack.com/archives/nicetry)
</div><div class="line" data-line="17">📈: [Link to dashboard or metrics associated with UX outcomes](http://fakelink.com/)
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## 🔗 Links
</div><div class="line" data-line="20"></span>
</div></code></pre>
<p>That's it! I'll write my tweet-length update in-between the header and the links of the projects, @mention anyone who needs to see it, and the links magically appear below the <code>## 🔗 Links</code> section of the newsletter.</p>
<p>Projects don't change <em>that</em> much, so as they come and go I'll add them and their pertinent information to the Draft Template.</p>
<p>This simple automation has cut down the time it takes to provide this &quot;hub&quot; for our work from 45 minutes per week to around 3 minutes… and that makes me happy. I'm sure there's a bunch of ways to automate this, but keeping it all in Drafts makes it cross platform and easy to change the template on the fly if I get new information.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Honestly, this is the step I mess up <em>every</em> week and I should automate. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Sketchnotes: UX Vision Intensive</title>
       <link>http://evantravers.com/articles/2020/12/14/sketchnotes-ux-vision-intensive/</link>
       <pubDate>Mon, 14 Dec 2020 06:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/14/sketchnotes-ux-vision-intensive/</guid>
       <description><![CDATA[ <p>This past week our team attended the <a href="https://leaders.centercentre.com">Leaders of Awesomeness</a> <em>UX Vision Intensive</em>. <a href="https://twitter.com/jmspool">Jared Spool</a> led the sessions, and I was very impressed and grateful to the time he gave us for <em>free</em>.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/12/experience-vision.jpeg" alt="sketchnote">
  <figcaption>If you want a higher-resolution copy, you can <a href="https://images.evantravers.com/articles/2020/12/experience-vision.pdf">download the pdf</a>.</figcaption>
</figure>
<p>I struggled with the difference between a vision an an envisionment. If I understand correctly, a UX vision is a depiction of a user's timeless experience, with major friction alleviated by a nearly magic product you are imagining. An envisionment is a near future implementation of a UX vision with possible technology. I have been keeping it straight by saying that Star Trek TOS is a UX Vision, where Star Trek TNG is an envisionment. 🤷‍♂️<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup></p>
<p>We are <strong>super</strong> excited to take the lessons to heart and bring a UX Vision to life… talking about that this week. I'm especially looking forward to some of the workshop exercises… &quot;despicable design&quot;<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup> sounds like fun!</p>
<p>I've been playing around with taking notes in the sketchnotes style for a year or so…<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup> this digital sketchnote I made in <a href="https://apps.apple.com/us/app/goodnotes-5/id1444383602">GoodNotes</a>, and am very happy with the tool. It has a good mix of power and simplicity that works really well for me… and even my handwriting is searchable! Highly recommended.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>If I'm misrepresenting these, please <a href="/contact">let me know</a>… I'm a TNG guy myself. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>In Despicable Design, you ask your team the question: &quot;how could we make the users experience <strong>worse</strong>?&quot; Sort of an ice breaker, and it quickly highlights which elements upon which the user's experience hinges. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>I may go back and find my first couple of sketchnotes. The first 10 were not nearly this good… and the ability of a digital note to zoom and undo makes it a <em>lot</em> easier to make something neat and clean. Just keep at it! <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>SMZ: Updated Drafts Actions</title>
       <link>http://evantravers.com/articles/2020/12/08/smz-updated-drafts-actions/</link>
       <pubDate>Tue, 08 Dec 2020 20:55:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/08/smz-updated-drafts-actions/</guid>
       <description><![CDATA[ <p>Today was the first day I used the <em>whole</em> revamped SMZ system, and it feels <strong>real</strong> good.</p>
<p>I've made a few tweaks to it, but the <a href="https://github.com/evantravers/plaintext-migration">migration script</a> has stayed stable and I haven't needed to run it in a little while… I believe that's over.</p>
<p>The final step was updating <a href="https://github.com/evantravers/smz-drafts-actions">my JS actions</a> for my beloved <a href="https://getdrafts.com">Drafts</a>.</p>
<p>I'm only a couple of weeks into using it, but so far the new version has been much more stable and usable. In the highly unlikely chance that you were using my library to build your actions, here's what's changed:</p>
<p>The &quot;library&quot; step has been renamed to <code>Zettelkasten API</code>. Some of the booknotes specific steps have been moved to another &quot;library&quot; step called <code>Booknotes API</code>.</p>
<p>In the previous version, the library treated the active draft as the &quot;data model.&quot; This caused weird heisenbugs related to what functions called <code>draft.update()</code> and which tried to not thrash the view constantly. In the V2, (<code>Zettelkasten API</code>,) the only methods that touch the active Draft object are <code>Zettel.parse(draft)</code> and <code>Zettel.update()</code>. All the other transformations happen on a simple JS object (built by <code>Zettel.parse/1</code> that takes the form of <code>&lbrace;meta: &lbrace; … &rbrace;, content: &quot;foo&quot; &rbrace;</code>.</p>
<p>So far this approach has meant <em>much</em> easier debugging and predictability. I'm a fan.</p>
<p>The previous versions had dependencies on &quot;template&quot; drafts that couldn't possibly exist on another person's database… so all the &quot;templates&quot; are now in the actions themselves. I think there's still a dependency on having a workspace named &quot;Booknotes,&quot; but that's pretty solvable by an end user.</p>
<p>The use-cases are still about the same. As I move through my day, I throw quotes, links, and snippets of ideas in Drafts. During the daily review at the end of the day I go through Drafts, expand and save the thoughts that need to be saved. The new actions don't add all the kluge metadata that blocks the view of the title until it's saved.</p>
<p>If it's something you are interested in... message me on twitter and I'll try to fix it for you. Until then, <a href="https://actions.getdrafts.com/g/16J">add it to Drafts here</a>.</p> ]]></description>
    </item>
    <item>
       <title>Migrating a Decade of Plaintext to Zettelkasten</title>
       <link>http://evantravers.com/articles/2020/12/02/migrating-a-decade-of-plaintext-to-zettelkasten/</link>
       <pubDate>Wed, 02 Dec 2020 20:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/12/02/migrating-a-decade-of-plaintext-to-zettelkasten/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/12/graph.png"></p><div class="admonition tldr">
<p>This is going to be a code-heavy post. Use a repeatable script, take advantage of good programming practices to control the data going into your system and normalize it. Borrow liberally from me if that helps. 🙏_</p>
</div>
<p>I <em>think</em> I'm done with an eight month-long struggle to import all my previous plaintext notes into the Simple Markdown Zettelkasten format. It was not easy… but I thought I'd share some of the lessons that I learned and tricks that I used.</p>
<p>I've been playing around with Zettelkasten style note-taking for a while now… and I'm pretty convinced that having everything in one place is the right path for me for now.</p>
<p>Abbreviated version of my plaintext adventures to this point…</p>
<ol>
<li>Notepad documents from Windows and Ubuntu computers.</li>
<li>Plain text on an Android Dev-1 phone… some terrible text editor.</li>
<li>nvALT and Simplenote for <em>years</em>.</li>
<li>Daily devotional note on iPhone using Byword that got <em>so</em> long it routinely crashed my phone.</li>
<li>Vimwiki diary and wiki for five years at my last job.</li>
<li>Experimental zettelkasten using the MMD metadata.</li>
</ol>
<p>There's some duplication, some craziness… and in the end it's <strong>2,068</strong> files. Let's get to work.</p>
<h2><a href="#use-a-script" aria-hidden="true" class="anchor" id="use-a-script"></a>Use a script.</h2>
<p>Just like any <a href="http://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/">large scale migration</a>, using a script has <em>huge</em> advantages over a series of manual &quot;find and replace.&quot; If you write it correctly, it's repeatable, and you'll get the same results each time, which means that if you get more data to migrate, or change your mind about a format... you change the script and run it again. I changed my mind half a dozen times while I was working on this script, and I was actively using the zettelkasten as I went.</p>
<p>For instance... while working on the script, <a href="http://evantravers.com/articles/2020/11/28/obsidian-fixed-unlinked-mentions-for-zk-ids/">Obsidian released the <code>aliases</code> feature</a> that lets backlinks work with Zettelkasten notes... I just <a href="https://github.com/evantravers/plaintext-migration/commit/923e914e506f1e6de8502f28bd241a8a23124e64">adjusted my script</a> and kept on rolling.</p>
<p>(Also, running the script while having Obisdian open on graph mode made for a <em>really</em> cool building animation that was definitely fun!)</p>
<p>I did flex some computer science muscles, and <a href="https://github.com/evantravers/plaintext-migration/blob/master/lib/zettel.rb">defined a class</a> with a bunch of (inconsistently named) convenient methods and a standardized metadata format.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Zettel</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">knowledge</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Zettelkasten is cool!</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">This note is useful, but short.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set_meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">20201228369</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># this would render as:</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="12">---
</div><div class="line" data-line="13">title: &#39;Zettelkasten is cool!&#39;
</div><div class="line" data-line="14">tags: [&#39;#knowledge&#39;]
</div><div class="line" data-line="15">id: 20201228369
</div><div class="line" data-line="16">---
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">This note is useful, but short.
</div><div class="line" data-line="19"></span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div></code></pre>
<p>(using <a href="https://github.com/evantravers/plaintext-migration/blob/master/lib/zettel.rb">zettel.rb</a>)</p>
<p>The code is <em>not</em> pretty... you can rip it off, but don't look too closely. 🤣</p>
<p>Having a single code-path to make a zettel makes the next step easy...</p>
<h2><a href="#adjust-your-script-per-source" aria-hidden="true" class="anchor" id="adjust-your-script-per-source"></a>Adjust your script per source.</h2>
<p>I wrote a customized script per &quot;source&quot; that I listed in my history above. Each one has details specific to that system...</p>
<p>My nvALT notes have titles in their filenames:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">entry</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/plaintext-migration/blob/ab76fd79e208d759d9b0f6df016e37e9ae769959/migrate.rb#L265">migrate.rb</a>)</p>
<p>But, vimwiki diary entries have <code>&lt;h2&gt;</code>s for some reason:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">scan</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/plaintext-migration/blob/ab76fd79e208d759d9b0f6df016e37e9ae769959/migrate.rb#L222">migrate.rb</a>)</p>
<p>This kind of flexibility is <em>super</em> handy.</p>
<h2><a href="#guarantee-unique-ids" aria-hidden="true" class="anchor" id="guarantee-unique-ids"></a>Guarantee unique IDs.</h2>
<p>This is critical... and hard. I used a <code>Set</code> in Ruby like I have in the past, and it worked pretty well. I added a bunch of instrumentation to help me troubleshoot.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Migrator</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">../../wiki/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">initialize</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@unique_ids</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># [ ... ]</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ensure_uniqueness</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@unique_ids</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include?</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># we&#39;ve got a dup</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">🔴 Duplicate ID! </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_i</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trying </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ensure_uniqueness</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">size</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="20">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> 🟡 ID is too long! </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="21">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elsif</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">size</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">12</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="22">        <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> 🟡 ID is too short! </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="23">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="24">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@unique_ids</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;&lt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span>
</div><div class="line" data-line="25">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="26">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/plaintext-migration/blob/ab76fd79e208d759d9b0f6df016e37e9ae769959/migrate.rb#L27-L43">migrate.rb</a>)</p>
<h2><a href="#filter-tags-in-place" aria-hidden="true" class="anchor" id="filter-tags-in-place"></a>Filter tags in place.</h2>
<p>I also used the <code>Zettel</code> class to change and filter data going into the knowledge system graph:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">add_tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># not nil</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span>
</div><div class="line" data-line="4">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># not just a number</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">size</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># not a single character</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># blacklist</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">unless</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">responsible</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="15">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">todos_archived</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wizardsetupstep</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create_tickets</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="20">        <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># [ ... ]</span>
</div><div class="line" data-line="21">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">todo</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="22">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include?</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="23">
</div><div class="line" data-line="24">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="25">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">case</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span>
</div><div class="line" data-line="26">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">when</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pmux</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="27">            <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ux</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="28">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">when</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">interview</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="29">            <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">career</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="30">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">when</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="31">            <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="32">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">when</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="33">            <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">books</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="34">          <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># [ ... ]</span>
</div><div class="line" data-line="35">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="36">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span>
</div><div class="line" data-line="37">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="38">
</div><div class="line" data-line="39">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="40">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="41">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="42">          <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@meta</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="43">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="45">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="47"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/plaintext-migration/blob/master/lib/zettel.rb#L40-L152">zettel.rb</a>)</p>
<p>By having a single &quot;point of contact&quot; with the <code>Zettel</code> class, I was able to filter out or modify tags as they went into the final product.</p>
<h2><a href="#use-the-internet-to-supplement-metadata" aria-hidden="true" class="anchor" id="use-the-internet-to-supplement-metadata"></a>Use the internet to supplement metadata.</h2>
<p>Probably the cleverest thing I did was to grab data from Google Books to add metadata to my booknotes.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknote</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> by </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strip</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> by </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">last</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strip</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">books</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">JSON</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Net</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HTTP</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get_response</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://www.googleapis.com/books/v1/volumes?q=</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">URI</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encode</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">books</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">items</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">min_by</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">levenshtein_distance</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">volumeInfo</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">volumeInfo</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:subtitle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subtitle</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:author</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">authors</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">, </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># close enough to MLA</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:publisher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">publisher</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zettel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:identifer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">industryIdentifiers</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">identifier</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/plaintext-migration/blob/569e39bb075e969e55e263d993f76173f407a904/migrate.rb#L113-L139">migrate.rb</a>)</p>
<p>I'm pretty proud of using using the <a href="https://en.wikipedia.org/wiki/Levenshtein_distance">Levenshtein distance</a> to choose the most likely search result. It works fine for me, and my &quot;database&quot; has a little more information.</p>
<h2><a href="#go-do-it" aria-hidden="true" class="anchor" id="go-do-it"></a>Go do it!</h2>
<p>I'm <em>really</em> happy that I'm done, and I've <a href="https://github.com/evantravers/plaintext-migration/">got the script</a> if I ever discover something isn't quite out of whack. I can now start using my knowledge system fearlessly... except I have to finish writing <a href="https://github.com/evantravers/smz-drafts-actions">my Drafts actions</a>.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: November</title>
       <link>http://evantravers.com/articles/2020/11/30/books-and-links-november/</link>
       <pubDate>Mon, 30 Nov 2020 18:28:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/30/books-and-links-november/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/11/office.jpg"></p><p>Hard to believe that tomorrow starts December of 2020. The years are short and the days are long.</p>
<p>Grateful to be chasing my toddler around the house with matching magnifying glasses, solving &quot;mysteries&quot; that I've scrawled on scrap paper. God is good.</p>
<p>I wrote a fair amount of code this month, mostly around the simple markdown zettelkasten work that I <em>finally</em> unblocked.</p>
<p><img src="https://images.evantravers.com/articles/2020/11/contributions.png" alt="contributions on github" /></p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I actually read some books this month! Still trying to get my booknotes straightened out, but this month's progress emboldened me.</p>
<p>On deck: Design Systems, Knowing God, The 12 Week Year, and maybe that new Brandon Sanderson action.</p>
<h3><a href="#whiskey-tango-foxtrot-by-lynne-m-black-jr" aria-hidden="true" class="anchor" id="whiskey-tango-foxtrot-by-lynne-m-black-jr"></a>Whiskey Tango Foxtrot by Lynne M. Black, Jr.</h3>
<p>Content warning: Some language and discussion of the sins of soldiers.</p>
<p>I heard about this on a podcast... and it's a wild ride. It's very hard to believe that all that happened to one person. The aggressive and decisive decision making under fire is really inspiring.</p>
<h3><a href="#the-pastel-city-by-michael-john-harrison" aria-hidden="true" class="anchor" id="the-pastel-city-by-michael-john-harrison"></a>The Pastel City by Michael John Harrison</h3>
<p>I'm a fan of &quot;The New Weird,&quot; so I had this on the queue to revisit some of the &quot;weird fiction&quot; that inspired some of the books I've enjoyed.</p>
<p>Kind of crazy that this book was in 1971. I can see its echos in Star Wars, Brandon Sanderson, and of course New Weird like the Southern Reach trilogy.</p>
<h3><a href="#children-of-time-by-adrian-tchaikovsky" aria-hidden="true" class="anchor" id="children-of-time-by-adrian-tchaikovsky"></a>Children of Time by Adrian Tchaikovsky</h3>
<p>This book <em>devoured</em> my time until it was done. I don't think I've read it before, but I am fairly certain that I had it explained to me by someone at some point. (Looking at you Robert H.!)</p>
<p>If you like high-concept scifi and haven't read this one, this is a good one to visit. It deserves the accolades it got.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#i-spent-11-years-working-on-this-line-rider-track--by-david-lu--medium" aria-hidden="true" class="anchor" id="i-spent-11-years-working-on-this-line-rider-track--by-david-lu--medium"></a>I Spent 11 Years Working on This Line Rider Track | by David Lu | Medium</h3>
<blockquote>
<p>I remember when I first discovered Line Rider, that Flash game from 2006 with the simple premise of drawing a track for a sledder to ride on. I was immediately sucked into it, doing things like devising elaborate tracks for the rider to overcome, building worlds for the rider to explore, and manipulating the rider to perform stunts.</p>
<p>[…]</p>
<p>Eleven years later, after I reversed engineered and recreated Line Rider, after I developed as an artist and explored all types of creative mediums, I finally completed the project and even went beyond my original vision, reclaiming the project to tell a new story.
I present to you, Omniverse II.</p>
</blockquote>
<iframe width="100%" height="500" src="https://www.youtube.com/embed/WeW0xvOjvHc" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>😱😱😱</p>
<p><a href="https://delu.medium.com/i-spent-11-years-working-on-this-line-rider-track-96742fc0b709">I Spent 11 Years Working on This Line Rider Track | by David Lu | Medium</a></p>
<h3><a href="#copying-is-the-way-design-works--matthew-ström-designer--developer" aria-hidden="true" class="anchor" id="copying-is-the-way-design-works--matthew-ström-designer--developer"></a>Copying is the way design works || Matthew Ström: designer &amp; developer</h3>
<blockquote>
<p>There’s another word in Chinese for a copy: shanzhai (山寨). It’s translated to English as “fake,” but as with most Chinese words, the translation is lacking. Shanzhai literally means “mountain stronghold;” the word is a neologism, a recent invention, inspired by a famous novel in which the protagonists hide in a mountain stronghold to fight against a corrupt regime. Shanzhai products are playful, drawing attention to the fact that they aren’t original, putting their makers’ creativity on display.</p>
<p>Take the popular shanzhai novel Harry Potter and the Porcelain Doll; in it, Harry goes to China to stop Voldemort and Voldemort’s Chinese counterpart. It doesn’t pretend to be an original. It plays on its fake-ness: Harry speaks Chinese fluently, but he has trouble eating with chopsticks.</p>
<p>It’s easy to think of shanzhai as a Chinese quirk, but there are parallels in Western culture. One in particular, is a staple of the design community: the unsolicited redesign.</p>
</blockquote>
<p>Wonderful essay.</p>
<p><a href="https://matthewstrom.com/writing/copying/">Copying is the way design works || Matthew Ström: designer &amp; developer</a></p>
<h3><a href="#the-truth-about-expressive-individualism" aria-hidden="true" class="anchor" id="the-truth-about-expressive-individualism"></a>The Truth about Expressive Individualism</h3>
<blockquote>
<p>expressive individualism is simply this idea that the most authentic individual, the most real person, is the person who expresses or performs outwardly that which they are inwardly.</p>
</blockquote>
<p>I found this to be very helpful… it's a philosophy that spans across our entire culture these days… &quot;that person is so real&quot; is a common refrain.</p>
<blockquote>
<p>One of the big differences between what we might call Christian expressive individualism and secular expressive individualism is that Christian expressive individualism acknowledges that there may be a problem with that which is inside.</p>
</blockquote>
<p><a href="https://www.crossway.org/articles/the-truth-about-expressive-individualism/">The Truth about Expressive Individualism</a></p>
<h3><a href="#how-to-think-for-yourself" aria-hidden="true" class="anchor" id="how-to-think-for-yourself"></a>How to Think for Yourself</h3>
<blockquote>
<p>I wish someone had told me about this distinction when I was a kid, because it's one of the most important things to think about when you're deciding what kind of work you want to do. Do you want to do the kind of work where you can only win by thinking differently from everyone else? I suspect most people's unconscious mind will answer that question before their conscious mind has a chance to. I know mine does.</p>
</blockquote>
<p>To try and avoid conventional thinking is an interesting idea… it's particularly weird since people on both sides of the aisle consider the other side to be the convention.</p>
<blockquote>
<p>More generally your goal should be not to let anything into your head unexamined, and things don't always enter your head in the form of statements. Some of the most powerful influences are implicit. How do you even notice these? By standing back and watching how other people get their ideas.</p>
</blockquote>
<p>This sounds like choosing to develop your worldview more than anything else. I can agree with that.</p>
<p><a href="http://www.paulgraham.com/think.html">How to Think for Yourself</a></p>
<h3><a href="#the-rise-and-triumph-of-the-modern-self--tim-challies" aria-hidden="true" class="anchor" id="the-rise-and-triumph-of-the-modern-self--tim-challies"></a>The Rise and Triumph of the Modern Self | Tim Challies</h3>
<blockquote>
<p>It turns finally to the world-changing ideas of Friedrich Nietzsche, Karl Marx, and Charles Darwin who each “in their different ways provided conceptual justification for rejecting the notion of human nature and thus paved the way for the plausibility of the idea that human beings are plastic creatures with no fixed identity founded on an intrinsic and ineradicable essence.” It is through these men that society’s notion of the self became psychologized.</p>
</blockquote>
<p><a href="https://www.challies.com/book-reviews/the-rise-and-triumph-of-the-modern-self/">The Rise and Triumph of the Modern Self | Tim Challies</a></p>
<h3><a href="#youre-all-just-jealous-of-my-jetpack" aria-hidden="true" class="anchor" id="youre-all-just-jealous-of-my-jetpack"></a>YOU'RE ALL JUST JEALOUS OF MY JETPACK</h3>
<p>I love this artist.</p>
<p><img src="https://64.media.tumblr.com/91554541232522d3cd17d02b4260d5c9/77bdcdb34837f880-a9/s500x750/5f6549dc4f880701fb43f1662c8d2f6ed9bb6035.jpg" alt="cartoon" /></p>
<p><a href="https://myjetpack.tumblr.com/post/634935022132051968/my-latest-cartoon-for-new-scientist-see-more-of-my">YOU'RE ALL JUST JEALOUS OF MY JETPACK | My latest cartoon for New Scientist See more of my...</a></p>
<h3><a href="#jeffrey-paul-your-computer-isnt-yours" aria-hidden="true" class="anchor" id="jeffrey-paul-your-computer-isnt-yours"></a>Jeffrey Paul: Your Computer Isn't Yours</h3>
<p>We were all super confused when this happened mid November… but now I'm just concerned. It probably wasn't a malicious design originally, but this sounds like something that <a href="https://www.apple.com/apples-commitment-to-customer-privacy/">a company truly committed to privacy</a> should address.</p>
<blockquote>
<p>On modern versions of macOS, you simply can’t power on your computer, launch a text editor or eBook reader, and write or read, without a log of your activity being transmitted and stored.</p>
<p>It turns out that in the current version of the macOS, the OS sends to Apple a hash (unique identifier) of each and every program you run, when you run it. Lots of people didn’t realize this, because it’s silent and invisible and it fails instantly and gracefully when you’re offline, but today the server got really slow and it didn’t hit the fail-fast code path, and everyone’s apps failed to open if they were connected to the internet.</p>
</blockquote>
<p><a href="https://sneak.berlin/20201112/your-computer-isnt-yours/">Jeffrey Paul: Your Computer Isn't Yours</a></p> ]]></description>
    </item>
    <item>
       <title>Obsidian Fixed Unlinked Mentions for ZK IDs!</title>
       <link>http://evantravers.com/articles/2020/11/28/obsidian-fixed-unlinked-mentions-for-zk-ids/</link>
       <pubDate>Sat, 28 Nov 2020 16:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/28/obsidian-fixed-unlinked-mentions-for-zk-ids/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/11/graph.png"></p><p>I have been working on the <a href="https://github.com/evantravers/plaintext-migration">migration script</a> to move my plaintext notes to a format that Obsidian and other applications will like.</p>
<p>I determined that it seemed more applications had adopted YAML syntax for their frontmatter<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> Adopting this format would be as app-compatible as possible. With my previous recommendation of using multimarkdown-style frontmatter, you were locked to MMD, but by using YAML I could use multimarkdown, github-markdown, common mark, or just plain markdown.</p>
<p>With the <code>#hashtag</code> style tags and YAML markdown, pretty much everything in Obsidian worked 100% with SMZ style zettels <em>except</em> the incredible useful &quot;Unlinked Mentions.&quot;</p>
<p>Until yesterday. 🤷</p>
<p>Obsidian is moving <em>very</em> fast, and each new build update the team posts to Discord brings wonderful toys. I bought the Insider Access to try out the feature I was interested in… they rolled it out to the general public around four hours afterward. I am not sorry at all… they are making an amazing application.</p>
<p><a href="https://forum.obsidian.md/t/obsidian-release-v0-9-17/8862">Obsidian v0.9.16</a> brought the ability to define an <code>aliases</code> attribute in the frontmatter of a note. That means if you have a note named &quot;Artificial Intelligence&quot; with the file name <code>Artificial Intelligence.md</code>, you can set up aliases like:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">---
</div><div class="line" data-line="2">title: &quot;Artificial Intelligence&quot;
</div><div class="line" data-line="3">aliases: [&#39;AI&#39;, &#39;Expert Systems&#39;]
</div><div class="line" data-line="4">tags: [&#39;#futurism&#39;, &#39;#technology&#39;]
</div><div class="line" data-line="5">---
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">Artificial Intelligence broadly covers a number of technologies ranging from […]
</div></code></pre>
<p>Now… any time in your notes there is the string &quot;AI&quot;, &quot;Artificial Intelligence&quot;, or &quot;Expert Systems,&quot; Obsidian will show it as an unlinked mention, ready to be linked up.</p>
<p>This works for filenames containing a Zettelkasten ID! If your filename is <code>202011280902-obsidian.md</code> you can define your alias simply as:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">---
</div><div class="line" data-line="2">title: &quot;Obsidian&quot;
</div><div class="line" data-line="3">aliases: [&#39;Obsidian&#39;]
</div><div class="line" data-line="4">tags: [&#39;#knowledge_management&#39;]
</div><div class="line" data-line="5">---
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">I&#39;m really starting to like Obsidian[…]
</div></code></pre>
<p>Suddenly, Unlinked Mentions work perfectly! 🥳 This closes <a href="https://forum.obsidian.md/t/display-a-list-of-current-notes-outgoing-unlinked-mentions/8830">a feature-request</a> I that has been floating around for a <em>long</em> while, and really excites me to get the last 10 years of notes into a place where Obsidian can find it. Suddenly I can be working on a note on &quot;Leadership&quot;, and find journal entries and project logs that cross reference &quot;leadership&quot; and draw new conclusions.</p>
<p><img src="https://images.evantravers.com/articles/2020/11/unlinked.png" alt="" /></p>
<p>I included this idea of <code>aliases</code> in <a href="https://github.com/evantravers/plaintext-migration/commit/923e914e506f1e6de8502f28bd241a8a23124e64">my migration script</a>, and I am having a <strong>blast</strong> re-discovering all my notes (<em>especially</em> book notes!) and seeing all the new ways that they relate.</p>
<p>The only hitch here is that when I create a new note, it would be nice for Obsidian to make it <em>really</em> easy to have a note with the ZK ID and automatically add the title and alias. I have seen a templating system in Obsidian and I'll dig into it, but I don't think it has the simple syncing smarts that I'm looking for… so I may add Obsidian scripting to my todo list right after I finish fixing my Drafts workflows.</p>
<p>Honestly thinking out loud… I'd probably be just as happy using Drafts to write all my zettel and use actions to send them to Obsidian, treating Obsidian as a research tool and Drafts as a capture tool… I think I will definitely prioritize my Drafts actions soon. 👍</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I'll eventually fix the table in the original article and link it here. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Zettelkasten Updates...</title>
       <link>http://evantravers.com/articles/2020/11/23/zettelkasten-updates/</link>
       <pubDate>Mon, 23 Nov 2020 20:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/23/zettelkasten-updates/</guid>
       <description><![CDATA[ <p>Since I wrote my last post… there has been <em>so</em> much motion in the knowledge-management / note-taking space, largely due to the exploding popularity of <a href="https://roamresearch.com/">Roam Research</a>. Many apps have adopted Roam-like features like <a href="https://www.macstories.net/ios/note-linking-in-bear-expands-to-include-section-linking/">linking to blocks</a>, <a href="https://docs.getdrafts.com/docs/drafts/cross-linking.html">wiki links</a>, or graph views.</p>
<p>This has greatly excited me to learn and code more tooling for this kind of thinking … but it has also had a paralyzing effect. There's <em>so</em> many more options out there for creating this kind of networked knowledge management, whether you call it a wiki, a zettelkasten, or whatever. Like many I don't know exactly where to turn.</p>
<p>For the (three of you) that read this and care, here's what I'm looking for as I watch this next wave of note-taking apps. I'm attempting to balance convenient accessibility and complete ownership… on a budget. :P</p>
<h2><a href="#i-still-want-to-own-my-content" aria-hidden="true" class="anchor" id="i-still-want-to-own-my-content"></a>I still want to own my content.</h2>
<p>This is the main reason that Roam (however wonderful!) is not an option for me. I want to be able to own, export, transfer, and transform my content however I wish. Part of this is because I'm persnickety, part of it is because I'm a programmer. It would be foolish to give up my ability to program/script against the notes that I plan to spend a life on.</p>
<p>I also want the file format to &quot;work&quot; as a Zettelkasten independent of a particular app. A helpful thought: my system should still be usable when printed.</p>
<h3><a href="#markdown" aria-hidden="true" class="anchor" id="markdown"></a>Markdown</h3>
<p>Markdown continues to be the way I write and store content. While it is frustrating <a href="https://xkcd.com/927/">how many standards there are</a>, markdown still is the best option for writing that I know of (unless you are a LaTeX fan, I suppose. Latechie? Latexan?)</p>
<p>Being a bare text file, Markdown does present the problem of &quot;where do the images/files go?&quot; But that doesn't worry me too much… as long as I have a service or server that supports URLs. Anything is automatable.</p>
<h3><a href="#metadata-within-the-content-of-the-file" aria-hidden="true" class="anchor" id="metadata-within-the-content-of-the-file"></a>Metadata within the content of the file.</h3>
<p>I <em>still</em> believe in having <a href="https://neuron.zettel.page/id.html">a stable ZK style ID</a>. If there is unique ID (or UID) we can rename/retitle the file with low risk of irrevocably broken links.</p>
<p>For example: I started a zettel thought around a particular Bible verse, but over time the thought changed from simply this one verse to a discussion of the &quot;fear of the Lord.&quot; If the title of the thought changes, does the file name? If the file name changes, what happens to all the links?</p>
<p>Most knowledge management software solutions handle this using their internal database to update all the links in all the other files if the linked-to title/file name changes.</p>
<p>I also am in favor of all metadata existing within the <em>body</em> of the file. This way if I were to print my knowledge base it would <em>still</em> work.</p>
<p>This is <em>the</em> sticky point for most of the solutions and applications that we are going to look at today.</p>
<p>Trying to consider maximum future compatibility, there are the two changes from my original recommendation:</p>
<ol>
<li>Use YAML style frontmatter instead of the multimarkdown spec.</li>
<li>Use <code>keywords</code> instead of <code>tags</code> to respect Pandoc.</li>
</ol>
<p>(Optionally, you can change the filename structure to use spaces instead of <a href="https://en.wikipedia.org/wiki/Letter_case#Special_case_styles">kebab-case</a>.)</p>
<p><strong>Filename:</strong></p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">202011182014 Title of the note.md
</div></code></pre>
<p><strong>Content:</strong></p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">---
</div><div class="line" data-line="2">id: 202011182014
</div><div class="line" data-line="3">title: Title of the note
</div><div class="line" data-line="4">keywords:
</div><div class="line" data-line="5">  - #still
</div><div class="line" data-line="6">  - #use
</div><div class="line" data-line="7">  - #hashtags
</div><div class="line" data-line="8">---
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">Body of the note should be a single thought, complete and fully formed… but not too big.
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">References and links can come below.
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">- [baseline Zettelkasten](https://zettelkasten.de/posts/baseline-zettelkasten-software-reviews/)
</div></code></pre>
<h2><a href="#apps-and-projects-im-watching" aria-hidden="true" class="anchor" id="apps-and-projects-im-watching"></a>Apps and projects I'm watching…</h2>
<p>For a bit there, I was trying to write my own system using <a href="https://github.com/evantravers/smz">shell scripts</a> and <a href="https://github.com/evantravers/smz.vim">vim</a>. I'm still messing with that, but I'm paying attention to a couple readily available projects that seem to align with my goals:</p>
<h3><a href="#obsidian" aria-hidden="true" class="anchor" id="obsidian"></a><a href="https://obsidian.md/">Obsidian</a></h3>
<p>This is been <a href="https://joshwin.imprint.to/post/how-i-use-obsidian-to-manage-my-goals-tasks-notes-and-software-development-knowledge-base">a favorite of many</a>, and I really <em>really</em> like it. It checks <strong>nearly</strong> all of the boxes: It's got a nice interface, graph view, ongoing development, and <em>markdown</em>… and a growing plugin community that is <em>very</em> strong. The <a href="https://obsidian.md/community">discord</a> is active and really helpful.</p>
<p>Obsidian does have support for both markdown and YAML front-matter. It works for 100% of the things I need, but not 100% of its feature-set works for file names that include the ZK ID.</p>
<p>This <em>really</em> shouldn't stop me from using it… it supports <em>everything</em> I could hope to implement myself. I mostly have been holding out to see if a convention supporting stable Zettelkasten-style IDs will be settled on… but if you don't really care about this, you should probably just start using Obsidian.</p>
<h3><a href="#neuron" aria-hidden="true" class="anchor" id="neuron"></a><a href="https://neuron.zettel.page/">Neuron</a></h3>
<p>I <em>really</em> like what I see in Neuron. It's <a href="https://neuron.zettel.page/philosophy.html">philosophy</a> matches up with what I would like and its shell-script approach allows there to be multiple editors like <a href="https://github.com/felko/neuron-mode">emacs</a>, <a href="https://github.com/fiatjaf/neuron.vim">vim</a>, and <a href="https://github.com/svsool/vscode-memo#memo">VS Code</a>.</p>
<p>I would <em>really</em> like to try it out (it seems nearly perfect for me!), but it has a really strange install method that is prohibitively hard on OS X. It looks like there is some <a href="https://github.com/srid/neuron/issues/307">recent motion</a> on it though, so maybe I'll get to test-drive it soon.</p>
<h3><a href="#foam" aria-hidden="true" class="anchor" id="foam"></a><a href="https://github.com/foambubble/foam">Foam</a></h3>
<p>Foam is the most popular (that I can see) of the multitude of plugins for VS Code.</p>
<p>If you use VS Code daily as your editor, something like this makes a lot of sense. I still am hoping for something cross-form, but whatever. It's an impressive plugin.</p>
<h3><a href="#logseq" aria-hidden="true" class="anchor" id="logseq"></a><a href="https://logseq.com/">Logseq</a></h3>
<p>Logseq is an interesting option… it's entirely web-based, but connects to your GitHub. This means you could interact with it using any desktop editor of your choice… but you could also work on it on a mobile device or iPad natively in the browser, as long as you have an internet connection.</p>
<p>Basically, logseq is a roam research clone that stores the data as markdown files on your github. Pretty cool.</p>
<p>Even if you don't use it as your primary editor, you could use this to work on a Simple Markdown Zettelkasten from mobile.</p>
<h3><a href="#vanilla-vim--emacs" aria-hidden="true" class="anchor" id="vanilla-vim--emacs"></a>Vanilla Vim / Emacs</h3>
<p>There's nothing stopping you from doing this all by scratch. I've started down <a href="https://github.com/evantravers/smz">this path a little bit with the help of much smarter people</a>. At the moment I'm not actively pursuing it… I want to make sure my file format / data structure is more finalized. There are folks with similar but <a href="https://github.com/sirupsen/zk">much more mature solutions</a>. I fear I may not have the time to learn lua/vimscript fast enough. :P</p>
<h2><a href="#where-does-that-leave-me" aria-hidden="true" class="anchor" id="where-does-that-leave-me"></a>Where does that leave me?</h2>
<p>I'm in the middle of <a href="https://github.com/evantravers/plaintext-migration/tree/13fb162a7718c1564b06b7e423661788844f6151">writing a transition script</a> to transform my existing plaintext notes, book notes, and baby zettelkasten (V1!) into the &quot;new&quot; format with YAML metadata. I haven't given it the attention it deserves, so now I have the old zettelkasten, new notes, old untransformed plaintext notes… I put myself in a place where I have notes <em>everywhere</em> in at least <em>six</em> formats. It's a problem.</p>
<p>Over the next few days, I'm probably going to resume the Sisyphean effort of working on my notes… (I last time I counted there's about 2k files in my untransformed folder!) but I thought I'd post what I'm thinking heading into it all.</p>
<p>If anyone is further down this path, I'd love to hear about it. It's a great time to be refactoring and rethinking your note taking options... just don't get stuck mid-transition. 🤮</p> ]]></description>
    </item>
    <item>
       <title>Day of Automation</title>
       <link>http://evantravers.com/articles/2020/11/07/day-of-automation/</link>
       <pubDate>Sat, 07 Nov 2020 09:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/07/day-of-automation/</guid>
       <description><![CDATA[ <p>I thought I'd record the automations that I've written that I use in a normal workday… I started <a href="https://talk.automators.fm/t/a-day-in-the-life-of-an-automator/8735">a thread on automators.fm</a> for this, hopefully someone else will take this up and I'll learn some neat things from y'all!</p>
<p>My alarm wakes me up… depends on the day there's different alarms (that's an automation, right?)</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2020/11/log_weight.PNG">
  <img src="https://images.evantravers.com/articles/2020/11/weight_chart.PNG">
</figure>
<p>I step on my (formerly &quot;smart&quot; but now broken!) scale and use a shortcut to log weight to Apple Health. It then uses <a href="https://apps.apple.com/us/app/charty-for-shortcuts/id1494386093">Charty</a> to display a custom graph showing me how far I have to go til my goal weight.</p>
<p>Today was a run day… so I grabbed my running gear and drove out to the route I run.</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2020/11/shortcuts.PNG">
  <img src="https://images.evantravers.com/articles/2020/11/headspaces.PNG">
</figure>
<p>I have a master &quot;headspace&quot; shortcut for all the things on my phone… I choose &quot;Workout&quot; and <a href="/articles/2020/11/06/one-button-workout-shortcut/">it runs the workout I have scheduled for that day</a>.</p>
<p>After my run, it's time to have my quiet time: I run my Quiet Time headspace on my phone, it launches Dark Noise to a sound I only play during quiet time, and opens the app that controls the camera in my daughter's room so I can see when she's stirring and swoop her up before she wakes my wife.</p>
<p><img src="https://images.evantravers.com/articles/2020/11/rituals.png" alt="rituals" /></p>
<p>I have several recurring to-dos and lists to help me to plan my day, write the Monday blog post for work, etc.</p>
<p>Once at my desk, I use <a href="/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">Hyper</a> to open a few apps and clean out a few emails.</p>
<p>Then I used Headspace to enter <a href="/articles/2020/06/19/hammerspoon-headspace/">meeting mode</a> for standup.</p>
<p>Each Monday, I presently write a mini-blog post at work in our wiki.</p>
<ul>
<li>I use Alfred's text expansion feature to generate the post title (<code>,,puweekly</code> becomes <code>UXWEEKLY (2020.43)</code>.</li>
<li>I build the post by pulling the links from a &quot;workspace&quot; in Drafts using the links I'd saved to drafts using the <a href="/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/#bonus-snip-browser-highlight-to-drafts-as-a-simple-markdown-zettelkasten">Hammerspoon snip tool I built</a>.</li>
</ul>
<p>Today happens to have lots of meetings…</p>
<ul>
<li><a href="http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/">A quick script</a> I wrote in Hammerspoon tied to my Hyper key allows me to focus the tab with the google meet. I use it constantly to help me unmute.</li>
<li>I have <a href="/articles/2020/06/12/hammerspoon-handling-windows-and-layouts/">Autolayout</a> rules that put the window with the meeting tab on the monitor that has the camera.</li>
<li>Headspace is tracking the time spent in meetings to Toggl Track.</li>
<li>Headspace is also blocking distracting applications like Reeder, so that I can stay focused.</li>
<li>Hyper is letting me log little notes into Drafts.</li>
<li>I do have some <a href="/articles/2019/09/24/world-of-textfiles-meeting-notes/">Drafts automations</a> for tying to a meeting note… so that it get's saved into my Zettelkasten in the right format, but I don't use that too often.</li>
<li>Hyper is letting me push to-dos to Things inbox.</li>
<li>I open a design file, and my <a href="https://github.com/evantravers/qmk_firmware/blob/e712a196f3f821afc1754813b45c1abf4e471c3d/users/evantravers/wrappers.h#L67-L69">QMK custom layout</a> tricks let me <a href="/articles/2019/04/03/my-keyboard-setup/#qmk-layers">use my keyboard as a macropad</a>, changing tabs, zooming, etc.</li>
</ul>
<p>Meetings are over! Time to go to lunch… I run <a href="https://github.com/evantravers/hammerspoon-config/blob/3d84ed6cbdca91bb5b11bd646ff75ed351db3298/spaces/shutdown.lua">shutdown headspace</a> that stops tracking, clears the blocked apps, and closes all apps so that I have a fresh chance at being focused when I get back.</p>
<p>More of the same as before lunch… I do take a break, running my &quot;Rest/Play&quot; Headspace so that Reeder and some other distractions are unblocked. I can now set a timer in my headspace by prefixing integers with <code>:</code>, so I use that to for 15 minutes. <code>play :15</code>.</p>
<p>My energy is <strong>really</strong> low… so I run the <a href="https://github.com/evantravers/hammerspoon-config/blob/3d84ed6cbdca91bb5b11bd646ff75ed351db3298/spaces/shallow.lua">&quot;Shallow&quot; time headspace</a> to unblock some distractions, but it also loads up all the work to-dos tagged <code>$Low</code>. Sure enough, I find some good ankle-biter tasks to work on. I'm encouraged and energized by the momentum to get into some better, deeper work.</p>
<p>At the end of the day, I run through my review checklist to review and plan the next day.</p>
<p>I open my <a href="/articles/2020/10/09/focus-budget-updated-implementation/">Headspace scheduling automation</a> to put to-dos on the calendar for tomorrow.</p>
<p>The day done, I run Shutdown again to stop timer and close apps for a fresh focused start tomorrow.</p>
<hr />
<p>This was a fun exercise... it was both super interesting to see just how much of my tooling is totally custom to me, and way more satisfying to see that I've already written about and documented a lot of it. In the days since I recorded this, I've realized even more automations that I haven't covered... more iOS stuff, lots of dotfiles automations to keep my computers synced and current... a lot more to share!</p> ]]></description>
    </item>
    <item>
       <title>One-Button Workout Shortcut</title>
       <link>http://evantravers.com/articles/2020/11/06/one-button-workout-shortcut/</link>
       <pubDate>Fri, 06 Nov 2020 09:02:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/06/one-button-workout-shortcut/</guid>
       <description><![CDATA[ <p>Any area of your life where there are regular patterns or discipline is ripe for automation... like exercise!</p>
<h2><a href="#alarming-developments" aria-hidden="true" class="anchor" id="alarming-developments"></a>Alarming developments...</h2>
<p>I’ve going to <a href="http://f3birmingham.com/">f3birmingham.com</a> workouts, and I’ve got a shortcut to remind me to log the workout to Strava. I don’t go <em>every</em> time, so I just figured out a way to automate it: fire the automation only when the alarm I set to attend in the morning goes off.</p>
<p><img src="https://images.evantravers.com/articles/2020/11/alarm_automation.jpg" alt="" /></p>
<p>The automation in the “Do” block looks like:</p>
<p><img src="https://images.evantravers.com/articles/2020/11/schedule_pushcut.jpg" alt="" /></p>
<h2><a href="#one-button" aria-hidden="true" class="anchor" id="one-button"></a>One button</h2>
<p>On all the other days, I used to have a &quot;choose one&quot; shortcut that let me pick what workout I wanted to do from a list. I was using the iOS14 &quot;choose from Shortcut folder&quot; action, so I have separate Shortcuts for each type of workout I do.</p>
<p>Last night I realized that I could make life even easier on my sleepy self... I have a consistent schedule for my workouts, so if I know in advance what workout I'm going to do in the morning, I can program that in!</p>
<p>So I wrote a new workout shortcut:</p>
<p><img src="https://images.evantravers.com/articles/2020/11/one_button_workout.jpg" alt="" /></p>
<p>I have a shortcut that builds that dictionary in <a href="https://datajar.app/">Data Jar</a> to “set my schedule”</p>
<p><img src="https://images.evantravers.com/articles/2020/11/set_schedule.jpg" alt="" /></p>
<p>That means if I want to tune a particular workout, I just change its shortcut in that Workouts folder… I’ll probably make one for stretching or yoga and just add it, and I can change my schedule!</p>
<p>This means that when I wake up, I hit workout and the app opens, playlist starts, all that jazz.</p>
<h2><a href="#its-easy" aria-hidden="true" class="anchor" id="its-easy"></a>It's easy.</h2>
<p>On mornings when I commit to F3, my phone will automatically remind me to log my workout.</p>
<p>On all other mornings, I hit <em>one</em> button and it does <em>exactly</em> what I want. I'm basically using iOS Shortcuts to do a User Experience style experiment on my morning routine. 💪</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: October</title>
       <link>http://evantravers.com/articles/2020/11/02/books-and-links-october/</link>
       <pubDate>Mon, 02 Nov 2020 10:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/11/02/books-and-links-october/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/11/october.jpg"></p><p>This year is <em>flying</em> by... I can't believe how quickly this month has come and gone. Grateful for a lot of beautiful days spent outside with those that I love.</p>
<p>I did get some writing done this month... I have adjusted my system to where I have a big folder of wild, half-written idea sentences, and an area where I continue to edit and develop those ideas, and I think that's unblocked me a little bit when it comes to writing.</p>
<p>I do owe many of you an update to my Simple Markdown Zettelkasten post... honestly I started a transition between two styles of ZK and kinda got stuck. Fortunately, both have stable IDs in the content of the file, so it's still usable... it just offends my data aesthetic. 🤷‍♂️</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I've been catching up on some web reading and some writing, so I haven't done as much reading this month.</p>
<p>Currently reading: Knowing God, Whiskey Tango Foxtrot, Programmer's Introduction to Mathematics.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#interesting-thoughts" aria-hidden="true" class="anchor" id="interesting-thoughts"></a>Interesting Thoughts</h3>
<h4><a href="#before-the-web-the-1980s-dream-of-a-free-and-borderless-virtual-world-pt1---youtube" aria-hidden="true" class="anchor" id="before-the-web-the-1980s-dream-of-a-free-and-borderless-virtual-world-pt1---youtube"></a>Before the Web: The 1980s Dream of a Free and Borderless Virtual World (Pt.1) - YouTube</h4>
<blockquote>
<p>Part one of a four-part documentary series about the cypherpunk movement of the 1990s, which led to the creation of bitcoin, WikiLeaks, and more.</p>
</blockquote>
<p>Originally linked on Marginal Revolution, I enjoyed this dive into the philosophical underpinnings of the early cypherpunk folk… makes me want to read Cryptonomicon again.</p>
<p>(And reinstall PGP or something!)</p>
<p><a href="https://www.youtube.com/watch?v=YWh6Yzr12iQ">Before the Web: The 1980s Dream of a Free and Borderless Virtual World (Pt.1) - YouTube</a></p>
<h4><a href="#america-in-decay-the-sources-of-political-disfunction" aria-hidden="true" class="anchor" id="america-in-decay-the-sources-of-political-disfunction"></a>America in Decay: The Sources of Political Disfunction</h4>
<blockquote>
<p>What was arguably one of the most important changes in American public policy came about not because Congress as representative of the American people voted for it but because private individuals litigated through the court system to change the rules.
[…]
There is virtually no other liberal democracy that proceeds in this fashion.</p>
</blockquote>
<p>I'm not a giant Fukuyama fan, but his depiction of &quot;adversarial legalism&quot; is interesting.</p>
<p><a href="https://www.gwern.net/docs/history/2014-fukuyama.pdf"><em>America in Decay: The Sources of Political Disfunction</em></a>, Francis Fukuyama, 2014</p>
<h4><a href="#the-recursive-universe" aria-hidden="true" class="anchor" id="the-recursive-universe"></a>The Recursive Universe</h4>
<blockquote>
<p>Since its inception in 1970, Conway’s Game of Life has developed a cult following of researchers, engineers, and hobbyists, pushing each other to construct increasingly elaborate “machines” from pixels on a screen. These investigations have resulted in a lengthy taxonomy of motifs, reactions, and mechanisms, as well as engineering principals and design abstractions. These days you can spend a long time on YouTube exploring the seemingly impossible things people are designing in the “simple” Life universe.</p>
</blockquote>
<p>I've been in love with this simple puzzle toy ever since learning about it… it seems every five years when I check back in on it there are new crazy nano machines being built in it.</p>
<p><a href="http://blog.amandaghassaei.com/2020/05/01/the-recursive-universe/">The Recursive Universe</a></p>
<h4><a href="#this-isnt-a-spaceship-its-a-lego-brain-teaser--the-brothers-brick--the-brothers-brick" aria-hidden="true" class="anchor" id="this-isnt-a-spaceship-its-a-lego-brain-teaser--the-brothers-brick--the-brothers-brick"></a>This isn't a spaceship, it's a LEGO brain-teaser | The Brothers Brick | The Brothers Brick</h4>
<p>This is an amazing behind the scenes look at a master builder… my brain is still boggled at how complicated that wing is.</p>
<blockquote>
<p>Nick builds his creations as an iterative process–he’ll work on the same design for months, going through multiple versions and refining the design until everything fits just the way he wants. Usually, he’ll do this without regard for color, and only once he has the design down pat does he rebuild it in the final colors. Nick has published a few images of this ship giving us a look under the hood. First up, let’s look at the wing without the final colors applied, which makes it easier to distinguish the individual elements. One of the key elements you can spot here is that strange slope with 5 studs from the 90s (all those yellow parts in the image below). Incorporating its unique geometry makes for a fantastic starting point if you’re looking to give your LEGO brain a workout.</p>
</blockquote>
<p>As my friend Andy B. put it best: &quot;this is the greatest example of the idea that constraints breed creativity i've seen in a LONG time.&quot;</p>
<p>How does this...
<img src="https://live.staticflickr.com/65535/50501686802_2d90b0bb52_h.jpg" alt="how does this..." /></p>
<p>become this? 🤯
<img src="https://live.staticflickr.com/65535/50512986576_3f692c30f5_h.jpg" alt="become this?" /></p>
<p><a href="https://www.brothers-brick.com/2020/10/23/this-isnt-a-spaceship-its-a-lego-brain-teaser/">This isn't a spaceship, it's a LEGO brain-teaser | The Brothers Brick | The Brothers Brick</a></p>
<h4><a href="#right-now----a-giant-ant-short---youtube" aria-hidden="true" class="anchor" id="right-now----a-giant-ant-short---youtube"></a>Right Now -- A Giant Ant Short. - YouTube</h4>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/rCD1KOOHwwE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>I've thought about this <em>video</em> a lot. The central question keeps bouncing around my head.</p>
<p><a href="https://www.youtube.com/watch?v=rCD1KOOHwwE&amp;t">Right Now -- A Giant Ant Short. - YouTube</a></p>
<h3><a href="#productivity" aria-hidden="true" class="anchor" id="productivity"></a>Productivity</h3>
<h4><a href="#weekly-planning" aria-hidden="true" class="anchor" id="weekly-planning"></a>Weekly Planning</h4>
<p>Shoutout to <a href="https://twitter.com/megalithic">Seth</a> for pointing me at this awesome blog. I'm a fan.</p>
<blockquote>
<p>Regardless of how this manifests in your system, it's vital to document and review your thoughts, ideas, and notes. Don't disregard them to gather dust in the corner of the closet (of your mind?).</p>
</blockquote>
<p><em>Great</em> write up of a mature planning process.</p>
<p><a href="https://drewbarontini.com/blog/weekly-planning/">Weekly Planning</a></p>
<h4><a href="#ankit-pansari-on-twitter" aria-hidden="true" class="anchor" id="ankit-pansari-on-twitter"></a>Ankit Pansari on Twitter:</h4>
<blockquote>
<p>One of my favorite browsers hack is to use the .new domain in the address bar to jump straight into the action. <a href="https://t.co/N5LpCIF7VX">https://t.co/N5LpCIF7VX</a> -&gt; creates a new Google Calendar Event No need to visit the app, find the right menu, and then start an activity. More on this👇 <a href="https://t.co/aIEoYEMGql">https://t.co/aIEoYEMGql</a>&quot; / Twitter</p>
</blockquote>
<p>This thread was worth it <em>just</em> for &quot;meet.new.&quot; 🙌</p>
<p><a href="https://twitter.com/ankitpansari_/status/1322171784263655427">Ankit Pansari on Twitter</a></p>
<h3><a href="#code" aria-hidden="true" class="anchor" id="code"></a>Code</h3>
<h4><a href="#this-page-is-a-truly-naked-brutalist-html-quine" aria-hidden="true" class="anchor" id="this-page-is-a-truly-naked-brutalist-html-quine"></a>This page is a truly naked, brutalist html quine.</h4>
<p>👏👏👏</p>
<p>I have loved quines since school, this is a pretty cool example of one.</p>
<p><a href="https://secretgeek.github.io/html_wysiwyg/html.html">This page is a truly naked, brutalist html quine.</a></p>
<h4><a href="#focus-management-and-inert--css-tricks" aria-hidden="true" class="anchor" id="focus-management-and-inert--css-tricks"></a>Focus management and inert | CSS-Tricks</h4>
<blockquote>
<p>Focus management is the practice of coordinating what can and cannot receive focus events. It is one of the trickier things to do in front-end development, but it is important for making websites and web apps accessible.</p>
</blockquote>
<p><a href="https://css-tricks.com/focus-management-and-inert/">Focus management and inert | CSS-Tricks</a></p>
<h4><a href="#functional-programming-for-the-rest-of-us" aria-hidden="true" class="anchor" id="functional-programming-for-the-rest-of-us"></a>Functional Programming For The Rest of Us</h4>
<blockquote>
<p>It's true that FP articles and papers are hard to understand, but they don't have to be. The reasons for the knowledge gap are purely historical. There is nothing inherently hard about FP concepts. Consider this article &quot;an accessible guide to FP&quot;, a bridge from our imperative minds into the world of FP. Grab a coffee and keep on reading. With any luck your coworkers will start making fun of you for your FP comments in no time.</p>
</blockquote>
<p>I know this has been floating around for a while, but I'm re-reading it and enjoying it.</p>
<p><a href="https://www.defmacro.org/2006/06/19/fp.html">Functional Programming For The Rest of Us</a></p>
<h4><a href="#coding-with-voice-dictation-using-talon-voice--josh-w-comeau" aria-hidden="true" class="anchor" id="coding-with-voice-dictation-using-talon-voice--josh-w-comeau"></a>Coding with voice dictation using Talon Voice · Josh W Comeau</h4>
<blockquote>
<p>Earlier this year, I developed Cubital Tunnel Syndrome, a repetitive-strain injury, in both of my elbows. As a result, I pretty much can't use a mouse or keyboard; after a few minutes, I get a burning pain shooting down my arms. Even if I try to limit my computer usage to 60-second bursts, I wind up inadvertently making the situation worse.</p>
<p>As you might imagine, this was a pretty big deal; as a software developer, my entire career is based on being able to use a keyboard!</p>
<p>After many failed attempts at solving the problem with physiotherapy, ergonomics, and prescription medications, I've found a solution that allows me to be productive without risking further nerve damage. I now work almost exclusively using a microphone and an eye-tracker.</p>
</blockquote>
<p><a href="https://joshwcomeau.com/accessibility/hands-free-coding/">Coding with voice dictation using Talon Voice · Josh W Comeau</a></p>
<h4><a href="#the-state-of-css-survey" aria-hidden="true" class="anchor" id="the-state-of-css-survey"></a>The State of CSS Survey</h4>
<blockquote>
<p>Flexbox, Grid, Multi-Column… To say nothing of whole new paradigms like CSS-in-JS.</p>
<p>So after the success of our annual State Of JavaScript survey, we’ve decided to take on the world of styles and selectors to help identify the latests trends… and try to bridge the ever-growing “great front-end divide”!</p>
</blockquote>
<p>I <em>loved</em> that at the end of this survey it gave me a list of things I marked that I didn't know with a link to learn more… that's awesome.</p>
<p><a href="https://stateofcss.com/">The State of CSS Survey</a></p>
<h4><a href="#the-erlangelist---to-spawn-or-not-to-spawn" aria-hidden="true" class="anchor" id="the-erlangelist---to-spawn-or-not-to-spawn"></a>The Erlangelist - To spawn, or not to spawn?</h4>
<blockquote>
<p>But before starting, since this is going to be a long article, I want to immediately share my main points:</p>
<p>Use functions and modules to separate thought concerns.
Use processes to separate runtime concerns.
Do not use processes (not even agents) to separate thought concerns.</p>
</blockquote>
<p>Using a blackjack game, the author explains an interesting idea that feels more like pure mathematics than anything else. I think this will unblock me in Advent of Code!</p>
<p><a href="https://www.theerlangelist.com/article/spawn_or_not">The Erlangelist - To spawn, or not to spawn?</a></p> ]]></description>
    </item>
    <item>
       <title>New book, same story.</title>
       <link>http://evantravers.com/articles/2020/10/30/new-book-same-story/</link>
       <pubDate>Fri, 30 Oct 2020 09:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/10/30/new-book-same-story/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/10/journal.jpg"></p><p>On the left is a journal I started the day before I asked my future father-in-law for his blessing to marry Sarah. It's been with me <em>every</em> night I was single, two trips to Europe, cross-country flights, camping trips… it's chock full of pictures, love notes, the frustrated scrawl of dark nights of the soul and delighted depictions of sunrises. In it I planned our wedding, prayed for my future children, celebrated every anniversary and birthday. It's scarred, tear-stained, rained on, prayed over, scratched out…</p>
<p>It's probably the most precious physical object I own… and it's <em>full</em>. It is time to pass the baton to the next journal.</p>
<p>The timing could not be better.</p>
<p>Each time I finish a journal I leave the last few pages blank. I then read through the whole thing noting down blessings and important moments in those spare pages. I revisit old prayer requests that have been answered, dreams that were realized, goals met. I will sing of God's goodness in marriage. I will rejoice again at the birth of my children. I will again weep over old sins and conflicts. I will see God's sovereign hand over the past five years compressed into a few pages of my handwritten thoughts.</p>
<p>Journaling isn't just therapeutic. <strong>It's an opportunity to glance behind the tapestry of history to see what God has been weaving.</strong></p>
<p>When I started the journal, I stood at a precipice: all I hoped for and held dear was in the hands of a loving and almighty God. In the years since, I have found him to be faithful. And I wrote it down.</p>
<p>I'm starting this new journal tomorrow close to <em>another</em> precipice of history: much that I hope for and hold dear in the balance. I'm grateful that God has ordained <em>this</em> moment to remind me to look back on my little leather ebenezer… to remind me that <strong>He has not changed</strong>.</p>
<p>New page. Same King. 🙏</p> ]]></description>
    </item>
    <item>
       <title>Emotional Budgeting</title>
       <link>http://evantravers.com/articles/2020/10/26/emotional-budgeting/</link>
       <pubDate>Mon, 26 Oct 2020 21:28:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/10/26/emotional-budgeting/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/10/budget.png"></p><p>A wise steward budgets resources with limited quantities because humans tend to spend <strong>all</strong> their resources on the immediate problem.</p>
<p>Budgeting is twofold: an acknowledgement that a resource is finite and a plan predetermining priorities. When a decision arrives we can say yes to the best and no to what is lesser.</p>
<p>I have been budgeting my money for about five years now. I've budgeted my time for three. Deep Work taught me that willpower or focus is a similarly limited resource<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>.</p>
<p>I have come to realize that <em>emotional strength</em> is a limited quantity as well. A long day of stressful interactions and decisions reduces my ability to delight in and engage with my family at the end of the day. In quarantimes, when I am working from home and living at work, the symptoms of emotional drain have been greater. Without the natural rhythms of hallway banter my experience with work can become a constant eight hour stream of possibly stressful interactions. Even on a <em>great</em> day, the weight of potential problems can be enough to deplete my emotional energy. I leave my home office exhausted more often than I'd like to admit.</p>
<p>I should take a moment to say: &quot;emotional budgeting&quot; is a phrase that I've been using in my head. There may be existing books and articles using a different name, or someone using this name for a differenct concept. I like the phrase because I believe in a stewardship model of resource management, and while I applaud aspects of the &quot;self-care&quot; movement, I find the phrasing and movement to be too self-focused for my faith.</p>
<p>What I refer to as my &quot;emotional energy&quot; may be simply &quot;empathy.&quot; It is the limited resource that allows us to listen intently to others, to concern ourselves with how others think, and give us the power to place ourselves in their shoes. When you have a difficult conversation with someone about a point of conflict and you end up drained, lethargic… unwilling even to commit to light-weight, pleasant conversation… that's what I define as &quot;low emotional energy.&quot;</p>
<p>To fight this drain I took the same approach as with any budgeting problem: I started by tracking my &quot;expenses&quot; and &quot;income,&quot; I predetermined my priorities, and I continue to adjust and learn.</p>
<h2><a href="#tracking" aria-hidden="true" class="anchor" id="tracking"></a>Tracking</h2>
<h3><a href="#journaling" aria-hidden="true" class="anchor" id="journaling"></a>Journaling</h3>
<p>To track emotional energy I employed a <em>simple</em> journaling and review practice. Just noting in a journal or text-file that &quot;difficult conversation about Project Y, feeling tired&quot; is sufficient to teach us what topics drain us.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>2</a></sup></p>
<p>I still practice bullet journaling. As I go through the day I list out meetings, projects, and events. At the end of the day… I'll typically prepend a smiley based on how different notes made me feel.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>3</a></sup> One trend I've noticed is that whatever mood I start the day in is typically the mood that will define <strong>the entire day</strong>. This is a <em>powerful</em> insight… and really speaks to the importance of starting my day in scripture and prayer <em>before</em> I grab my phone. If you start tracking your mood with an open mind you may discover similar patterns. There are many similar tools, and many wiser folks with counsel on this.</p>
<h3><a href="#budget-busters" aria-hidden="true" class="anchor" id="budget-busters"></a>Budget Busters</h3>
<p>Returning to the metaphor of financial budgeting: When my wife and I started budgeting, we programmed into our budget all the categories and recurring transactions we could think of. We were surprised by <em>all the things we forgot to consider</em>… tires wear out, registering our cars, that wedding gift, etc. Over time, we learned to count on all the &quot;budget busters&quot; and make allowances.</p>
<p>Two of my emotional &quot;budget busters&quot;:</p>
<ol>
<li><em>Career Review season</em>. Whether the reviews are trending good or bad &quot;review season&quot; still is a vulnerable time with the potential for stressful conversations. So I've learned to build into my schedule more &quot;supply&quot; of emotional energy when review season comes around, and to forgive myself for being a little drained.</li>
<li><em>Social Media &quot;doom-scrolling.&quot;</em> It doesn't matter how good the day is, if I drift into the infinity pool of sadness that is social media around election season… I'll lose a lot of energy. I'm sure I'm not the only one.</li>
</ol>
<h2><a href="#predetermine-your-priorities" aria-hidden="true" class="anchor" id="predetermine-your-priorities"></a>Predetermine Your Priorities</h2>
<p>Once I was tracking my energy I realized I was losing more energy in my workday than I thought. <strong>I'm going to assume that most people expend the most emotional energy into what is immediately in front of them… which is work</strong>. I therefore assume most folks would need to re-prioritize towards their health, friends, and family.</p>
<p>You may need to take some time with your tracking information and determine what area of your life is lacking the emotional attention that it deserves. If you have a trusted friend or family member they can help you determine which relationships or aspects of your life need more attention.</p>
<p>There are different ways to represent this new priority, but simply knowing it is sufficient as we move into the next phase of adjusting and learning.</p>
<h2><a href="#adjusting-and-learning" aria-hidden="true" class="anchor" id="adjusting-and-learning"></a>Adjusting and Learning</h2>
<p>Having learned a little bit about myself through tracking my emotional energy and how it's affected by &quot;budget busters,&quot; and having rekindled desire to give my little family the best of my emotional energy<sup class="footnote-ref"><a href="#fn-5" id="fnref-5" data-footnote-ref>4</a></sup>, I started devising strategies.</p>
<p>The strategies that have helped me can be largely grouped into two categories: &quot;refilling the tank&quot; to give me more energy, and &quot;limiting the leaks&quot; to help me maintain energy.<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>5</a></sup></p>
<h3><a href="#refilling-the-tank" aria-hidden="true" class="anchor" id="refilling-the-tank"></a>Refilling the Tank</h3>
<p>Through my journaling, I've learned that if I have certain meetings back to back (especially in the morning!), I'll be pretty drained by lunch and have very little energy going into the evening. I'm still able to work… I just have less &quot;words&quot; to share with my family. 😓 Therefore I've started intentionally planning to refill the tank.</p>
<p>Here are some examples:</p>
<h4><a href="#gratitude" aria-hidden="true" class="anchor" id="gratitude"></a>Gratitude</h4>
<p>A very important strategy for staying positive throughout the day is logging any and all positive interactions for which I am grateful:</p>
<ul>
<li>a colleague shares some encouraging words.</li>
<li>my daughter brings me a crayon-scrawled gift.</li>
<li>quiet time is particularly fruitful.</li>
<li>lunch is delicious.</li>
</ul>
<p>All of these are <em>great</em> things to remember! At the end of the day, I'm looking into the next day with more positivity if the log of the previous day is filled with blessings… otherwise I tend to remember only the bad. This is a high-value activity that <em>also</em> lines up with the need to track your emotional state, so definitely try this.</p>
<h4><a href="#rest-and-play" aria-hidden="true" class="anchor" id="rest-and-play"></a>Rest and Play</h4>
<p>At the office I'd automatically refill the tank by visiting with colleagues, playing ping pong, taking walks. Perversely, while working at home I feel guilty enjoying the <em>same</em> activities! Intentionally giving myself permission to leave my desk for a restful activity has been critical to having a balanced day with emotional energy left at the end.</p>
<p>Being on &quot;work premises&quot; allowed me to embrace restful pauses in the workday while not feeling like I was &quot;abandoning my post.&quot; Leaving my desk at home feels like treachery? I don't think this thought pattern is healthy, and I'm trying to fight it. Worse still it affects the way I treat my &quot;coworkers&quot; at home. At the office I happily invest in relationships because I am &quot;at work.&quot; If a colleague needs me to help them move a desk I happily drop what I'm doing… however at home I feel guilty for leaving my keyboard to help my wife move a dresser! It's irrational.</p>
<p>My ultimate contribution to work is focused effort resulting in positive progress… not keeping my butt in seat for the whole day. If I allow myself to spend time on the most important people in my life, (i.e. step away to have a dance-party with my daughter for fifteen minutes) I'll wind up with more energy to expend on work <em>and</em> family.</p>
<h4><a href="#intentional-conversation" aria-hidden="true" class="anchor" id="intentional-conversation"></a>Intentional Conversation</h4>
<p>In a remote work situation there is a lot of <em>responding</em> to task-based communication: meetings, email, chat … but not much opportunity for informal visiting. Without the intermittent chit-chat colleague relationships can warp into viewing people as a list of their demands. We forget to check on other people instead of the projects they owe us.</p>
<p>I've found intentionally engaging in &quot;just visit&quot; time to be a great reminder of why I like working with such nice and interesting folks. It relieves some of the emotional drain by rekindling friendships. I no longer just dread your list of demands… I want to continue our conversations and see how you are doing.</p>
<h3><a href="#limit-the-draining-interactions" aria-hidden="true" class="anchor" id="limit-the-draining-interactions"></a>Limit the Draining Interactions</h3>
<p>This strategy is a <em>little</em> harder. Depending on your role at work you may not have much control over your schedule.</p>
<p>Thanks to journaling I have learned to predict if a day could be an emotional &quot;budget buster.&quot; If I have any control of my schedule, I'll try to insert some rest time or use one of the other techniques above to recover.</p>
<p>A simple tactic: I try schedule date night on a <em>different</em> day than the &quot;heavy&quot; day. It's just wise: if I'm going to prioritize listening and loving on my wife I should choose to select an evening where I'll have as much as possible to give.</p>
<h3><a href="#intentional-practice" aria-hidden="true" class="anchor" id="intentional-practice"></a>Intentional Practice</h3>
<p>While I'm honestly not sure how to do this perfectly… I have been attempting to deliberately practice this skill and get better at it.</p>
<p>When I realize that I've had a &quot;draining&quot; day, this is a great opportunity to practice my listening and not default to my selfish relaxation habits. As a christian, the command to love on my wife is not relaxed simply because I had a difficult day at work. 😝 One mini-habit that has helped me is to quickly and quietly set an intention for the next interaction or meeting: how do I want the next person to perceive me? I choose my demeanor and consider how I can serve that person. It's been helpful to me and rescued me from defaulting to whatever my tired face depicts.</p>
<hr />
<p>This is all something I'm still thinking about and working on… so I'd appreciate any thoughts you have about it. I highly doubt that this is a new idea… there are probably whole books and genres dedicated to this.</p>
<p>If you have any thoughts or research, <a href="/contact">I'd love to hear about it</a>.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Cal Newport. <em>Deep Work</em>. Grand Central Publishing, 2016. A large part of being an effective worker is limiting the distracting environmental leaks that reduce my daily supply of willpower, and spending it first on the work that most deserves my best focus. Over the past year I've sought to increase my supply of focus by deliberate practice and decrease the amount of distraction. <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">My full review from 2019</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-4">
<p>To identify distractions from focus, Cal Newport recommended simply noting the sources of distraction on a sticky note, forgiving ourselves, and trying again. Very similar thing. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-2">
<p>I actually have several systems for tracking my emotional energy both on a daily, weekly, and monthly level… but start <em>small</em> and learn from yourself. Everyone is different. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-5">
<p>I'm going to focus on my particular journey of trying to refocus on my family in a stressful work season, but pretty much any self-care advice could apply here as long as it aligns with your priorities. <a href="#fnref-5" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-3">
<p>You could basically use the same categories that Shawn Blanc uses for margin: increasing ability and decreasing commitment. It's same thing. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Obsession Log: Tactile Switches</title>
       <link>http://evantravers.com/articles/2020/10/10/obsession-log-tactile-switches/</link>
       <pubDate>Sat, 10 Oct 2020 21:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/10/10/obsession-log-tactile-switches/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/10/atreus.png"></p><div class="admonition tldr">
<p>I currently type on MX Kailh Speed Copper and Gchocs from Gheavy Industries.</p>
</div>
<p>The feeling of mechanical switches is a deeply personal, subjective choice. For many, it's a fun hobby pursuit of some kind of typing experience, whether that's a sound, a tactile feel when the key hits… but if you are unwilling to spend lots of money outfitting boards<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup> it can be a bewildering and frustrating endeavor.</p>
<p>Because everyone assumes everyone wants the same thing, they forget to disclose what qualities they are looking for.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>2</a></sup> I make my switch decisions on a couple, unscientific assumptions:</p>
<ul>
<li>I am optimizing for speed and reducing RSI.</li>
<li>I believe that the minimum amount of finger travel means optimum speed and minimizes impact.</li>
<li>Having some kind of &quot;signal&quot; at the switch actuation point helps me minimize finger travel.</li>
</ul>
<p>I originally tried to avoid &quot;bottoming out&quot;<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup> because Tom told me to. Later, I was trying to type more quietly on my already <a href="/articles/2019/11/08/obsession-log-keyboards/#kbc-poker-ii-with-cherry-blues-2011">loud MX Blue 60% board</a>. I discovered that if I could avoid bottoming out, 70% of the noise was diminished! By the time I had taught myself to type this way, some people couldn't believe I was typing on a &quot;noisy&quot; mechanical keyboard. I also noticed that my typing had become faster… although this could have been the result of deliberate practice.</p>
<p>When I first became interested in mechanical keyboards, it was pretty easy to find people who were interested in the same things: it was simply people who bought tactile switches. This has shifted in the last few years. Many of the popular tactile switches out there at the moment have a much stronger tactile moment than the venerable MX Brown and MX Clear. This stronger tactile moment is mostly for &quot;feel,&quot; rather than providing a signal to &quot;stop pressing&quot; to the typist. This strong tactile moment requires a <strong>lot</strong> of force to overcome… therefore the finger is almost certainly going to travel the full length of the switch travel and &quot;bottom out,&quot; producing a sound that others don't like. It is getting hard to find a switch that doesn't prioritize this ridiculously strong tactile moment.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>4</a></sup></p>
<p>I know that there are non-MX switches that seem to appeal to people with the same sort of typing goals... there are Matias, ALPS, and Topre switches come to mind. I never wound up venturing down that path, so I can't speak to those. I have typed on a Topre board before, and I did like it, although at the time I didn't like it as much as the MX Clears that I had.</p>
<h2><a href="#switches" aria-hidden="true" class="anchor" id="switches"></a>Switches</h2>
<h3><a href="#owned-and-liked" aria-hidden="true" class="anchor" id="owned-and-liked"></a>Owned and Liked:</h3>
<h4><a href="#mx-blue" aria-hidden="true" class="anchor" id="mx-blue"></a>MX Blue</h4>
<p>The classic. I really should order some more to occasionally throw on a hotswap board. The audible sound is lovely (and <em>only</em> happens on the travel down, unlike the clickbar options out there!) and provides a tactile moment that is sufficient to teach your brain to move to the next switch.</p>
<p>If you don't have a good typing style and a loud case, it can get your neighbors upset at you though.</p>
<h4><a href="#mx-clear" aria-hidden="true" class="anchor" id="mx-clear"></a>MX Clear</h4>
<p>The best non-blue option of the Cherry switches, IMHO. Heavier, but with a decided tactile moment that is strong enough to teach your fingers, but not too strong so that you burst through it and fall all the way to the bottom.</p>
<h4><a href="#zealio-67g-v1" aria-hidden="true" class="anchor" id="zealio-67g-v1"></a>Zealio 67g v1</h4>
<p>When I built <a href="/articles/2018/09/12/i-built-a-keyboard/">my first custom</a>, I was just going to put MX Clears on it, but I decided to try the fancy switches Reddit raved over.</p>
<p>Oh man.</p>
<p>These are still <em>really</em> nice switches. They are essentially MX Clear with a lighter spring and a cleaned up stem, apparently a mass-produced version of a frankenspring known as the &quot;ergo clear.&quot;</p>
<p>Sadly, they don't make these anymore. The current version of Zealios don't have the same feeling.</p>
<h4><a href="#originative-mod-m-tactile" aria-hidden="true" class="anchor" id="originative-mod-m-tactile"></a>Originative MOD-M Tactile</h4>
<p>The original version of this article detailed me buying around 200 switches of different varieties in order to try and find a worthy heir to my beloved Zealios V1. (Some of the losers in that race are below...)</p>
<p>The Originative MOD-M tactile is a pretty close substitute to the Zealios V1... and comes with a similar expensive price tag. They are both designed to be luxury &quot;ergo clear&quot; style switches. If you really want to try Zealios V1, this is the closest that I've been able to find on the market at the moment, although the &quot;feel&quot; of the switch is rougher.</p>
<p>Given that they are so expensive, I can't say that I recommend them at the moment.</p>
<h4><a href="#20g-gchocs-from-gheavy-industries" aria-hidden="true" class="anchor" id="20g-gchocs-from-gheavy-industries"></a>20g Gchocs from Gheavy Industries</h4>
<p>My current favorite choc switch is linear. With a crazy low spring weight, you can't even really rest your hands on the keys for fear of typing. That being said, it's a very unique typing experience, and feels very fast and very easy. Being as the choc travel distance is so low, I tend to treat the light slap of the key at the bottom as the actuation point, and it feels relatively similar to a good MX tactile. It's weird, but it's good.</p>
<h4><a href="#kailh-speed-copper" aria-hidden="true" class="anchor" id="kailh-speed-copper"></a>Kailh Speed Copper</h4>
<p>My current favorite MX Switch. <strong>Very</strong> high actuation point. Not terribly expensive. I owe this one to <a href="http://arleym.com/">Arley McBain</a>, he was right.</p>
<p>The Speed Copper has an <em>extremely</em> high actuation point, very early in travel. The spring experience is relatively light up until a definite tactile moment, then it gets quite heavy afterwards. This &quot;cushion&quot; <em>really</em> helps with not bottoming out, and doesn't feel bad at all.</p>
<p>I've been typing on them 100% for the two weeks since I got them, comparing them back and forth with the Zealio V1 I have left and the Originative MOD-Ms I had saved to put on the Atreus. The MOD-Ms are going back in the bag to be sold. 🤷‍♂️</p>
<h3><a href="#owned-and-abandoned" aria-hidden="true" class="anchor" id="owned-and-abandoned"></a>Owned and Abandoned:</h3>
<h4><a href="#mx-brown" aria-hidden="true" class="anchor" id="mx-brown"></a>MX Brown</h4>
<p>The tactile moment is just not pronounced enough for me to really tell that it's there.</p>
<h4><a href="#zilent-67g-v2" aria-hidden="true" class="anchor" id="zilent-67g-v2"></a>Zilent 67g v2</h4>
<p>Zeal knows how to make pleasant switches. They are freaky silent, <em>smooth</em> and nice... I just don't like the spring/tactile experience. It starts out heavy, hits the tactile moment, then gets too light so that you crash right through to the bottom. In addition, the bump is <em>very</em> sharp feeling. I liked the &quot;roundness&quot; of the MX Clear bump, it taught your finger that it was approaching actuation, not slapped it as you went past.</p>
<h4><a href="#novelkeys-kailh-burnt-orange-chocs" aria-hidden="true" class="anchor" id="novelkeys-kailh-burnt-orange-chocs"></a>NovelKeys Kailh Burnt Orange Chocs</h4>
<p>These switches are technically tactile, but honestly the total switch travel of the kailh low-profile &quot;choc&quot; switch is <em>so</em> short that you can't feel it unless you are trying <em>really</em> hard.</p>
<p>The switch's spring is strong enough for my fingers to learn how to type on it without bottoming out, but honestly it's a bit strong for the tiny keyboards on which I tend to put chocs.</p>
<h4><a href="#aliaz" aria-hidden="true" class="anchor" id="aliaz"></a>Aliaz</h4>
<p>These feel <em>just</em> like silenced lubed MX Browns, which is basically what they are. I couldn't feel the tactile moment.</p>
<h4><a href="#hako-clear" aria-hidden="true" class="anchor" id="hako-clear"></a>Hako Clear</h4>
<p>The bump is basically at the top, and is more of a resistance than an actual bump at the actuation point. I did't like these at all. They are heavy, stiff, and don't really emulate clears or zeals. They almost feel like really really heavy linears. I will say that the force curve does seem to lean towards keeping a person from bottoming out, and I think that with some practice I could keep from bottoming out entirely.</p>
<h2><a href="#results" aria-hidden="true" class="anchor" id="results"></a>Results</h2>
<p>I'm pretty happy with the combination of switches that I have at the moment. I am floating somewhere between 105-115 wpm on quotes on monkey-type.com at the moment.</p>
<p><img src="https://images.evantravers.com/articles/2020/10/wpm.png" alt="typing speed: 115wpm" /></p>
<p>As with all endeavors... buying things won't make you faster or better, you can achieve much higher speeds than that with an old dell membrane keyboard. Deliberate practice &gt; buying tools... but if you have to buy tools, I'll try to help. :)</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>Especially before the rise of readily available hot swap PCBs! <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-4">
<p>I personally <em>don't</em> care so much about spring noise or stem feel… I care about how accurately and easily I can type. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>bottoming out is the finger pressing to the bottom of the switch travel. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-1">
<p>If you like this feel… more power to you. It's deeply personal, and you live in a golden age of meme switches. I just am looking for something different. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Focus Budget: Updated Implementation</title>
       <link>http://evantravers.com/articles/2020/10/09/focus-budget-updated-implementation/</link>
       <pubDate>Fri, 09 Oct 2020 21:54:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/10/09/focus-budget-updated-implementation/</guid>
       <description><![CDATA[ <p>Some time ago I wrote a blog post about the rough pattern of my weekly planning of a &quot;focus budget.&quot; The objective is to estimate the time I have available for important tasks.</p>
<p>Thanks to a <a href="https://twitter.com/evantravers/status/1287768685227147264">Jacob Collins pointing out a cool feature on Things</a> I've started using a new trick and written a new <a href="/articles/series/hammerspoon-headspace/">headspace</a> that has dramatically sped up my weekly planning and daily scheduling.</p>
<p>Understanding this new system requires you to know three facts:</p>
<ol>
<li>If you copy or drag a to-do in Things you can get the plaintext version of that to-do or project.</li>
<li>If you drag any body of text into Fantastical, it creates an event using the current default calendar.</li>
<li>You can set the default calendar for new events in each Calendar Set in Fantastical.</li>
</ol>
<p>So… armed with these facts, I've written a simple layout &quot;space&quot; using my <a href="http://evantravers.com/articles/series/hammerspoon-headspace">Headspace</a> module.</p>
<p>You can read the whole thing <a href="https://github.com/evantravers/hammerspoon-config/blob/938a4e466494b46a053b205986d9fa085b84c857/spaces/schedule.lua">here</a>, but here's the gist of it.</p>
<ol>
<li>Open Fantastical and Things, and position them so that I can see the whole week in Fantastical and a list in Things. If it's Sunday, I'm doing my weekly planning, so I show the Upcoming list. Otherwise, I show Today. Both are filtered to my work to-dos.</li>
<li>Switch the Fantastical calendar set to &quot;Focus Planning,&quot; a calendar set where the default calendar is a private calendar I use to plan my week.</li>
<li>Once all is in place, I drag todos from my Upcoming view in Things onto my calendar, creating little time blocks! I adjust their length based on how much time I've estimated… and this is a <em>really</em> good way to see if I've even got enough time to do all that I've planned.</li>
<li>When I move away from the space, the tear down function will put Fantastical and Things back to their normal states. It's great!</li>
</ol>
<p>I really love this pattern. Thanks to the tags on my to-dos, I can see if I have enough time to execute on my daily plan.I have to admit that the little bit o' automation that chooses the right Things list based on the time makes me <em>really</em> happy.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- setup the space for Headspace</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- […]</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focus_budget</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Sun&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">os</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%a&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Sat&quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=upcoming&amp;filter=%40Proctoru%2CEstimates&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=today&amp;filter=%40Proctoru%2CEstimates&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launchOrFocusByBundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launchOrFocusByBundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.flexibits.fantastical2.mac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">
</div><div class="line" data-line="18">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.flexibits.fantastical2.mac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">upcoming</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">upcoming</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Hide Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">
</div><div class="line" data-line="24">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Hide Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Focus Budget&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;By Week&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">
</div><div class="line" data-line="29">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="30">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="31">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Fantastical&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">primaryScreen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left70</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="32">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">primaryScreen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right30</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="33">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="34">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="36">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">teardown</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="37">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.flexibits.fantastical2.mac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="38">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Show Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="39">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fantastical</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Daily Focus&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="40">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="41"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre> ]]></description>
    </item>
    <item>
       <title>Quick Tip: Don&#39;t Sweat the Duplicates</title>
       <link>http://evantravers.com/articles/2020/10/08/quick-tip-dont-sweat-the-duplicates/</link>
       <pubDate>Thu, 08 Oct 2020 09:09:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/10/08/quick-tip-dont-sweat-the-duplicates/</guid>
       <description><![CDATA[ <p>Quick tip prompted by <a href="https://twitter.com/rosemaryorchard">Rosemary Orchard</a> in this week's episode of <a href="https://overcast.fm/+S-x1xErk0">Nested Folders Podcast</a>:</p>
<blockquote>
<p>It's ok to capture something more than once.</p>
</blockquote>
<p>When I first started using a to-do list I had a bad habit: at the moment of capturing a to-do I wasted time trying to remember whether I had already recorded, usually ending up wandering endlessly through my database to make sure I haven't entered this before.</p>
<p>This friction kept me from focus and from capturing to-dos. I was afraid of &quot;cluttering my system&quot; or reducing the purity of my system. (I'm a data nerd, ok? Consistency is important!)</p>
<p>Now, I capture everything I might want to do, without worrying whether it exists yet. I trust my daily review to place the to-do in the right location, and I trust my weekly review to delete duplicates.</p>
<p>This simple mental shift allows me to capture quickly and effortlessly, returning my precious attention to the task at hand.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: September</title>
       <link>http://evantravers.com/articles/2020/09/30/books-and-links-september/</link>
       <pubDate>Wed, 30 Sep 2020 16:48:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/09/30/books-and-links-september/</guid>
       <description><![CDATA[ <p>Around here autumn is lurking... the rising wind has the dry rustle of turning leaves, the air just feels <em>crisper</em>, and I'm craving baked goods and campfire smoke.</p>
<p>I am still in limbo with some of my zettelkasten/note-taking work... I'm just going to have to do a post about where I am at the moment and hope that others can build on it. Suffice to say, <a href="https://obsidian.md">obsidian</a> is super awesome and influencing a lot of my decisions on that front at the moment.</p>
<p>We are still safe and happy in our little home... learning to find a new steady-state with our increased population count. I've been spending time messing around with iOS14 automations and keyboard stuff... I'll write about it soon.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>This month was pretty good for book-reading. I think I read... four books, not including comics (every month I look forward to my new allotment of Hoopla borrows!)</p>
<p>On deck: Knowing God by JI Packer, A Programmer's Introduction to Mathematics by Jeremy Kun, Whiskey Tango Foxtrot by Lynne Black Jr.</p>
<h3><a href="#talking-to-strangers-by-malcolm-gladwell" aria-hidden="true" class="anchor" id="talking-to-strangers-by-malcolm-gladwell"></a>Talking to Strangers by Malcolm Gladwell</h3>
<p>This is a <em>dark</em> book. In telling the story of a single traffic stop gone wrong, Gladwell meanders through the history of communication, deception, and the incentives of trust and suspicion. I found the discussions of different conversational fallacies interesting as to how they aligned with the <a href="https://en.wikipedia.org/wiki/Gricean_maxims">Gricean Maxims</a>, but I am conflicted because I felt there was a definite bias to how some of the social science was handled and statistics interpreted. Content warning: Language, graphic depictions of violence and sexual violence.</p>
<h3><a href="#redshirts-by-john-scalzi" aria-hidden="true" class="anchor" id="redshirts-by-john-scalzi"></a>Redshirts by John Scalzi</h3>
<p>I knew going in that I was going to enjoy this one given the premise, but I surprised at how moving and thoughtful it was. It definitely transcends its initial setup to ask some hard questions about life and meaning. I know that's vague, but to say more would be a spoiler. Content warning: Foul language and coarse joking.</p>
<h3><a href="#the-passage-by-justin-cronin" aria-hidden="true" class="anchor" id="the-passage-by-justin-cronin"></a>The Passage by Justin Cronin</h3>
<p>I really enjoyed the character building. For a book ostensibly about virus-vampire apocalypse, it takes its sweet time telling about all the humans and giving everyone a worthy backstory. Very southern-gothic, Stephen King-esque. Against that tapestry of history, the stakes (see what I did there?) of decisions felt rich and meaningful, and Cronin managed to keep that pace up till the bitter end. I don't think I'll continue through the series though. Content warning: Violence, language, threatening situations.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>My link saving automation is mostly broken, and I started doing a weekly newsletter at work that has soaked up a <em>lot</em> of my desire to post links. I think I've also just spent more time in books than in Instapaper these days.</p>
<h3><a href="#stop-doing-design-system-projects" aria-hidden="true" class="anchor" id="stop-doing-design-system-projects"></a><a href="https://uxdesign.cc/stop-doing-design-system-projects-b094369dcfdd">Stop doing design system projects</a></h3>
<blockquote>
<p>When new designers and developers join forces to evolve your design system it is tempting to start working in projects. You might even create some epics and sprints to move user stories from your backlog in a Scrum environment. But when your design system is not a full-time effort, this will work counter-productive.</p>
</blockquote>
<p>I'm still trying to get our design system off the ground, but I had settled on doing it iteratively, bit by bit rather than a &quot;project&quot; all at once. Nice to see that others agree.</p>
<p><a href="https://uxdesign.cc/stop-doing-design-system-projects-b094369dcfdd">Stop doing design system projects</a></p>
<h3><a href="#marc-andreessen-on-productivity-scheduling-reading-habits-work-and-more" aria-hidden="true" class="anchor" id="marc-andreessen-on-productivity-scheduling-reading-habits-work-and-more"></a><a href="https://a16z.com/2020/09/07/on-productivity-scheduling-reading-habits-marc-andreessen/">Marc Andreessen On Productivity, Scheduling, Reading Habits, Work, and More</a></h3>
<blockquote>
<p>You really have to uplevel and figure out what’s important. I usually take a good hour to look at what I’ve been doing. It’s basically figuring out the threshold for “yes” versus “no”. I try to revise that about once a year.</p>
</blockquote>
<p>As a student of effective people, there were a couple good gems in this interview.</p>
<p><a href="https://a16z.com/2020/09/07/on-productivity-scheduling-reading-habits-marc-andreessen/">Marc Andreessen On Productivity, Scheduling, Reading Habits, Work, and More</a></p>
<h3><a href="#phd-student-reporting-what-its-like-to-use-a-zettelkasten-for-classes" aria-hidden="true" class="anchor" id="phd-student-reporting-what-its-like-to-use-a-zettelkasten-for-classes"></a><a href="https://zettelkasten.de/posts/zettelkasten-in-class/">PhD Student Reporting What It's Like to Use a Zettelkasten for Classes</a></h3>
<p>I'm still a student of this... reading about the <em>system</em> is more useful than the tools.</p>
<p><a href="https://zettelkasten.de/posts/zettelkasten-in-class/">PhD Student Reporting What It's Like to Use a Zettelkasten for Classes</a></p> ]]></description>
    </item>
    <item>
       <title>Hard Travel Case for Corne LP</title>
       <link>http://evantravers.com/articles/2020/09/14/hard-travel-case-for-corne-lp/</link>
       <pubDate>Mon, 14 Sep 2020 15:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/09/14/hard-travel-case-for-corne-lp/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/09/case-open.JPG"></p><p>When I am bored I get on Amazon and look for hard cases that might work for my favorite keyboards. This week… the new Corne LP. While there are people making soft sleeves for keyboards, there's not much in the way of a protective travel case for most keyboards, especially the weird hobbyist ones that I've been using recently.</p>
<p><img src="https://images.evantravers.com/articles/2020/09/case-closed.JPG" alt="case closed" /></p>
<p>This <a href="https://www.amazon.com/gp/product/B004I5BUSO/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;psc=1">5&quot; hard case for a GPS is $11 on Amazon</a>, and from the internal dimensions it looked like it'd fit the corne LP and some cables… and it does!</p>
<p>Included in the package is a very short usb-c -&gt; usb-a cable, a short TRRS cable to connect the halves, and the Apple Camera Connection kit so that I can plug this into my phone.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> Since soldering up the Corne, I've learned there are bluetooth chips I could put on it… but I'll just work with this for a while.</p>
<p><img src="https://images.evantravers.com/articles/2020/09/case-cyberdeck.JPG" alt="phone plugged into split keyboard" /></p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>You have to reduce the power draw of your keyboard for this to work. You can see my commit <a href="https://github.com/evantravers/qmk_firmware/commit/98aec4b55923b110f8f600222c25e2de900fe791">here</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Automating Blog Images using Alfred File Actions</title>
       <link>http://evantravers.com/articles/2020/09/03/automating-blog-images-using-alfred-file-actions/</link>
       <pubDate>Thu, 03 Sep 2020 11:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/09/03/automating-blog-images-using-alfred-file-actions/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/09/actions.png"></p><p>This automation is really ugly, but it makes my life so much easier. Automation can make you faster, but it can also make you more consistent.</p>
<p>When I'm working on a blog post, I'm frequently pulling airdropped photos from my phone, screenshots, and random illustrations to put in the current draft. All these artifacts need to go to the right folder in my git repo.</p>
<p>The correct file location for an image (for me!) is:</p>
<p><code>https://images.evantravers.com/articles/&lbrace;YYYY&rbrace;/&lbrace;MM&rbrace;/</code></p>
<p>Especially early in the month, that folder doesn't always exist. Worse, it has duplicates in both the <code>source</code> and <code>build</code> folders of my static site… so it's often hard to find the right folder even using Alfred's fast file search. I usually end up typing the name of a recent image, opening the containing folder in Finder, then navigating and doing it manually. I'd often put the image in <code>build</code> instead of <code>source</code>, or other mistakes.</p>
<p>No longer!</p>
<p>I finally wrote a tiny script and added it as an Alfred Workflow as a File Action. That means if I select any file on my computer or find it in Alfred, then hit Tab to act on it, I can select my workflow with speed.</p>
<p>The workflow looks like this in Alfred:</p>
<figure>
  <img alt="alfred workflow" src="https://images.evantravers.com/articles/2020/09/alfred.png">
</figure>
<p>And the bash script is stupid and simple.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I choose to pass the arguments as &lbrace;query&rbrace; instead of</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># the default $1</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">repo</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HOME</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/src/github.com/evantravers/evantravers.com</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">folder</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/sourcehttps://images.evantravers.com/articles/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+%Y/%m/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkdir</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-p</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">repo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">folder</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># the OSX default `cp` command doesn&#39;t have this argument.</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># I&#39;m using `gcp` from &quot;brew install coreutils&quot;</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/usr/local/bin/gcp</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-t</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">repo</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">folder</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Now… no matter whether the folder exists, and no matter how I find the image… it's a one keypress away from being in exactly the right place. 👍</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>The trick for using GNU <code>cp</code> on OS X I got from <a href="https://askubuntu.com/a/816826">this ask ubuntu question</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Follow-up: Customizing a Keyboard Layout</title>
       <link>http://evantravers.com/articles/2020/09/02/follow-up-customizing-a-keyboard-layout/</link>
       <pubDate>Wed, 02 Sep 2020 11:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/09/02/follow-up-customizing-a-keyboard-layout/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/09/kyria.jpg"></p><p>In February, I <a href="/articles/2020/02/22/customizing-a-keyboard-layout/">wrote about my journey to customize a keyboard layout</a>. I tend to write while I'm still thinking and processing, so a lot has changed since that post. For the two of you who care… here's what I'm typing on <em>right now</em>.</p>
<h2><a href="#symbol-layer" aria-hidden="true" class="anchor" id="symbol-layer"></a>Symbol Layer</h2>
<p>For the past two years, I had been using a variant of the Planck layout, which has symbols on two layers: Lower and Raise. Raise has all the unshifted symbols, and Lower has all the shifted variants.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>  This means that you can kind of reason your way around the board, and find things based on existing muscle memory… or by glancing up at your laptop keyboard.</p>
<p>In my last post, I discussed how using a keyboard with thumb modifiers made this more complicated… my thumbs went from merely hitting the space bar to layers, space, and all four modifiers.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup> While I don't program for a living at the moment I still write a <strong>lot</strong> of code and markdown and my thumbs were tired and slow.</p>
<p>Part of the solution was to create a layer with <em>only</em> symbols. In the last post, I counted up all the symbols on a standard keyboard and came up with 26… which easily fits within the 3x10 grid that is a subset of all my keyboard layouts:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">/* Symbols
</div><div class="line" data-line="2"> *
</div><div class="line" data-line="3"> * ,---------------------------------------.
</div><div class="line" data-line="4"> * | ! | @ | &lbrace; | &rbrace; | | | ^ | _ | + | / | \ |
</div><div class="line" data-line="5"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="6"> * | # | $ | ( | ) | ` | / | - | = | * | &quot; |
</div><div class="line" data-line="7"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="8"> * | % | ^ | [ | ] | ~ | &amp; | ? | &lt; | &gt; | : |
</div><div class="line" data-line="9"> * `---------------------------------------&#39;
</div><div class="line" data-line="10"> */
</div></code></pre>
<p>This is a little messy. It has been tweaked steadily over the past seven months, so I honestly don't even remember the reasons for some of this now. I started with the default kyria/ergodox layout and modified to maximize &quot;logicalness&quot;.</p>
<p>The two columns on the left are basically the LH part of the number row. I <em>believe</em> this is identical to the Ergodox EZ default layout and Kyria default layout. I then borrowed the Ergodox's decision to put all the brackets and braces together. Coming from the Planck layout, this was probably the biggest change, since the Planck puts the numrow special characters across the top of the board in their &quot;normal&quot; order, so <code>()</code> and <code>[]</code> moved from RH to LH. I filled some of the extra spaces with duplicate characters or a few characters that still available on a shifted layer.</p>
<p>If you decide to do something similar… and you are going to break <em>every</em> standard keyboard convention, I recommend starting with something very basic and changing it based on the keys you type the most. I optimized for markdown, javascript, and elixir… since that's what I spend the most time in.</p>
<p>One downside to this is that some muscle memory for keyboard shortcuts in Vim and gmail have to be relearned. That is a pretty big barrier, but I adapted quickly.<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup></p>
<p>I had to keep tweaking things to make sure it made sense for the kind of strings that I type, but eventually I became a well oiled special character typing machine thanks to some solid time practicing on <a href="https://www.typingclub.com/sportal/program-3/457.play">typingclub.com's excellent symbol practice strings</a>.</p>
<h2><a href="#space-for-layers" aria-hidden="true" class="anchor" id="space-for-layers"></a>Space for Layers</h2>
<p>I then started using the spacebars as layer toggles. If I tap my spacebar, it behaves as a normal spacebar, if I hold the spacebar, I can access my layers. I think the default Kyria layout does this… but I had it disabled because I wasn't able to cope at first. It took some adjusting of the timing, but now I haven't had a problem with it.</p>
<p>Downside: many applications use a spacebar hold for panning around a canvas… I may need to dive into the settings to add a timeout, but for now I've simply added a &quot;normal&quot; spacebar in my Design Shortcuts layer, and that works just fine. 🤷‍♂️</p>
<h2><a href="#mods" aria-hidden="true" class="anchor" id="mods"></a>Mods</h2>
<p>Let's talk about &quot;home row modifiers.&quot; I'm definitely not the first person to write about them, and there are <a href="https://www.youtube.com/watch?v=TnE8Qu7a58M">many people</a> who have been using them for a lot longer.</p>
<p>I know I had read about it in the past, but I really started to consider it while researching layouts for the <a href="https://github.com/foostan/crkbd">corne keyboard</a> and discovered the <a href="https://github.com/manna-harbour/miryoku">miryoku layout</a>. Among many of the interesting tricks in this layout is that the home row keys <code>asdfjkl;</code> become modifiers if held. I realized that this would relegate my thumbs to only space, layers, and outer mods… and gave it a try. It takes some tweaking to your tap-hold settings in QMK, and definitely some practice in typing, but I think I'm sold on the concept after two months of trying it.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">/* Home row modifiers
</div><div class="line" data-line="2"> *
</div><div class="line" data-line="3"> * ,---------------------------------------.
</div><div class="line" data-line="4"> * |   |   |   |   |   |   |   |   |   |   |
</div><div class="line" data-line="5"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="6"> * | ⌘ | ⌥ | ⌃ | ⇧ |   |   | ⇧ | ⌃ | ⌥ | ⌘ |
</div><div class="line" data-line="7"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="8"> * |   |   |   |   |   |   |   |   |   |   |
</div><div class="line" data-line="9"> * `---------------------------------------&#39;
</div><div class="line" data-line="10"> */
</div></code></pre>
<p>It took at least two weeks before I stopped accidentally opening print dialogs and other annoyances. I believe the trick (for me) was learning to let go of each key as soon as the key actuates. I think I had a bad habit of holding a key until the next key press because of my piano training trying to type <a href="https://www.merriam-webster.com/dictionary/legato">legato</a>. I also think I located my hand on the keyboard based on the last key pressed… but now that I move my hands away from home row so rarely that is not an issue.</p>
<p><a href="/articles/2019/04/03/my-keyboard-setup/#controlling-your-keyboard">My old Planck layout</a> had the mods at the bottom under each finger. I think that helped me get my brain ready for home row modifiers. Now that I have tried moving those modifiers up to home row … I don't believe I'm going back. If you are an emacs user, definitely consider checking this technique out. No more contorting or twisting of your hand to get your ring and pinky finger onto the mods at the bottom corner of the keyboard… you don't have to move your hand at <em>all</em>. I use Readline shortcuts heavily while in a terminal, and now that alt/meta and control are so easy to reach… sometimes I jump around without even realizing how easy it is.</p>
<p>While home row modifiers are the most wild modification I've yet tried to a keyboard, they are also the most rewarding from an ergonomic perspective. If you are willing to tweak the location of symbols for ergonomics, you are probably the target market.</p>
<p>There is at least one downside… at least the way I have it configured. Just like the spacebar before, you can't hold down <code>j</code> and scroll in vim… because the <code>j</code> doesn't repeat, it just becomes a <code>⇧</code> (shift) modifier. Honestly… holding down <code>j</code> to scroll is a little bit of a vim anti-pattern, and I have adjusted to it, but that may be really annoying to you.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>4</a></sup></p>
<h2><a href="#all-together-now" aria-hidden="true" class="anchor" id="all-together-now"></a>All together now.</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2020/09/layout.png">
  <figcaption>
    <p>Here's what it all looks like together in a sort of exploded view. As you can see... I'm using a <em>lot</em> less keys, especially on the thumbs. Mostly trying to minimize the main grid and three thumb keys. The inner 3x10 grid is always the same, but the "wrapper" keys differ slightly from board to board.</p>
    <p>Blue is symbols, Orange is control, Green is shortcuts, and pink are holds (mod-taps). I actually left out of the image features and layers, like the media keys, F1-F12, and the RGB controls... because it got too busy.</p>
    <p>If you want to look at the layout on keyboard-layout-editor.com, click <a href="http://www.keyboard-layout-editor.com/#/gists/ec70784c2cf2a294063e4b1b900e5257">here</a>.</p>
    <p>Just putting this thing together has given me new ideas...</p>
  </figcaption>
</figure>
<p>I spend most of my day typing markdown for emails, blog posts, and documentation for work. My fingers almost never stretch beyond one key up or down from home row, and my thumbs almost never leave my spacebars. I rarely stretch my pinkies out to the outer column unless I'm accessing my macro/custom layers.<sup class="footnote-ref"><a href="#fn-5" id="fnref-5" data-footnote-ref>5</a></sup> Most of the <a href="/articles/2020/02/22/customizing-a-keyboard-layout/#the-outer-keys">&quot;outer keys&quot;</a> are on the unused four thumb keys or on layers. There's only six of them after all.</p>
<p>I'm still tweaking and learning, and about to try a new corne keyboard that's sitting in front of me waiting for switches, but this feels really good. Even with shifting with my pointer fingers (weird right?) I'm still getting regular 100+ wpm on <a href="https://monkey-type.com/">monkey-type.com</a>, mostly on quotes.</p>
<p>I'm sure this will continue to change... I've got that Corne keyboard ready to be completed, and an Atreus from keyboard.io coming at some point that will teach me new lessons and make me try new things.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>This is a nice memory trick to help folks remember where things might be… for instance the letter <code>Q</code> with the Raise layer enabled is <code>1</code>, and with the lower layer enabled is <code>!</code>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>Typing a common string like <code>&lt;!-- --&gt;</code> (a comment in HTML) requires 9 separate thumb movements. Every character alternates between a different layer, space, or shift! <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>Most of the issues had to do with relearning jumps related to <code>()</code> or toggling options in unimpaired using <code>[]</code>. It really wasn't that bad. Actions like copying the current selection are even easier in some cases: <code>&quot;*y</code> requires a lot less movement. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-4">
<p>This will also affect gaming… because most of <code>wasd</code> can not be held either. This doesn't bother me though… on a keyboard this small I'm probably going to make a gaming layer anyway. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-5">
<p>I've moved <code>'</code> and <code>&quot;</code> on layers and forced myself to use them. I may move them to a thumb key on a layer eventually… it's a little out of the way. <a href="#fnref-5" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: August</title>
       <link>http://evantravers.com/articles/2020/08/31/books-and-links-august/</link>
       <pubDate>Mon, 31 Aug 2020 20:09:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/08/31/books-and-links-august/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/08/feet.jpg"></p><p>This has been a big month for us. Some new little feet walked through our door, and we are greatly blessed. I have small quiet projects rolling on all my hobbies: hammerspoon, keyboards, and zettelkasten automation... but I've been trying to give my best to my family. This blog is moth and rust ultimately.</p>
<p>I did write some of my favorite things I've ever posted to the site <a href="/articles/2020/08">this August</a>, so I guess the extra time spent rocking the cradle jogged my brain as well. 🤷</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#tiny-habits-by-bj-fogg" aria-hidden="true" class="anchor" id="tiny-habits-by-bj-fogg"></a>Tiny Habits by BJ Fogg</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2020/08/diagrams.png"></img>
  <figcaption>
    <p>I borrowed the book from the library, so I hand drew some copies of all the diagrams from the book.</p>
    <p>I wound up just buying a physical copy.</p>
  </figcaption>
</figure>
<p>I finally finished Tiny Habits by BJ Fogg. I'll probably re-read it with my wife at some point.</p>
<p>I think Tiny Habits will make a difference in my life. The idea of designing for behavior change by making small changes that build over time is also common to Atomic Habits… But the behavior model that Fogg talks about seems to be easier to get into and could build up change after change in all areas of life.</p>
<p>I’m also excited about the possibilities of creating positive change in my family or in my office. The story about the father helping create behavior change for his teenage son by requiring less and celebrating more seems plausible and useful.</p>
<p>After finally getting through that many pages of self-help, I blew through at least <em>four</em> light fiction which was <em>wonderful</em>.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>As has been the case for a little bit, my formerly smooth automation for generating these posts has been <em>utterly</em> destroyed by my transitions between plaintext note systems, so here's some cherry-picked items.</p>
<h3><a href="#the-onion-for-design-systems-atomic-design-and-pace-layering--by-leslie-mu--aug-2020--ux-collective" aria-hidden="true" class="anchor" id="the-onion-for-design-systems-atomic-design-and-pace-layering--by-leslie-mu--aug-2020--ux-collective"></a>The onion for Design Systems: atomic design and pace layering | by Leslie Mu | Aug, 2020 | UX Collective</h3>
<blockquote>
<p>Keeping Pace Layering in mind, the design team should be more careful when expanding and iterating the atoms and molecules than organisms and templates, since the lower level the component is on, the more it’s applied to higher-level components, which means the changes are more impactful. On the contrary, the team should have more flexibility and freedom iterating organisms and templates. It’s a mental thing.</p>
</blockquote>
<p><a href="https://uxdesign.cc/the-onion-for-design-systems-atomic-design-and-pace-layering-4cc59a3c486">The onion for Design Systems: atomic design and pace layering | by Leslie Mu | Aug, 2020 | UX Collective</a></p>
<h3><a href="#adactio-journaldesign-principles-for-the-webthe-links" aria-hidden="true" class="anchor" id="adactio-journaldesign-principles-for-the-webthe-links"></a>Adactio: Journal—Design Principles For The Web—the links</h3>
<blockquote>
<p>Should you be interested in the links that I’ll be bombarding the attendees with, I’ve gathered them here in one place (and they’re also on the website of An Event Apart). The narrative structure of the talk might not be clear from scanning down a list of links, but there’s some good stuff here that you can dive into if you want to know what the inside of my head is like.</p>
</blockquote>
<p>The links in this article are a <em>very</em> good reading list for anyone who develops or designs for the web.</p>
<p><a href="https://adactio.com/journal/17310">Adactio: Journal—Design Principles For The Web—the links</a></p>
<h3><a href="#a-clean-start-for-the-web---macwrightcom" aria-hidden="true" class="anchor" id="a-clean-start-for-the-web---macwrightcom"></a>A clean start for the web - macwright.com</h3>
<p>An interesting perspective about the web's problems… carefully dissecting the two major use cases: delivering documents, and delivering applications.</p>
<blockquote>
<p>The web has gotten much harder to develop for.</p>
<p>The web has had about 25 years to grow, few opportunities to shrink, and is now surrounded by an extremely short-sighted culture that is an outgrowth of economic and career short-termism. There are lots of ways to do anything, and some of the most popular ways of building applications on the web are - in my opinion - usually ghoulish overkill.</p>
<p>The best way for folks to enter web development in 2020 is to choose a niche, like Vue.js or React, and hope that there’s a CSS and accessibility expert on their team.</p>
<p>For folks who just want to create a web page, who don’t want to enter an industry, there’s a baffling array of techniques, but all the simplest, probably-best ones are stigmatized. It’s easier to stumble into building your resume in React with GraphQL than it is to type some HTML in Notepad.</p>
</blockquote>
<p>There's a reasonable take on the &quot;web is too hard&quot; conversation, pointing out that it's mostly from one perspective judging another.</p>
<blockquote>
<p>When I read blog posts from ‘traditional web developers’ who are mad that HTML &amp; CSS aren’t enough anymore and that everything is complicated – I think this is largely that the application stack for building websites has replaced the document stack in a lot of places. Where we would use Jekyll or server-side rendering, we now use React or Vue.js. There are advantages to that, but for a lot of minimally-interactive websites, it’s throwing away decades worth of knowledge in exchange for certain performance perks that might not even matter.</p>
</blockquote>
<p>Wright goes on to propose two different webs… one for applications and a leaner, accessible one for documents. It's an interesting take.</p>
<p><a href="https://macwright.com/2020/08/22/clean-starts-for-the-web.html">A clean start for the web - macwright.com</a></p>
<h3><a href="#the-hiring-post--quarrelsome" aria-hidden="true" class="anchor" id="the-hiring-post--quarrelsome"></a>The Hiring Post — Quarrelsome</h3>
<p>Very good post on building a system that identifies excellent talent… no more good old boy systems or confusing patterns.</p>
<blockquote>
<p>There are people who have the social skills to actively listen to someone else’s technical points, to guide a discussion with questions of their own, or to spot opportunities to redirect a tough question back to familiar territory. Those people build impressive resumes. They effortlessly pass “culture fit” tests. And a lot of them can’t code.</p>
</blockquote>
<p><a href="https://sockpuppet.org/blog/2015/03/06/the-hiring-post/">The Hiring Post — Quarrelsome</a></p> ]]></description>
    </item>
    <item>
       <title>Craves and Gets Nothing</title>
       <link>http://evantravers.com/articles/2020/08/18/craves-and-gets-nothing/</link>
       <pubDate>Tue, 18 Aug 2020 10:12:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/08/18/craves-and-gets-nothing/</guid>
       <description><![CDATA[ <blockquote>
<p>[4] The soul of the sluggard craves and gets nothing,
while the soul of the diligent is richly supplied.</p>
</blockquote>
<p>(Proverbs 13:4)</p>
<p>Lord, thank you for allowing this scripture to jump out at me… and punch me squarely in my sluggard mouth.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<p>The sluggard is a common enough topic in Proverbs… and I have foolishly associated it only with the concepts of physical diligence and work ethic. This proverb clearly states that this sluggard struggles to provide for his <em>soul</em>.</p>
<p>The very same day I read this I found myself crying out to you for more of yourself. While I am grateful you have placed within me the desire to know you more… I was instantly convicted that I crave… and get nothing. I have not showed diligence to seek you. &quot;The soul of the diligent is richly supplied&quot;… while I have everything I need for life and godliness (2 Pet 1:3) I don't have because I ask wrongly (James 4:3)… and I ought to submit and draw near. (James 4:8-9)</p>
<p>Forgive me Lord for how long I have not given you the worship you are worth. This is my cry of humility and submission: you are Lord, and I am sorry. I want to give you the first-fruits of my day once more… please continue to challenge and encourage me. In the name of your Son, in whom I have peace with God and a surety of salvation, amen.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>To be honest… in my pride I realized I tend to skip over proverbs about sluggards thinking they don't apply to me. Well, I am chastened and humbled. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Headspace: Block All The Things!</title>
       <link>http://evantravers.com/articles/2020/08/07/headspace-block-all-the-things/</link>
       <pubDate>Fri, 07 Aug 2020 15:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/08/07/headspace-block-all-the-things/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/08/allthethings.jpg"></p><p>JG wrote:</p>
<blockquote>
<p>As far as I know, Headspace blocks the opening of applications via the hyper key, right? I was wondering if there is a way to block the opening of applications at all?</p>
</blockquote>
<p>Pretty much as soon as I had finished the series on Hammerspoon, I knew I wanted to take the Headspace project further. At that point, it would block opening or switching to an application via the Hyper shortcuts I had defined earlier, but if you opened an application via Finder, Spotlight, or another launcher like <a href="https://www.alfredapp.com/">Alfred</a>… I could get around my little system.</p>
<p>My fingers started building the new neural pathways to get around my own boundaries <em>immediately</em>. So it's time to… BLOCK ALL THE THINGS! * ahem *</p>
<p>I had actually taken a couple stabs at the universal blocking before I finished the blog post. I had a pretty good idea that I'd be using the <code>hs.application.watcher</code> to track what applications had launched, but I could <em>not</em> get it to work.</p>
<p>After a <em>lot</em> of back and forth and some debugging, I eventually realized that I was tripping over Lua's garbage collection. I had instantiated the watcher, but in the local context of a lua module<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup>. This meant that after the function had been called first time, the watcher's object was garbage collected and destroyed.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup> I eventually &quot;hoisted&quot; the watcher out to the global namespace like this:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- ...</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher_enabled</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launched</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applications</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Blocked &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Current headspace: &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;headspace&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span>
</div><div class="line" data-line="13">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hsapp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">kill</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- ...</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span>
</div></code></pre>
<p>Another advantage to this migration is that now <code>headspace.lua</code> is not dependent at all on <code>hyper.lua</code>. You can trigger the Headspace UI any way you like. I have thought about rewriting it as an official Hammerspoon Spoon, but I am not sure if anyone really wants that.</p>
<p>While I was working on it, I added another feature: you can now define a teardown function for a space. The teardown function fires when the space is exited, and I use it to &quot;undo&quot; things. For instance, when I enter my <a href="https://github.com/evantravers/hammerspoon-config/blob/2c03bb10c11b7c16b68ab94e2c475c31f52e8afc/spaces/communicate.lua">Communication space</a>, I filter Things.app to the set of to-dos related to communicating. When I leave Communication, I want to see my normal &quot;Today&quot; view, and that's easy enough to implement.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">agendaFor</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=anytime&amp;filter=@Work,Agenda%20For&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">teardown</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>I've been using the new Headspace for the past month or so, and it has been really stable. I may end up choosing to use a non-native notification method eventually, just as I tend to turn on Do Not Disturb mode, which effectively blocks Headspace from telling me what it's doing. As it is, I haven't made any major changes to it in a while, mostly just aesthetic changes to the time tracker and adjusting the blocking lists for various spaces.</p>
<p>If you want to give Headspace a try, you can! Here is a minimum viable init.lua for starting to tinker and build your <strong>own</strong> setup.</p>
<ol>
<li>
<p>Download the following files to your Hammerspoon directory (usually <code>~/.hammerspoon</code>):</p>
<ul>
<li><a href="https://raw.githubusercontent.com/evantravers/hammerspoon-config/2ae895b1fad99b5615a85e7b048b4faca9f091b6/headspace.lua">headspace.lua</a></li>
<li><a href="https://raw.githubusercontent.com/evantravers/hammerspoon-config/2ae895b1fad99b5615a85e7b048b4faca9f091b6/toggl.lua">toggl.lua</a></li>
<li><a href="https://raw.githubusercontent.com/evantravers/hammerspoon-config/2ae895b1fad99b5615a85e7b048b4faca9f091b6/secrets.lua">secrets.lua</a></li>
</ul>
</li>
<li>
<p>You'll need to set up your toggl secrets in a <code>.secrets.json</code> in that same Hammerspoon folder. Use this as a guide:</p>
<pre class="lumis"><code class="language-json" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;toggl&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;key&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;wouldntyouliketoknow&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;projects&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;communications&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;communications id&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;deep&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;deep id&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
</li>
<li>
<p>Here's a minimimum viable init.lua, together with some commentary on what is going on:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- load in all secrets</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secrets</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;secrets&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secrets</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;.secrets.json&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- instantiate the config table that will be passed to the headspace module</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- define some applications to block... yours will be different, here&#39;s just a place to start.</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applications</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;org.mozilla.firefox&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;org.mozilla.firefox&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.tinyspeck.slackmacgap&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.tinyspeck.slackmacgap&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;communication&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.apple.iChat&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.apple.iChat&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;communication&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;distraction&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- instantiate tables for headspace spaces</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- instantiating them early means that you can use `table.insert` to add</span>
</div><div class="line" data-line="24"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- more later.</span>
</div><div class="line" data-line="25"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="26"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- I store the API id of my toggl projects in a the `.secrets.json`</span>
</div><div class="line" data-line="28"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;secrets&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span>
</div><div class="line" data-line="29">
</div><div class="line" data-line="30"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- setup spaces</span>
</div><div class="line" data-line="31"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- I recommend having at _least_ two... one for shallow and one that blocks</span>
</div><div class="line" data-line="32"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- distractions for &quot;deep&quot; work. Take what I have here and make it your</span>
</div><div class="line" data-line="33"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- own.</span>
</div><div class="line" data-line="34"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Deep&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="36">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Work deeply on focused work&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="37">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imageFromAppBundle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.apple.finder&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="38">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl_proj</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deep</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="39">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blacklist</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;distraction&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;communication&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="40">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;deep&#39;</span>
</div><div class="line" data-line="41"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="42">
</div><div class="line" data-line="43"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deep</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="44">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="45">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=anytime&amp;filter=@Work,$High&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="47">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">teardown</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="48">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="49">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="50"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="51">
</div><div class="line" data-line="52"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="53">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Communication&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="54">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Intentionally engage with Slack and Email.&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="55">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imageFromAppBundle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.tinyspeck.slackmacgap&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="56">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">whitelist</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;communication&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="57">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;communication&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="58">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl_proj</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">communication</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="59">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;agendaFor&#39;</span>
</div><div class="line" data-line="60"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="61">
</div><div class="line" data-line="62"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">funcs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">agendaFor</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="63">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="64">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=anytime&amp;filter=@Work,Agenda%20For&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="65">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="66">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">teardown</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="67">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="68">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="69"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="70">
</div><div class="line" data-line="71"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- instantiate headspace</span>
</div><div class="line" data-line="72"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headspace</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;headspace&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="73"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- enable the watcher to start the blocking</span>
</div><div class="line" data-line="74"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enable_watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="75"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- start the module&#39;s setup</span>
</div><div class="line" data-line="76"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="77"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- bind the Space Choosing UI to a key.</span>
</div><div class="line" data-line="78"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Here I&#39;m just using `⌘⌥+k`.</span>
</div><div class="line" data-line="79"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hotkey</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;cmd&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;alt&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;k&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choose</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
</li>
</ol>
<p>That's it! I did some smoke testing on my own system to make sure that this works, but I am (most likely) forgetting <em>something</em>. I realize that this is still really confusing, so if you want to give this a whirl, please <a href="/contact">reach out</a> and I'll be happy to help you. 🙏</p>
<p>You can always take more inspiration from <a href="https://github.com/evantravers/hammerspoon-config/">my ever evolving configuration at my github</a>.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>You can see the change <a href="https://github.com/evantravers/hammerspoon-config/commit/285703adb2d86925b63f115b93208ebf1a9061ae">here</a>. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>The symptom of this problem was the blocking function would execute correctly <em>once</em>, then stop working. This was because after the module was loaded, the GC would destroy the watcher object. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Pull to Waste Your Life</title>
       <link>http://evantravers.com/articles/2020/08/06/pull-to-waste-your-life/</link>
       <pubDate>Thu, 06 Aug 2020 16:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/08/06/pull-to-waste-your-life/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/08/magic_thread.png"></p><p>I read a short story twenty years ago… yet it has stayed with me. It's called <a href="http://www.davidgaultiere.com/the-magic-thread/"><em>The Magic Thread</em></a>, I first read it in The collection of short stories called <em>The Book of Virtues</em><sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>.</p>
<p>You <strong>should</strong> go read it, but here is the gist: a young man is given a dangerous magic gift<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup>: a silver ball that slowly emits a shining thread. When the thread is pulled… time <em>actually</em> flies by! Bored of a day at school… he gives the thread a little tug and suddenly recess is here. He's tired of waiting to be old enough to marry… a harder tug and he's standing at the altar… he's tired of making a small salary… a yank and he's middle aged, a partner at the firm. Before too long he's left an old man with no memories… and the thread is too short to pull any more. He considers the cost, talking to the old woman who gave him the ball:</p>
<blockquote>
<p>&quot;Your magic ball is a wonderful thing. I have never had to suffer or wait for anything in my life. And yet it has all passed so quickly. I feel that I have had no time to take in what has happened to me, neither the good things nor the bad. Now there is so little time left. I dare not pull the thread again for it will only bring me to my death. I do not think your gift has brought me luck.&quot;</p>
</blockquote>
<p>The story is supposedly a French fable, I haven't been able to trace the origin or translator<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>3</a></sup>. The moral was simply about impatience and the importance of treasuring the moments. When it was reprinted in 1993, <a href="http://nokiamuseum.info/category/launching-year/1993/">cell phones could not even play snake</a> and they cost a fortune to operate. When this short story was likely written there was very little of the current swath of time-draining technology. No Candy Crush, no binging of seasons of serialized fiction, no infinity pools of influencers spewing content algorithmically calculated to keep us scrolling… the tale was written to warn about simple daydreaming and sleeping our day away.</p>
<p>I do not think William Bennett imagined that only two decades after he included this fable in his anthology every human, seven years or older, would have <em>actual</em> magic devices in their pockets. We have a blessing and a curse, with no stern warning of the danger. His idyllic fable now reads as a dystopian sci-fi warning.</p>
<p>I think about Peter and his silver ball every time I &quot;pull down to refresh<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>4</a></sup>…&quot; and half an hour disappears without a whimper… or a useful memory of what I have consumed. At the end of our days there will be no old magic woman to take away the ball and give us the second chance to try again… just hours of empty time without meaningful memories and a full browser history.</p>
<blockquote>
<p>&quot;I've had a terrible dream, Mother. I dreamed that I was old and sick and that my life had passed like the blinking of an eye with nothing to show for it. Not even any memories.&quot;</p>
<p>His mother laughed and shook her head.</p>
<p>&quot;That will never happen,&quot; she said…</p>
</blockquote>
<p>Yikes.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>William J. Bennett. <em>Book of Virtues</em>. Simon and Schuster, 1993. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p><a href="https://en.wikipedia.org/wiki/The_Monkey%27s_Paw">The Monkey's Paw</a> is a story about some people who get what they wish for... with a twist. It's a trope now. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-4">
<p><a href="https://scifi.stackexchange.com/questions/33743/identify-a-story-about-a-magic-string-box">A StackExchange question trying to find the same thing…</a> <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-3">
<p>Here I'm referring to the common mobile UX affordance of pulling down from the top of the screen to refresh… Six months ago, I deleted Instagram off my phone. A week ago… I blocked twitter and instagram's URLs from my phone browser. I still struggle. 😔 <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: July</title>
       <link>http://evantravers.com/articles/2020/08/02/books-and-links-july/</link>
       <pubDate>Sun, 02 Aug 2020 20:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/08/02/books-and-links-july/</guid>
       <description><![CDATA[ <p>As this month wound to a close, my wife and have been awaiting our second child, so there wasn't too much in the way of reading on either side for me.</p>
<p>I had bought a synology, so I spent a lot of time making sure our family data is backed up properly.</p>
<p>I've been listening to a bunch of podcasts to catch up... here's some of the ones I've been enjoying.</p>
<h2><a href="#podcasts" aria-hidden="true" class="anchor" id="podcasts"></a>Podcasts</h2>
<h3><a href="#the-intentional-family" aria-hidden="true" class="anchor" id="the-intentional-family"></a>The Intentional Family</h3>
<p>Sarah and I have been slowly listening to these together... I think it's a good touch point to hear another couple with similar dynamics share some of their strengths and struggles.</p>
<p>I really got a lot out of <a href="https://intentionalfamily.fm/episodes/6">#6</a>, which showed me that my overly complicated and frustrating family meeting plan was all about &quot;stuff done&quot; and not enough about loving Sarah.</p>
<p><a href="https://intentionalfamily.fm/">intentionalfamily.fm</a></p>
<h3><a href="#the-portal" aria-hidden="true" class="anchor" id="the-portal"></a>The Portal</h3>
<p>I do <em>not</em> agree with everything discussed on this podcast, but I keep listening because that even when adversarial the host and his guests are genuinely trying to persuade the other... rather than grandstanding to their respective and polarized audiences. It <em>is</em> refreshing to hear a long conversation about important things between two passionate but respectful people.</p>
<p>Notable episodes:</p>
<ul>
<li><a href="https://podcasts.apple.com/us/podcast/32-j-d-vance-american-dreams-and-nightmares/id1469999563?i=1000473090465">JD Vance</a> discussing America falling out of love with the traditional family</li>
<li><a href="https://podcasts.apple.com/us/podcast/26-james-okeefe-what-is-isnt-journalism-in-21st-century/id1469999563?i=1000468918064">James O'Keefe</a> and Eric getting fighting mad while staying civil and discussing ethics in journalism.</li>
<li><a href="https://podcasts.apple.com/us/podcast/19-bret-weinstein-the-prediction-and-the-disc/id1469999563?i=1000462975502">Bret Weinstein</a> sharing a tale of frustrated research and an assumption that imperils a slew of modern medical research.</li>
<li><a href="https://podcasts.apple.com/us/podcast/13-garry-kasparov-avoiding-zugzwang-in-ai-and-politics/id1469999563?i=1000457968500">Garry Kasparov</a> discussing chess, AI, and the immoral russian state that is willing to drown the truth in memes.</li>
</ul>
<p><a href="https://podcasts.apple.com/us/podcast/the-portal/id1469999563">The Portal - Apple Podcasts</a></p>
<h3><a href="#cortex" aria-hidden="true" class="anchor" id="cortex"></a>Cortex</h3>
<p>Cortex has been a big influence on some of the decisions I've made personally for my own productivity, and is a good way for me to stay distantly interested in technology without drinking from the firehose.</p>
<p>If nothing else, it's made me more respectful of the different ways that other people work, instead of being as opinionated about &quot;best practices&quot; as I have been in the past.</p>
<p>Notable episodes:</p>
<ul>
<li><a href="https://www.relay.fm/cortex/95">Discussing yearly themes</a></li>
<li><a href="https://www.relay.fm/cortex/101">Productivity 101</a></li>
</ul>
<p><a href="https://www.relay.fm/cortex/">Cortex - Relay.fm</a></p>
<h3><a href="#focused" aria-hidden="true" class="anchor" id="focused"></a>Focused</h3>
<p>Another super influential one for me. Really grateful that I found this podcast when I did. It's really helped me return my attention to what's important, rather than just trying to do everything faster.</p>
<p>Notable episodes:</p>
<ul>
<li><a href="https://www.relay.fm/focused/96">Working from Home</a></li>
<li><a href="https://www.relay.fm/focused/79">Reclaiming Margin with Shawn Blanc</a></li>
</ul>
<p><a href="https://www.relay.fm/focused">Focused - Relay.fm</a></p>
<h3><a href="#nested-folders" aria-hidden="true" class="anchor" id="nested-folders"></a>Nested Folders</h3>
<p>Another lovely one that has just been a quick refresher. I would now point to this one - (especially the episodes that are now going through the <a href="https://nestedfolderspodcast.com/podcast/episode-28-gtd-workflow-part-one-capture/">basics of the GTD system</a>!) - as a great starting point for someone who is getting tired of being overwhelmed and unorganized and wants a place to start.</p>
<p><a href="https://nestedfolderspodcast.com/">https://nestedfolderspodcast.com/</a></p>
<h3><a href="#strong-songs" aria-hidden="true" class="anchor" id="strong-songs"></a>Strong Songs</h3>
<p>I love this one... while my music theory is rusty, the host's love for music is infectious. I love re-discovering a song, learning all about the story, and finding new depths as Kirk dissects and reassembles the song from scratch.</p>
<p>I think one of the strongest episodes is for <a href="https://strongsongspodcast.com/paranoid-android-by-radiohead">Radiohead's Paranoid Android</a>, which is a song I love, but he shows the careful orchestration and beauty behind the blaring and furious rock guitars.</p>
<p><a href="https://www.strongsongspodcast.com/">Strong Songs Podcast</a></p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I read Christian Living in the Home by Jay Adams. It was a good and quick refresher, and very convicting for a family man about to welcome a new little one.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#look-whos-talking--real-life" aria-hidden="true" class="anchor" id="look-whos-talking--real-life"></a>Look Who’s Talking — Real Life</h3>
<p>This is a chilling warning about the power and threat of choosing tone for UX microcopy. Very good read.</p>
<blockquote>
<p>To UX writing teams, “clarity” often means making what the company wants you to do the clear choice for you.</p>
</blockquote>
<p><a href="https://reallifemag.com/look-whos-talking/">Look Who’s Talking — Real Life</a></p>
<h3><a href="#how-to-get-the-best-design-feedback-from-your-team--matthew-ström-designer--developer" aria-hidden="true" class="anchor" id="how-to-get-the-best-design-feedback-from-your-team--matthew-ström-designer--developer"></a>How to get the best design feedback from your team || Matthew Ström: designer &amp; developer</h3>
<blockquote>
<p>The feedback process is a design tool, like Sketch or Micron pens. The best part about the feedback process is that it is, by nature, a team activity. Anyone can take part, and everyone benefits.</p>
<p>Like any tool, the feedback process gets better with practice. At Planetary, we’ve been running short feedback cycles for 6 months or so, and we’re still working to improve (this article is part of that work).</p>
<p>Overall, shifting focus away from the language of feedback and towards the process of feedback has allowed us to be more inclusive, work faster, and design better.</p>
</blockquote>
<p><a href="https://matthewstrom.com/writing/feedback-revisited/#fnref1">How to get the best design feedback from your team || Matthew Ström: designer &amp; developer</a></p>
<h3><a href="#bonus-weird-links-from-wikipedia" aria-hidden="true" class="anchor" id="bonus-weird-links-from-wikipedia"></a>Bonus: Weird links from Wikipedia</h3>
<p>I had a folder of weird Wikipedia articles that I was saving… I pruned them and added some commentary. Enjoy!</p>
<h3><a href="#wikipediavital-articles---wikipedia" aria-hidden="true" class="anchor" id="wikipediavital-articles---wikipedia"></a>Wikipedia:Vital articles - Wikipedia</h3>
<p>I first encountered this as a &quot;curriculum&quot; and starting place for expanding on your education using a curious mind. Very interesting.</p>
<blockquote>
<p>Vital articles are lists of subjects for which the English Wikipedia should have corresponding featured-class articles. They serve as centralized watchlists to track the status of Wikipedia's most important articles. The very most important articles are in Level 1.</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/Wikipedia:Vital_articles">Wikipedia:Vital articles - Wikipedia</a></p>
<h3><a href="#list-of-lists-of-lists---wikipedia" aria-hidden="true" class="anchor" id="list-of-lists-of-lists---wikipedia"></a>List of lists of lists - Wikipedia</h3>
<p>When I first saved this link, it was the List of Lists. Wise information architect recognized that there were lists of lists that contained lists, so now there is this page.</p>
<blockquote>
<p>This is a list of lists of lists, a list of list articles that contain other list articles on the English Wikipedia. In other words, each of the articles linked here is an index to multiple lists on a topic. Some of the linked articles contain lists of lists, too.</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/List_of_lists_of_lists">List of lists of lists - Wikipedia</a></p>
<h3><a href="#list-of-crayola-crayon-colors---wikipedia" aria-hidden="true" class="anchor" id="list-of-crayola-crayon-colors---wikipedia"></a>List of Crayola crayon colors - Wikipedia</h3>
<p>Wikipedia's greatest secret is the glory of the &quot;Talk&quot; pages… I have never seen such hateful, ardent, and passionate argumentation as to what is the precise correct color codes and name on <em>this</em> page.</p>
<blockquote>
<p>Since the introduction of Crayola drawing crayons by Binney &amp; Smith in 1903, more than two hundred distinctive colors have been produced in a wide variety of assortments. The table below represents all of the colors found in regular Crayola assortments from 1903 to the present.[a] Since the introduction of fluorescent crayons in the 1970s, the standard colors have been complemented by a number of specialty crayon assortments, represented in subsequent tables.</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/List_of_Crayola_crayon_colors">List of Crayola crayon colors - Wikipedia</a></p>
<h3><a href="#wikipedialist-of-hoaxes-on-wikipedia---wikipedia" aria-hidden="true" class="anchor" id="wikipedialist-of-hoaxes-on-wikipedia---wikipedia"></a>Wikipedia:List of hoaxes on Wikipedia - Wikipedia</h3>
<blockquote>
<p>This is a list of known historical hoaxes created on Wikipedia. It is not for known hoaxes which are notable in their own right, such as Piltdown Man. Its purpose is to document hoaxes on Wikipedia, in order to improve our understanding of them and our ability to detect them. For the purpose of this list, a hoax is defined as a clear and deliberate attempt to deceptively present false information as fact. Libel, vandalism, and honest factual errors are not considered hoaxes. A hoax is considered notable enough for inclusion in this list if it evaded detection for more than one month or was discussed by reliable sources in the media. This list is incomplete, as many hoaxes remain undiscovered.</p>
</blockquote>
<p>While this is a fascinating read, this is also a good reason to <strong>not trust anything you read on wikipedia 100%</strong>.</p>
<p><a href="https://en.wikipedia.org/wiki/Wikipedia:List_of_hoaxes_on_Wikipedia">Wikipedia:List of hoaxes on Wikipedia - Wikipedia</a></p>
<h3><a href="#wikipediaunusual-articles---wikipedia" aria-hidden="true" class="anchor" id="wikipediaunusual-articles---wikipedia"></a>Wikipedia:Unusual articles - Wikipedia</h3>
<blockquote>
<p>Of the over six million articles in the English Wikipedia there are some articles that Wikipedians have identified as being somewhat unusual. These articles are verifiable, valuable contributions to the encyclopedia, but are a bit odd, whimsical, or something one would not expect to find in Encyclopædia Britannica.</p>
</blockquote>
<p>I love both the list of qualities required to be on this page, and the pages that this links to.</p>
<p>As with anything on the internet, there are some links to less than moral things on this page.</p>
<p><a href="https://en.wikipedia.org/wiki/Wikipedia:Unusual_articles">Wikipedia:Unusual articles - Wikipedia</a></p>
<h3><a href="#list-of-inventors-killed-by-their-own-inventions---wikipedia" aria-hidden="true" class="anchor" id="list-of-inventors-killed-by-their-own-inventions---wikipedia"></a>List of inventors killed by their own inventions - Wikipedia</h3>
<p>Closely linked to the Darwin Awards… but distinctly sad.</p>
<blockquote>
<p>This is a list of inventors whose deaths were in some manner caused by or related to a product, process, procedure, or other innovation that they invented or designed.</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/List_of_inventors_killed_by_their_own_inventions">List of inventors killed by their own inventions - Wikipedia</a></p>
<h3><a href="#mid-atlantic-accent---wikipedia" aria-hidden="true" class="anchor" id="mid-atlantic-accent---wikipedia"></a>Mid-Atlantic accent - Wikipedia</h3>
<p>I forgot where I first learned of this phenomena: a completely fictional accent that became relatively well-known.</p>
<blockquote>
<p>The Mid-Atlantic accent, or Transatlantic accent,[1][2][3] is a purposefully cultivated accent of English that blends together the most prestigious features of American and British English (specifically Received Pronunciation for the latter). Adopted in the early 20th century mostly by American aristocrats and Hollywood actors, it is not a native or regional accent; instead, according to voice and drama professor Dudley Knight, it is an affected set of speech patterns &quot;whose chief quality was that no Americans actually spoke it unless educated to do so&quot;.[4]</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/Mid-Atlantic_accent">Mid-Atlantic accent - Wikipedia</a></p>
<h3><a href="#talkquantum-suicide-and-immortality-difference-between-revisions---wikipedia" aria-hidden="true" class="anchor" id="talkquantum-suicide-and-immortality-difference-between-revisions---wikipedia"></a>Talk:Quantum suicide and immortality: Difference between revisions - Wikipedia</h3>
<p>This one is just weird, and largely persuaded me that taking ethics/morality into the quantum really befuddles the linear mind.</p>
<p>Thinking themselves wise…</p>
<blockquote>
<p>Just imagine all of the possible universes in your past in which you made a different decision and would still be alive and well today (although in different universes). The &quot;you&quot; that exists now is just one of infinitely possible copies of &quot;you&quot;. The &quot;me&quot; that is typing right now shares exactly the same history and continuity with the &quot;me&quot; that isn't typing this. At the same time, if it were ever possible for both copies to confront one another, I would not be able to get inside the head of my alternate self any more than I'd be able to get inside the head of any other being sharing a seperate existance in my reality (though my &quot;double&quot; would be a little more predictable).</p>
</blockquote>
<p><a href="https://en.wikipedia.org/w/index.php?title=Talk:Quantum_suicide_and_immortality&amp;curid=48693&amp;diff=509809817&amp;oldid=492007825">Talk:Quantum suicide and immortality: Difference between revisions - Wikipedia</a></p>
<h3><a href="#great-soviet-encyclopedia---wikipedia" aria-hidden="true" class="anchor" id="great-soviet-encyclopedia---wikipedia"></a>Great Soviet Encyclopedia - Wikipedia</h3>
<p>I first learned of this while learning about all the heroes of the defense of Leningrad who were later struck from this record. While a whimsical (and dark!) chapter of history, it's also a stark reminder of being careful who controls your source of truth. * cough * wikipedia moderators * cough *</p>
<blockquote>
<p>The Great Soviet Encyclopedia (GSE; Russian: Большая советская энциклопедия, БСЭ, Bolshaya sovetskaya entsiklopediya) is one of the largest Russian-language encyclopedias,[1] published by the Soviet Union from 1926 to 1990. After 2002, the encyclopedia's data was partially included into the later Bolshaya Rossiyskaya entsiklopediya (or Great Russian Encyclopedia) in an updated and revised form. The GSE claimed to be &quot;the first Marxist–Leninist general-purpose encyclopedia&quot;.[2]</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/Great_Soviet_Encyclopedia">Great Soviet Encyclopedia - Wikipedia</a></p> ]]></description>
    </item>
    <item>
       <title>Consolidating Multiple Lightroom Catalogs onto a NAS</title>
       <link>http://evantravers.com/articles/2020/07/22/consolidating-multiple-lightroom-catalogs-onto-a-nas/</link>
       <pubDate>Wed, 22 Jul 2020 10:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/22/consolidating-multiple-lightroom-catalogs-onto-a-nas/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/07/lightroom_transition.png"></p><p>I referenced in <a href="https://twitter.com/evantravers/status/1285761066769756160">a recent tweet</a> that I've been struggling with how to store my photography library. I have been researching, experimenting, and working on this for months now. I don't think I found a full guide for all this, so I decided to write it up so that maybe I can help one other person.</p>
<p>For years, I had simply been buying progressively bigger external hard drives… usually in pairs so that I would have a back up. After getting two cameras that shot 24MP and above… that strategy really got outpaced by the sheer volume of data my lovely wife shot this past fall.</p>
<p>In desperation, I eventually settled on a complicated &quot;multiple catalog&quot; scheme. I split out our family history photo Catalog on one 2TB drive, and putting each professional shoot in a new Catalog on subsequent drives as they filled up. This strategy allowed my wife and I collaborate on a shoot simply by passing the hard drive with the photos and Catalog on it.</p>
<p><strong>Some quick context</strong>: Lightroom's photo management has two parts: A Catalog file, and the photo files. The Catalog stores all the metadata and edits, and points to the photo files. For some reason, Lightroom won't accept Catalogs on network drives, but the photo files themselves can live on a network drive or NAS.</p>
<p>The &quot;multiple catalog&quot; strategy meant that I kept together each Project Catalog and its corresponding Photo Files in a folder on an external hard drive. While I couldn't search across my whole collection, but I could manage them in chunks… which at least let me make sure that each chunk had a backup on another drive. (This led to a crazy-making spreadsheet that listed each drive, each Project Catalog, and where it's backup was located, and how old that backup was… 🤦)</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/drives.jpg" alt="">
  <figcaption>
    <b>Some</b> of the drives that I have been juggling... it's a nightmare.
  </figcaption>
</figure>
<p>This all worked fine… until I ran out of room on the Family History Photo Catalog drive! I was faced with buying two more 5TB drives, one for the main and one for a periodic backup… and I realized that I would basically be in the price range of just buying a NAS like a Synology or a Drobo. (I wound up on a <a href="https://www.amazon.com/gp/product/B075MZTQBT/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1">Synology DS718+</a> and I like it, but there's lots of better resources comparing and selling different devices.) While I started saving, I started scheming how to move the diaspora Project Catalogs back to the promised land of a single source of truth…</p>
<p>It took a lot of experiments, researching videos and blog posts, but here's what I settled on.</p>
<p>We want to end up in a state with a <em>single</em> Main Catalog, pointing at files on the NAS. To accomplish this, we will first make sure all the files are safe on the NAS. Then we will individually point all the Catalogs at the files on the NAS. Finally, we will merge together the catalogs and ensure the data is safe.</p>
<hr />
<ol>
<li>
<p>Copy all the individual Catalogs to the NAS via USB.</p>
</li>
<li>
<p>Connect up the Synology to your working computer (network mount or whatever.)</p>
</li>
<li>
<p>For each Project Catalog, open it up. We are going to redirect this Project Catalog to the newly copied files on the NAS. Use <code>Update Folder Location…</code> from the folder on the original source (in my case, an external drive named LaCie) to the new location on the Synology.</p>
<p><img src="https://images.evantravers.com/articles/2020/07/update_folder_location.png" alt="Update Folder Location" /></p>
<p>Now your catalog has all the edits and metadata, but it's pointed away from your external drive to the network drive. 👍</p>
</li>
<li>
<p>Switch back to your Main Catalog. (I just used the entry in the <code>Open Recent…</code> menu.)</p>
<p><img src="https://images.evantravers.com/articles/2020/07/open_recent.png" alt="Switch to catalog" /></p>
</li>
<li>
<p>Select from the File menubar: <code>Import from Another Catalog…</code> and choose the Project Catalog you <em>just</em> updated that now points to photos on the Synology.</p>
<p><img src="https://images.evantravers.com/articles/2020/07/import_from_another_catalog.png" alt="Import from another catalog" /></p>
</li>
<li>
<p>For File Handling, choose <code>Add New Photos to Catalog Without Moving</code>.</p>
 <figure>
   <img src="https://images.evantravers.com/articles/2020/07/import_from_catalog.png" alt="import dialog">
   <figcaption>
     If you choose the option for moving the files, this import can take fifteen minutes… I think it compares each file over the network, and that's <em>very</em> slow. By choosing to take the photos where they are, the merged metadata from the newly re-pointed Project Catalog merges into your Main Catalog pointing at files on the NAS, <em>much</em> faster.
   </figcaption>
 </figure>
</li>
<li>
<p>Now that the Catalogs have merged, your File pane on the left should show the fact that you have multiple folders at play. You could leave it like this, but I wanted all my photos in one folder structure to make backup to online easier. Move the folder(s) into your desired folder structure.</p>
 <figure>
   <img src="https://images.evantravers.com/articles/2020/07/moving_files_on_disk.png" alt="move files">
   <figcaption>
     <ul>
       <li>If there are no conflicts (usually the case) it takes milliseconds.</li>
       <li>If there is a folder existing in that space, you can either rename the folder to something related to the shoot (John and Jane Doe's Wedding) or drag all the files over to the folder individually… but this will take much more time.</li>
     </ul>
   </figcaption>
 </figure>
</li>
<li>
<p>At this point, I usually make sure everything worked right. I'll typically right click on a photo in the Gallery and choose <code>Show in Finder</code> and <code>Show in Library</code> to ensure this photo is in the right folder on the filesystem and the right place in the Lightroom Library.</p>
<p><img src="https://images.evantravers.com/articles/2020/07/show_in_finder.png" alt="show in finder" /></p>
 <figure>
   <img src="https://images.evantravers.com/articles/2020/07/correct_path.png" alt="correct path">
   <figcaption>Looks like the file is on the Network Drive! Success!</figcaption>
 </figure>
</li>
<li>
<p>You can now safely remove the duplicate or empty folders in Lightroom Catalog.</p>
<p><img src="https://images.evantravers.com/articles/2020/07/remove_empty_folder.png" alt="remove empty" /></p>
</li>
<li>
<p>Obsessively check and re-check to make sure you aren't losing anything, then remove and clean up the old folders outside your new organized folder.</p>
</li>
</ol>
<hr />
<p><img src="https://media0.giphy.com/media/z23hGvopHu7w4/giphy.gif?cid=ecf05e47vafx64iaq263cmk1lqr9bi70zo91lqmckn2ay125&amp;rid=giphy.gif" alt="phew" /></p>
<p>Phew! We are done. Y'all would <em>not</em> believe the relief I felt when I merged the last one, clicked around, and knew for certain where all my data was and that it was on a redundant drive.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/finished.png" alt="correct path">
  <figcaption>That's a <em>lot</em> of photos.</figcaption>
</figure>
<p>Going forward, I will use a modified version of this process. Since the local SSD is faster than the network drive by a long shot, I'll work each shoot on a new Catalog local to that laptop. After I'm done, I'll use the merge workflow above to move all the files and merge the metadata into my Main Catalog.</p> ]]></description>
    </item>
    <item>
       <title>Migrating From Middleman to Another Static Site</title>
       <link>http://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/</link>
       <pubDate>Mon, 20 Jul 2020 11:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/20/migrating-from-middleman-to-another-static-site/</guid>
       <description><![CDATA[ <p>For about a year I've been flirting with leaving behind <a href="https://middlemanapp.com/">Middleman</a> and trying another <a href="https://www.staticgen.com/">static site generator</a>.</p>
<p>While I <em>still</em> haven't done it, I've been slowly documenting the hacks and tricks that build my current website, so that I'll be able to preserve the same URLs and such.</p>
<p>I've taken a couple of stabs at some of the other generators, usually by making a branch, deleting a bunch of code, and trying to hot-change out the underlying engine from middleman. It's fun and quick, but as soon as I want to write another blog post or make a change the branch falls behind. To combat this, I quickly threw together a migration script the other weekend.</p>
<p>The script isn't particularly clever, but I wanted to use it as an excuse to point out some good practices for migration style scripts.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># MIGRATION SCRIPT</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># ----------------</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># The purpose of this is to pull the content out of my existing site into a</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># format that makes sense for a new static site generator.</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># As it is taking me a while to decide which one I want to try, having</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># something that I can &quot;live&quot; update will be _very_ important.</span>
</div></code></pre>
<p>You should use comments... I know there's a lot of debate about whether code should document itself, but I often find that a one-file script doesn't have enough context to really document itself, so writing some pseudocode in comments can help guide your process.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fileutils</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">SRC</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">../evantravers.com/source</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">./content/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Reset</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">directory?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">remove_dir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkdir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>You should make your script repeatable and non-destructive. The above lines set a <code>SRC</code> and <code>DST</code> directory that are different... so any changes won't damage the <code>SRC</code>.</p>
<p>In addition, each time the script is run it deletes the whole generated folder. While this is &quot;expensive&quot; it reduces weird side effects that can cause confusion. (For instance, if I change the format of a filename, then I could end up with two versions of the same file.)</p>
<p>Really, if you do <em>anything</em>, do that. You will thank me someday.</p>
<p>The rest of the script does some massaging and renaming of files to remove some of the Middleman specific naming and formatting.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Middleman requires some weird naming conventions... it&#39;d be nice to be able</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># to remove those.</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clean_filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">basename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.html</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.markdown</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Move over the articles</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># URL format: /articles/YYYY/MM/DD/slugified-title/</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkdir_p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Dir</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">glob</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">SRC</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/articles/*.&lbrace;md,markdown&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">parse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%m</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mkdir_p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">copy_file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clean_filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>This is the bulk of the work... I just wanted bare markdown files in a directory structure that matched some of the static generators I've been looking at.</p>
<p>Middleman generates articles (<code>middleman article &quot;&lt;name of article&gt;&quot;</code>) in your configured location for articles with the filename of <code>YYYY-MM-DD-slugified-name-of-article.html.markdown</code>.</p>
<p>I have <em>no</em> clue why the <code>.html.markdown</code>, I think it's a remnant of some parser or other. I would prefer to store my content with a simple <code>.md</code>, so that's what I do here.</p>
<p>In the end, the above code transforms:</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2020</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">07</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">20</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">migrating</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">middleman</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">another</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">static</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">site</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">html</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">markdown</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span>
</div></code></pre>
<p>to</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2020</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">07</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">├──</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">20</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└──</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">migrating</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">middleman</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">another</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">static</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">site</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">md</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">│</span>  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">└</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span>
</div></code></pre>
<p>The best part... if I ever change my mind, I can adjust the script and the name and folders will change appropriately. 👌</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Move over the images</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># URL format: standard (based on folder)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp_r</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">SRC</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">https://images.evantravers.com/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Pretty boring call out to <code>cp -r</code> here... only note is the consistent use of <code>DST</code> constant to avoid mistakes.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Move special essays and pages</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># URL format: /name-of-file/</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">git.html.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">about-me.html.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">humans.txt</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">thanks.html.md</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">special</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">copy_file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">SRC</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">special</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clean_filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">special</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># Move over style assets</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># These are currently .scss files</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">FileUtils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp_r</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">SRC</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">css</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">DST</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">style</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>I don't want to grab <em>every</em> file that Middleman uses, so I specifically grab some content files that I would want to bring over to a new site. I can use my same <code>clean_filename</code> method to remove that weird <code>.html.md</code> file extension.</p>
<p>This script is pretty ugly and foolish, and you could write or re-write this in any language that you choose, but I wanted to point out these basic principles: Make it non-destructive and make it repeatable. Because of these principles, the next time I run the script (after this post!) my experimental playground for new static site generators will be automatically updated with this very post, cleaned up and placed in the right folder. 👍 If there are any useful scripting principles that I missed, feel free to reach out on twitter, and I'll consider including them.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I've got a post about a migration script for plain-text notes to Zettelkasten format that will go into this more deeply. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Outcomes Over Outputs</title>
       <link>http://evantravers.com/articles/2020/07/09/outcomes-over-outputs/</link>
       <pubDate>Thu, 09 Jul 2020 11:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/09/outcomes-over-outputs/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/07/outcomes_over_outputs.png"></p><p>After reading Lean UX<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> I became convinced of the immense power of describing work to be done in terms of &quot;outcomes over outputs.&quot; It seemed a crystal clear distinction when I was sitting in the classroom discussing it with others who had just finished the book as well… but I've found it a challenging concept to convey to someone who has not been seriously studying it.</p>
<p>Imagine with me that you are in your kitchen with someone who is waiting for your direction. There are a couple ways you could give direction to your little team… and hopefully I'll be able to persuade you why you may want to consider leading with <em>outcomes</em> over <em>outputs</em>.</p>
<blockquote>
<ol>
<li>Make a peanut-butter and jelly sandwich.</li>
</ol>
</blockquote>
<p><img src="https://images.evantravers.com/articles/2020/07/sandwich.png" alt="sandwich making instructions" /></p>
<p>This is a description of a straightforward <em>output</em>. You just told the person what to do. No creativity or initiative required of your team.</p>
<blockquote>
<ol>
<li>Take two pieces of bread.</li>
<li>Cover one with peanut butter.</li>
<li>Cover the second with jelly.</li>
<li>Place the two halves together.</li>
</ol>
<p>The final outcome of these actions is a peanut butter sandwich.</p>
</blockquote>
<p>If you were shooting for giving your team an outcome… this is short of the mark. An output prescribes the way the goal is accomplished. Here you are describing what to do, and how to do it. A true outcome is a measurable set of goal criteria… that <em>doesn't</em> specify the output.</p>
<blockquote>
<p>I'm hungry for two pieces of bread, with peanut butter and jelly in the middle. I, a user, would be pleased if you combined these somehow.</p>
</blockquote>
<p>Closer… we are getting further towards describing a desired user outcome, but you are still cheating and prescribing an <em>output</em>. Try again.</p>
<blockquote>
<p>I'm hungry, and I need to eat sometime in the next hour before my next meeting. I'm allergic to shellfish, but otherwise have no dietary requirements. Here's what is in the pantry, and here's a history of what I've liked and disliked for lunch in the past.</p>
</blockquote>
<p>Finally… this is describing a user <em>outcome</em>: a set of measurable success criteria with some optional boundary conditions. When the user is no longer hungry and enjoys their meal… then the mission is accomplished. There is not a specified thing to make or task to be done, instead you describe a measurable set of success criteria, leaving your team free to creatively solve within those boundaries.</p>
<p>Why is this important?</p>
<p><strong>It depends on who is standing in the kitchen with you.</strong> Is it a 5-year old, or a Michelin-rated chef?</p>
<p><img src="https://images.evantravers.com/articles/2020/07/cordon_bleu.png" alt="sandwich making instructions" /></p>
<p>Carefully detailing the steps for making a peanut butter sandwich makes <em>perfect</em> sense if you are working with a 5-year old… but if you are working with a talented chef you are preventing yourself from getting the best possible output by restricting the output's description up front.</p>
<p>If you are leading your product team by prescribing outputs, you are currently asking for a PB&amp;J when <em>you could be having the best meal of your life</em>.</p>
<p>It makes <em>no</em> sense to specify a restricted output if you trust the people around you to provide creative value and diverse perspectives. If you specify an output instead of an outcome, you rob yourself of the opportunity of a better result than you could imagine alone. Worse, you insinuate that you don't trust your team's ability to solve problems.</p>
<p>Next time you are cooking something up in your product reflect what you are telling your team by what you are prescribing, and seriously consider experimenting with describing work to be done as an outcome instead of an output.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Jeff Gothelf, Josh Seiden. <em>Lean UX</em>. &quot;O'Reilly Media, Inc.&quot;, 2013. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Implementing a Blog Series in Middleman</title>
       <link>http://evantravers.com/articles/2020/07/06/implementing-a-blog-series-in-middleman/</link>
       <pubDate>Mon, 06 Jul 2020 21:29:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/06/implementing-a-blog-series-in-middleman/</guid>
       <description><![CDATA[ <p>While working on my <a href="/articles/series/hammerspoon-headspace">hammerspoon series</a>, I decided it was a good time to refactor how I related a series of blog posts. Over the past year or two, I've found myself doing a series of shorter posts rather than one long <em>monster post</em>.</p>
<p>I first implemented this for my series on Git Gud at Vim. I simply used a markdown comment that I copy pasted at the top of every post, and a tag <code>git-gud-vim</code> that I used to link them all together. It worked just fine, and I did the same for the World of Textfiles posts.</p>
<p>While working on the Hammerspoon Headspace series, I wanted to do a little more styling, and realized quickly that I probably could do something a little more comprehensive. Still using tags, I just wrote some custom logic conditional on a tag that started with <code>series-</code>. If a post had a tag prefixed with <code>series-</code>, it'd look in a folder for a partial named the same way and include it.</p>
<p>This was of course a dreadful kluge, but it got me a single partial I could use in several places… so every post could be updated all at the same time.</p>
<p>Eventually I dug further into middleman's docs and found their <a href="https://middlemanapp.com/basics/blogging/#custom-article-collections">custom collections feature</a>. This meant that I could create  custom YAML attribute and fire off some logic <em>much</em> more simply.</p>
<p>First initialize the custom collection…</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activate</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:blog</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag_template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag.html</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calendar_template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calendar.html</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">custom_collections</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/series/&lbrace;series&rbrace;.html</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/articles/series/show.html</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Now I just built a quick helper in config.rb to grab the content from the partial. There may be a better way to do this… but this worked.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series_header</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is_index</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">header</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is_index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;h1&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/h1&gt;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">header</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="5">    &lt;div class=&quot;article__series&quot;&gt;
</div><div class="line" data-line="6">      </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">partial</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">articles/series/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slugify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="7">      &lt;div class=&quot;blog__tags&quot;&gt;
</div><div class="line" data-line="8">        &lt;span class=&quot;emoji&quot;&gt;🗂&lt;/span&gt;
</div><div class="line" data-line="9">        &lt;a href=&quot;/articles/series/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slugify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&gt;
</div><div class="line" data-line="10">          </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">series</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="11">        &lt;/a&gt;
</div><div class="line" data-line="12">      &lt;/div&gt;
</div><div class="line" data-line="13">    &lt;/div&gt;
</div><div class="line" data-line="14">    </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Now I can use this on the <a href="/articles/series/git-gud-at-vim">series show page</a>, the <a href="/articles/series/">series listing page</a>, or any <a href="http://evantravers.com/articles/2020/06/19/hammerspoon-headspace/">single page in a series</a>… I can update the series display, or the content, and it updates <em>everywhere</em>.</p>
<p>I love being able to build my website into <em>whatever</em> I want… hopefully even if I leave <a href="http://middlemanapp.com/">middleman</a> I can take the content I wrote for the series headers with me.</p> ]]></description>
    </item>
    <item>
       <title>Automating My Weekly Review in Things.app</title>
       <link>http://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/</link>
       <pubDate>Sun, 05 Jul 2020 11:44:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/05/automating-my-weekly-review-in-things-app/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/07/example_weekly_review.png"></p><div class="admonition update">
<p>If you want a crossplatform version of this I've built <a href="https://evantravers.com/articles/2023/01/27/weekly-reviews-in-things-app-using-shortcuts/">a version using Shortcuts</a>.</p>
</div>
<p>For the past couple of months, I've adopted a weekly review ritual to help me stay in tune with my work and not be overwhelmed. I structured the original format from Peter Akkies's comprehensive review template for Things, but I have since modified it for my purposes.</p>
<p>The crux of Peter's review template is a helpful series of questions that you ask yourself for each Project in your Things.app account.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/former_weekly_review.png" alt="">
  <figcaption>
    This is what my Weekly Review repeating to-do used to look like. Pretty overwhelming, right?
  </figcaption>
</figure>
<p>The first iteration of this involved a repeating task with a giant text note with all the steps. For each Project in Things.app, I had to jump over to the Project, answer each question, then go to the next Project and repeat. To shorten the loop, I would open the repeated task in one window, and have another window to do the actual review.</p>
<p>Things does not really want you to use more than one window, and it's a little difficult to set it up, so I wrote some Hammerspoon lua code that sets up my favorite window setup. (Pictured at the top of the article.)</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launchOrFocusByBundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Hide Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allWindows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">v</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">v</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">close</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;New Things Window&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;New Things Window&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">findMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Show Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Show Sidebar&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">selectMenuItem</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Anytime&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Anytime&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">primaryScreen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left70</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">primaryScreen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right30</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/4a743367871e56a6971566621ac635c09fb32ea7/spaces/review.lua#L11-L34">review.lua</a>)</p>
<p>This was a <strong>huge</strong> time-saver, but there still were problems. I had trouble &quot;resetting&quot; my brain to address each Project with the same questions. Without a checklist I found I was easily distractable and the whole process easily took an hour or two.</p>
<p>Finally, enough was enough. I rolled up my sleeves, pulled up <a href="https://culturedcode.com/things/support/articles/2803573/">@culturedcode's documentation</a>, and spent some quality hours in Apple's Script Editor to write the following. (It's long, so I'll break it up into sections.)</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datestamp</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toLocaleDateString</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;en-US&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">review_proj</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;project&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;operation&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;create&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`Weekly Review: $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">datestamp</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;notes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;tags&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Rituals&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;when&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;today&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div></code></pre>
<p>I want to build a Things project for the Weekly Review ritual. All my &quot;ritual&quot; type projects/to-dos have the &quot;Rituals&quot; tag, so I add that tag and assign it to &quot;Today&quot;. I start to build the Weekly Review Project as a JSON object… and soon I'll add some <code>items</code> to it for the to-do actions.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1">
</div><div class="line" data-line="2">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;items&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;heading&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Prep&quot;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div></code></pre>
<p>I <em>love</em> Things.app's headings feature, and I make quite a bit of use of it in this automation. Here's one for the &quot;Prep&quot; part, then the following to-dos.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;to-do&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;📓: Review journal.&quot;</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;to-do&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;✅: What did you accomplish?&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;notes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=logbook&quot;</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">...</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="16">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;to-do&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="18">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Process your Things inbox. Assign each task to an area or to a project. Tag appropriately. (:estimate, $focus, !categorize, priority)&quot;</span>
</div><div class="line" data-line="19">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="21">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="22">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;to-do&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="23">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="24">          <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Go through each of your projects. Use the checklists below.&quot;</span>
</div><div class="line" data-line="25">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="26">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="27">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="28">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="30">
</div></code></pre>
<p>The first things added to the Weekly Review project are the initial setup actions… reminders to gather all the sources of to-dos, review and prepare.</p>
<p>Now it's time to gather all the projects to review! I wanted to build Peter's checklist as a to-do for all the Projects currently active in my Things.app, something like the following:</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/single_project.png" alt="">
  <figcaption>
    With this system, I at least have a checklist to go through for each project!
  </figcaption>
</figure>
<p>Let's build it!</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Things&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  for <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">area</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">areas</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">review_proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>&quot;<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span>&quot;<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>&quot;<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">items</span>&quot;<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">heading</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;, &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace; &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; + area.name() &rbrace; &rbrace;,
</div><div class="line" data-line="7">    )
</div><div class="line" data-line="8">    for (proj of Things.projects().filter(p =&gt; p.area() != null &amp;&amp; p.area().id() === area.id())) &lbrace;
</div><div class="line" data-line="9">      if (proj.status() == &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">open</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; ) &lbrace;
</div><div class="line" data-line="10">        review_proj[&quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;][&quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">items</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;].push(
</div><div class="line" data-line="11">        &lbrace;
</div><div class="line" data-line="12">          &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="13">          &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="14">            &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Review</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; + proj.name(),
</div><div class="line" data-line="15">            &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">//</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show?id</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>&quot; + proj.id(),
</div></code></pre>
<p>Now I'm using Things.app's JXA/Applescript dictionary to loop through Things.app internal database. First I loop through the <code>Things.areas()</code> so that I can split up the Projects by area, then for each Project in <code>Things.projects()</code> I add the checklist of questions from Peter Akkie's worksheet (with some modifications for my purposes, shortened for this post.):</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">            <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;checklist-items&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">            <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">              <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">checklist</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">item</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="4">              &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="5">                &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">still</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">relevant?</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="6">              &rbrace;
</div><div class="line" data-line="7">            &rbrace;,
</div><div class="line" data-line="8">            &lbrace;
</div><div class="line" data-line="9">              &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">checklist</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">item</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="10">              &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="11">                &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Can</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">I</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">delegate</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project?</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="12">              &rbrace;
</div><div class="line" data-line="13">            &rbrace;,
</div><div class="line" data-line="14">            &lbrace;
</div><div class="line" data-line="15">              &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">checklist</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">item</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="16">              &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="17">                &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Should</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">I</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">move</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Someday?</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="18">              &rbrace;
</div><div class="line" data-line="19">            &rbrace;,
</div><div class="line" data-line="20">            [...]
</div><div class="line" data-line="21">            &lbrace;
</div><div class="line" data-line="22">              &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">checklist</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">item</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="23">              &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="24">                &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">there</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clear</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;next action&#39;</span> for <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project?</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">If</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">break</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">down</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">your</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">into</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">smaller</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span> until <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">there</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">clear</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">next</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">action</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>&quot;
</div><div class="line" data-line="25">              &rbrace;
</div><div class="line" data-line="26">            &rbrace;
</div><div class="line" data-line="27">            ]
</div><div class="line" data-line="28">          &rbrace;
</div><div class="line" data-line="29">        &rbrace;
</div><div class="line" data-line="30">        )
</div><div class="line" data-line="31">      &rbrace;
</div><div class="line" data-line="32">    &rbrace;
</div><div class="line" data-line="33">  &rbrace;
</div></code></pre>
<p>Now that I'm done looping through the Projects, it's time to add the last actions related to the &quot;Planning&quot; time of the Weekly Review.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">review_proj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;attributes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;items&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">heading</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;, &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace; &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Plan</span>&quot; &rbrace; &rbrace;,
</div></code></pre>
<p>I add another heading to the <code>items</code>, and then the remaining to-dos.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="3">    &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="4">      &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Identify</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">what’s</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">due</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">soon</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Use</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Upcoming</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">view</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="5">    &rbrace;
</div><div class="line" data-line="6">  &rbrace;,
</div><div class="line" data-line="7">  &lbrace;
</div><div class="line" data-line="8">    &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="9">    &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="10">      &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Identify</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">which</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">are</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">available</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">you</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">work</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Use</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Anytime</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">view</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="11">    &rbrace;
</div><div class="line" data-line="12">  &rbrace;,
</div><div class="line" data-line="13">  &lbrace;
</div><div class="line" data-line="14">    &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="15">    &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="16">      &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Plan</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">what</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">work</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">next</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Assign</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">“when”</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">dates</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">as</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">you</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">learned</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">the</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">section</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">planning</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">your</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">days</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">weeks</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Choose</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">important</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tasks</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">as</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">well</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">as</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urgent</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ones</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="17">    &rbrace;
</div><div class="line" data-line="18">  &rbrace;,
</div><div class="line" data-line="19">  &lbrace;
</div><div class="line" data-line="20">    &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="21">    &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="22">      &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">🖊</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Build</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spread</span> for <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">next</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">week</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="23">    &rbrace;
</div><div class="line" data-line="24">  &rbrace;,
</div><div class="line" data-line="25">  &lbrace;
</div><div class="line" data-line="26">    &quot;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">type</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;,
</div><div class="line" data-line="27">    &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attributes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &lbrace;
</div><div class="line" data-line="28">      &quot;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">⭐️</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">What</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">essential</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">next</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">week?</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;
</div><div class="line" data-line="29">    &rbrace;
</div><div class="line" data-line="30">  &rbrace;
</div><div class="line" data-line="31">  )
</div><div class="line" data-line="32">  let url = &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">things</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">//</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">json?data</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; + encodeURIComponent(JSON.stringify([review_proj]));
</div><div class="line" data-line="33">  return url;
</div><div class="line" data-line="34">&rbrace;)();
</div><div class="line" data-line="35"></span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/2456c5efbdb06e6261eacbc7f8d7b1e4c90e97d7/spaces/weekly_review.lua#L11-L218">weekly_review.lua</a>)</p>
<p>That's it! You can take the <a href="https://github.com/evantravers/hammerspoon-config/blob/2456c5efbdb06e6261eacbc7f8d7b1e4c90e97d7/spaces/weekly_review.lua#L11-L218">whole JXA script</a>) from me and deploy it however you want, but I use it as part of my <a href="http://evantravers.com/articles/series/hammerspoon-headspace">Hammerspoon Headspace</a> script:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildThingsProjectUrl</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">osascript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">javascript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[
</div><div class="line" data-line="3">        (function() &lbrace;
</div><div class="line" data-line="4">           … (the JXA code above) …
</div><div class="line" data-line="5">        &rbrace;)()
</div><div class="line" data-line="6">    ]]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buildThingsProjectUrl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ok</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;something wrong with the jxa to build a review project.&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>When I enter the Headspace, the JXA is run and the result is set to <code>url</code>, which I then open using <code>hs.urlevent.openURL()</code>. While I was troubleshooting the script, I made heavy use of Apple's Script Editor to debug because Hammerspoon kind of eats the JXA errors. If you want to see the whole thing in context, you can look <a href="https://github.com/evantravers/hammerspoon-config/blob/4a743367871e56a6971566621ac635c09fb32ea7/spaces/weekly_review.lua">here</a>.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/weekly_review_overview.png" alt="">
  <figcaption>The finished review: Prep, Projects, Planning, all separated by Headers and with appropriate checklists.</figcaption>
</figure>
<p>This fulfills a lot of my goals: the last few weekly reviews that I've timed have decreased from two hours to around 30 minutes, mostly because I don't lose my place. 😛 I also have started taking notes on the week in the notes of the individually created Projects, so that I can actually go look at last week's lessons in the Logbook by searching for &quot;Weekly Review.&quot; It <em>is</em> dependent on being on my desktop, I don't believe there is anyway for the JXA to work on iOS.</p>
<p>Not having a structured review was one of the main reasons that I have been tempted by the siren-call of Omnifocus. While this is a hack, and certainly one that is a little programmer-specific, it's enough to make me stay with Things.app for a while longer.</p>
<figure>
	<img src="https://images.evantravers.com/articles/2020/07/services.png">
	<figcaption>You can use the script without any coding thanks to Automator!</figcaption>
</figure>
<p>If you would like to use this script, and you aren't much of a coder, I've wrapped it in an Automator Service. You just <a href="https://images.evantravers.com/articles/2020/07/Weekly%20Review.zip">download the Service</a>, run it and it'll install in the Services menu of your Things.app.<sup class="footnote-ref"><a href="#fn-urls" id="fnref-urls" data-footnote-ref>1</a></sup> 👍</p>
<p><a href="/contact">Let me know</a> if you find this useful, or if you have something that you want changed for your particular use case. 🙏</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-urls">
<p>You may also have to set Enable Things URLs in the Settings.
<img src="https://images.evantravers.com/articles/2020/07/things_url.png" alt="things pref pane" /> <a href="#fnref-urls" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: June</title>
       <link>http://evantravers.com/articles/2020/07/01/books-and-links-june/</link>
       <pubDate>Wed, 01 Jul 2020 07:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/07/01/books-and-links-june/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/07/flowers.jpg"></p><p>The cicadas in our yard have been proclaiming the arrival of Summer... I joke that in Alabama, the temperature of summer follows the same curve as the cicadas scream... slow for a bit, then escalating quickly. God has been good to my little family. While there is much in the world to break our hearts or create fear, when I surrender my anxiety and throw my trust on Him, this season is sweet indeed.</p>
<p>On the creativity front, lots of <a href="/articles/2020/06/">posts written this month</a>... some random updates on ongoing projects:</p>
<p>I'm still happily hacking away on my <a href="/articles/series/hammerspoon-headspace/">headspace project</a>. Just today I finally <a href="https://github.com/evantravers/hammerspoon-config/commit/285703adb2d86925b63f115b93208ebf1a9061ae">fixed the v2 version</a>... now it reliably blocks an app no matter where it's launched! I'm going to live in it for a while, then I'll do an update post once I've been using it a bit longer.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/07/zettels.png" alt="A visualization depicting the links between notes.">
  <figcaption>My zettelkasten grows... the constellation in the center is that which is linked up, and all the years of unlinked notes are floating around.</figcaption>
</figure>
<p>I'm also still working on my zettelkasten. I'm playing with <a href="https://obsidian.md">obsidian.md</a>... and I think with a few tweaks it'll do perfectly. I've finished (I think!) the transition from plain text notes to zettel, I'm working on writing that up too.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I need to get back in the habit of reading again... I'm working on and off on a couple... but I've been doing more blog/web reading.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#building-a-lego-powered-submarine-20---magnetic-couplings---youtube" aria-hidden="true" class="anchor" id="building-a-lego-powered-submarine-20---magnetic-couplings---youtube"></a>Building a Lego-powered Submarine 2.0 - magnetic couplings - YouTube</h3>
<p>This <em>utterly</em> delighted me today when I saw it.</p>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/MdfUSNzc0Xk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://www.youtube.com/watch?v=MdfUSNzc0Xk&amp;feature=youtu.be">Building a Lego-powered Submarine 2.0 - magnetic couplings - YouTube</a></p>
<h3><a href="#case-study-analyzing-notion-app-performance--perfperfperf" aria-hidden="true" class="anchor" id="case-study-analyzing-notion-app-performance--perfperfperf"></a>Case study: Analyzing Notion app performance · PerfPerfPerf</h3>
<p>Incredibly detailed analysis of a 3rd-party application from a performance perspective. Recommended read if you are interested in working on the performance of your application.</p>
<blockquote>
<p>But if you’re building a software product, chances are you’re relatively unaffected. And in this case, having a quick app is more important than ever. Internet is slowing down due to increased demand, and people are holding on to their phones for longer – so if your app is slow, your users will be affected by it.</p>
<p>And slow app means worse business.</p>
</blockquote>
<p><a href="https://3perf.com/blog/notion/">Case study: Analyzing Notion app performance · PerfPerfPerf</a></p>
<h3><a href="#what-happened-to-the-webmaster---the-history-of-the-web" aria-hidden="true" class="anchor" id="what-happened-to-the-webmaster---the-history-of-the-web"></a>What Happened to the Webmaster - The History of the Web</h3>
<blockquote>
<p>Which brings us to ownership, that fundamental quality of a web creator we have lost over the years. The web is simply too big and monolithic for any person to know how any complex website works in its entirety. And even with smaller sites, the web has matured to a point where it’s perfectly plausible for a website to change hands many times over.</p>
</blockquote>
<p><a href="https://thehistoryoftheweb.com/postscript/what-happened-to-the-webmaster/">What Happened to the Webmaster - The History of the Web</a></p>
<h3><a href="#tradeoffs-and-shifting-complexity---daverupertcom" aria-hidden="true" class="anchor" id="tradeoffs-and-shifting-complexity---daverupertcom"></a>Tradeoffs and Shifting Complexity - daverupert.com</h3>
<p>Some wisdom from Mr. Rupert. There is nothing perfect, there is only moving the pain from one are to another.</p>
<blockquote>
<p>If that sounds a lot like modern day Front-end Development, you already see where I’m going with this. Not much has changed since Tesler’s day, code runs on either the client or the server. Thankfully today we have a few more levers to pull like “The Edge”, but the principle still applies; you get “advances” by shifting where the complexity lives. There’s good technical nuance, but most of the web’s fresh #hotdrama gets reduced to this for me.</p>
</blockquote>
<p><a href="https://daverupert.com/2020/06/tradeoffs-and-shifting-complexity/">Tradeoffs and Shifting Complexity - daverupert.com</a></p>
<h3><a href="#accessible-to-some---manuel-matuzović" aria-hidden="true" class="anchor" id="accessible-to-some---manuel-matuzović"></a>Accessible to some - Manuel Matuzović</h3>
<p>This is <em>awesome</em>. A simulation of what it's like to visit a site that's designed to be accessible for people with capabilities you don't have. Most of the time it's unsighted people trying to use sighted websites, here's a 100% &quot;sighted accessible&quot; site that's 100% unusable.</p>
<blockquote>
<p>I guess that most of you could not access all the information. How does that feel? Especially with my b------ justifications. Pretty bad, right? Now imagine having a similar experience on most websites you visit. That’s not just annoying and troublesome, but it makes you angry and sad.</p>
<p>Please remember how this experience made you feel every time you work on a new website, page, or component. Make your websites accessible to all, not just to some.</p>
</blockquote>
<p><a href="https://www.matuzo.at/blog/accessible-to-some/">Accessible to some - Manuel Matuzović</a></p> ]]></description>
    </item>
    <item>
       <title>Things Quick Tip: Keyboard Shortcuts for Tags</title>
       <link>http://evantravers.com/articles/2020/06/23/things-quick-tip-keyboard-shortcuts-for-tags/</link>
       <pubDate>Tue, 23 Jun 2020 13:55:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/23/things-quick-tip-keyboard-shortcuts-for-tags/</guid>
       <description><![CDATA[ <p>Things allows you to <a href="https://culturedcode.com/things/mac/help/keyboard-shortcuts/">assign keyboard shortcuts</a> to Tags.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/things_tags.png" alt="">
  <figcaption>
    <ol>
      <li>Bring up the tag manager with <code>⌘⌃T</code></li>
      <li>Notice the little boxes to the right? Click in one and press a key. Tada!</li>
    </ol>
  </figcaption>
</figure>
<p>This adds two bindings:</p>
<ol>
<li>
<p>With a task highlighted and press <code>⌃+&lt;key&gt;</code>, Things.app will <em>toggle</em> that tag on and off.</p>
</li>
<li>
<p>On any view, you can press <code>⌃⌥+&lt;key&gt;</code> and Things.app will <em>filter</em> that view to that tag.</p>
</li>
</ol>
<p>I tend to not set <em>tons</em> of these, because they conflict with my beloved <a href="http://evantravers.com/articles/2019/04/03/my-keyboard-setup/#osx-readline">Readline shortcuts</a>. I do use it for three tags: <code>Essential</code>, which is just that. <strong>The One Thing</strong> that I need to do that day. I also have bindings for tags I use for Focus level: <code>$High</code> and <code>$Low</code>.</p>
<p>I use the &quot;toggle a tag&quot; binding infrequently now. I typically handle all the tags at once in the inbox at the end of the day… and <a href="https://twitter.com/culturedcode">@culturedcode</a> added the feature where you can select multiple items and press <code>⌘⇧+T</code> to tag multiple to-dos.</p>
<p>The <code>⌃⌥+&lt;key&gt;</code> filtering shortcut is still <em>very</em> helpful, but increasingly I lean on using <a href="https://github.com/evantravers/hammerspoon-config/blob/a85100b1389b10c83a9e63eb279a2c83561b1784/spaces/deep.lua#L11">x-callback-urls to build filtered views</a> for certain kinds of tasks.</p> ]]></description>
    </item>
    <item>
       <title>Introducing Headspace</title>
       <link>http://evantravers.com/articles/2020/06/19/hammerspoon-headspace/</link>
       <pubDate>Fri, 19 Jun 2020 09:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/19/hammerspoon-headspace/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/06/headspace_ui.png"></p><p>I am <em>very</em> excited about this post... I'm pretty sure that I've been working on it alongside the name-sake tool for a straight month.</p>
<p>Headspace has been the title of this series, and it's what I call the last automation in this series. Let's jump straight into it with a demo.</p>
<figure>
  <video src="https://images.evantravers.com/articles/2020/06/headspace_demo.mp4"
         controls=controls
         poster="https://images.evantravers.com/articles/2020/06/headspace_demo.png"></video>
  <figcaption>If you want to share this video with someone, <a href="https://www.youtube.com/watch?v=cvH3KC7eYUs">it's on youtube</a>.</figcaption>
</figure>
<p>Here's what Headspace offers:</p>
<ul>
<li>Fully configurable for you and your work-style.</li>
<li>Define workspaces for your important work:
<ul>
<li>Launch relevant applications and quit distracting applications based on tags.</li>
<li>Block distracting <a href="/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">hyper.lua</a> shortcuts to protect focus.</li>
</ul>
</li>
<li>Toggl.com tracking presets per space… or a custom input at any time.</li>
</ul>
<p>I've been using Headspace daily for about a month. I <strong>love</strong> it. I am sure that you could create something very similar using a variety of automation tools. Build your own version or <a href="https://github.com/evantravers/hammerspoon-config/blob/40863179f918c1fa1379b4bc2dde588fb50ebc41/headspace.lua">clone mine</a>!</p>
<h2><a href="#how-headspace-came-to-be" aria-hidden="true" class="anchor" id="how-headspace-came-to-be"></a>How Headspace Came to Be</h2>
<p>After writing <a href="/articles/2020/06/12/hammerspoon-handling-windows-and-layouts/#split-screen-easily">the &quot;split window&quot; function</a>, I realized there were window layouts I preferred for specific tasks… starting with my daily review in Things 3, but also my daily standup.</p>
<p>To have an idea of the complexity of one of these tasks: Every work weekday at 4:30p in order to perform my Daily Review…<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></p>
<ol>
<li>I close all distracting apps by running &quot;quitall&quot; in Alfred.</li>
<li>I start a timer using Toggl.app, I choose &quot;Planning&quot; as the project and type in &quot;Review&quot; as the description.</li>
<li>I launch Things and Drafts using hyper.lua hotkeys.</li>
<li>I setup the first Things window:
<ul>
<li>Move to right 30% (<code>HYPER+M,T</code>)</li>
<li>Hide its sidebar (<code>CMD+/</code>)</li>
<li>Go to Today (<code>CMD+F, tod, &lt;return&gt;</code>).</li>
</ul>
</li>
<li>I open a second Things window (<code>CMD+OPT+N</code>).</li>
<li>I setup the work Things window:
<ul>
<li>Move to left 70% (<code>HYPER+M,R</code>)</li>
<li>Show its sidebar (<code>CMD+/</code>)</li>
<li>Go to Anytime (<code>CMD+F, any, &lt;return&gt;</code>).</li>
</ul>
</li>
<li>I then follow the checklist in the right window to do the work in the left window.</li>
</ol>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/daily_review.png" alt="screenshot of a sample daily review">
  <figcaption>
    <p>This is how I like to conduct my daily review... I have the To-do with a checklist for the ritual itself on the right, and I work in the pane to the left as I work through the checklist.</p>
  </figcaption>
</figure>
<p>That's a lot of steps! <em>Every day!</em> 😰</p>
<p>In early May, I <a href="https://github.com/evantravers/hammerspoon-config/commit/5119ec73a67a1e6527adac0240a534c050a290c6">started to write a simple &quot;layout chooser&quot;</a>. I started with a <code>hs.chooser</code>, and just had it wired to functions that moved around windows and set up the windows in my workspace the way I wanted it. I realized that since I'm writing a function for a specific task, then I <em>know</em> the time tracking data for that task. I could automate my time tracking as well! I wrote the first curl-based version of my <a href="/articles/2020/06/13/hammerspoon-toggl-api-calls-and-secret-tokens/">toggl.lua</a> script and threw a <code>toggl.start()</code> call in the setup function.</p>
<p>Within a couple minutes or hacking, I had a button than when pressed could rearrange my computer into one of two &quot;scenes,&quot; which immediately set up my workspace and <em>started the correct toggl timer</em>. I pressed one key, chose my task, and <strong>started to work</strong>.</p>
<p><img src="https://i.giphy.com/media/tBb19eTTI6Kgj44KtmE/giphy.webp" alt="game changer gif" /></p>
<p>I realized that choosing a space was a statement of intentionality. Headspace had become a tool that cleared the space for me to focus on my intent, and automatically removed obstacles.</p>
<p>I had been really interested in the idea or having different spaces for productivity, since I had seen <a href="https://www.youtube.com/watch?v=snAhsXyO3Ck">Spaceship You</a> and heard CGP Grey's additional commentary on the topic in <a href="https://www.relay.fm/cortex/102">Cortex Ep. 102</a>.</p>
<p>As <a href="/articles/2020/06/13/hammerspoon-toggl-api-calls-and-secret-tokens/">I already was copying Grey's use of toggl</a> to track my whole work day, I realized I could build a tool of spatial intentionality. Removing distraction, staying focused, and tracking how much time I spend moving the needle.</p>
<p>I started adding entries for time tracking every major modality of work that I do daily, even if it didn't require a special window layout. I already had been using projects in Toggl for this, so <a href="https://github.com/evantravers/hammerspoon-config/commit/44b57b34ddfe074adbe65a32f98e3492dbc796c9">I just copied them into Headspace</a>. I used it for a week with just the major modalities I had created, occasionally flipping over to the standard toggl.app to enter a custom description for a timer.</p>
<h3><a href="#blocking-hyper-distractions" aria-hidden="true" class="anchor" id="blocking-hyper-distractions"></a>Blocking Hyper Distractions</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/blocked.png" alt="Notification informing user that Slack has been blocked">
</figure>
<p>The ability to open any application with a single keypress is awesomely… distracting.</p>
<p>I wrote a modification to hyper.lua that blocked applications had had declared should <code>never</code> be in this space. You can still manually go launch them, but that little nudge helps me stay on task and not open Slack just to tell a friend a cool thing I did in Hammerspoon. 😛</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blocking_enabled</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;only&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">some</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;only&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;never&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">every</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;never&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">            <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">contains</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">        <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19">
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allowed</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="22">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launchOrFocusByBundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="24">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Blocked &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;You have to switch headspaces&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="26"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/hyper.lua#L33-L58">hyper.lua</a>)</p>
<h3><a href="#view-current-timer" aria-hidden="true" class="anchor" id="view-current-timer"></a>View Current Timer</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/showing_timer.png" alt="showing the current timer">
</figure>
<p>I overloaded the placeholder text for the <code>hs.chooser</code> so that if there's a currently running timer, I can see what my current intention. This often keeps me on track. Because the &quot;allowed applications&quot; is tied to a space, if I want to freely use Slack or Email, I have to look at my intention in the timer first before I change the headspace. I have found myself starting to stay the course and finish the work. 👌</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">showCallback</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current_timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;🔴 :&quot;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pid</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get_project</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pid</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; (&quot;</span>  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">name</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;)&quot;</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">duration</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">math</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">floor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">secondsSinceEpoch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">current</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">duration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">60</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;m&quot;</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chooser</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">placeholderText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">str</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; :: &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">duration</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/headspace.lua#L107-L124">headspace.lua</a>)</p>
<h3><a href="#custom-timers" aria-hidden="true" class="anchor" id="custom-timers"></a>Custom Timers</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/custom_timer.png" alt="showing the custom timer">
</figure>
<p>I also rewrote the <code>hs.chooser</code> callback so that anything you type can be started as a toggl timer. I can now use just Headspace for all time tracking, only running toggl.app for the Timeline feature.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">queryChangedCallback</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">searchQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">searchQuery</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">results</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">lower</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">space</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">or</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">results</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chooser</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choices</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">results</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/headspace.lua#L90-L106">headspace.lua</a>)</p>
<p>Not bouncing back and forth between headspaces.lua for presets and Toggl.app for custom means that my time-tracking has become more consistent and painless.</p>
<p>It was <em>really</em> fun to write this. I was working on this while using it… so I was UX lead, developer, and customer all in one. My passion is making tools, and this one has been very satisfying to create.</p>
<h2><a href="#daily-usage" aria-hidden="true" class="anchor" id="daily-usage"></a>Daily Usage</h2>
<p>So what is it like to actually use?</p>
<p>Full disclosure... this is largely solving a problem of my <em>own</em> making. Automations like the Hyper key, combined with a decade of not valuing the practice of sustained intentionality<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup> means that it's easy for my monkey brain to run away and be distracted.</p>
<p>That being said, I do not think I'm alone in this. Several thinkers in the space (Shawn Blanc<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>3</a></sup>, Mike Hurley and CGP Grey, David Sparks and Mike Schmidt, Rosemary Orchard, etc.) have all talked about how they love using their iPad as a tool of focus, because iPad OS is a &quot;single-tasking&quot; OS. In some ways, I'm attempting to emulate that on a multi-tasking Macbook Pro, but on my terms. I can turn it on and off.</p>
<p>Blocking my custom hyper-key shortcuts was <em>incredibly</em> frustrating for the first week or so. I occasionally got physically angry at my computer. &quot;Why won't you do what I tell you!!!! oh. yeah. I said I was focusing.&quot;</p>
<p>I have found that this effort is slowly re-wiring my brain into putting those distracting urgent messages and &quot;just-checks&quot;<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>4</a></sup> into Things.app tasks and Drafts.app. I may even attempt to automate this, where if I try to access an app that is blocked, just open a Drafts.app draft with some context about the time, context, and the app I had just tried to access.</p>
<p>My time-tracking is <em>much</em> more consistent, and honest. At the moment, I don't have a &quot;stop&quot; timer setup until the <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/shutdown.lua">shutdown routine</a> space that I run at the end of my day. That means I'm always running a timer. My fallback timer is <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/communicate.lua">Communication</a>. It's accurate enough for now: I enter a &quot;focused space&quot; like <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/write.lua">Writing</a> or <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/research.lua">Research</a> and distractions and communication applications are blocked. When I'm done, I leave the focused space (stopping that timer) and I'm in Communication which everything is allowed, and I'm checking in with my team... it's pretty accurate to what I do now.</p>
<p>I think in the future I'd like to be <em>more</em> intentional, spend more time in focus-type blocks and less time in communication/distraction. But I have the flexibility to redesign headspace to nudge me in the right direction.</p>
<p>Here's a simple &quot;space&quot; definition in &quot;deep.lua&quot; that I show in the demo video.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">spaces</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Deep&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Work deeply on focused work (Deep)&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imageFromAppBundle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl_proj</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">projects</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deep</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">never</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#distraction&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;deep&#39;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deep</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">urlevent</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">openURL</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;things:///show?id=anytime&amp;filter=@ProctorU,$High&quot;</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>For a given space, I build a table for the <code>hs.chooser</code>, passing in information for toggl.com, and tags that I want to block/enable.</p>
<p>If I want to enable more complex actions, I can define a &quot;setup&quot; function. I can do pretty much <em>anything</em> in there.</p>
<p>This tool has me re-thinking my computer usage. Pretty much anytime I find myself doing the same thing over and over I stop and encode it into my system. I keep hiding the UI of Drafts.app for minimalistic writing? <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/write.lua#L13-L18">Encode that into Write</a>. Always open the same windows in the same places each time I run standup? <a href="https://github.com/evantravers/hammerspoon-config/blob/963bf217e6b56c8a74a4ed56ace428eade2f9bd4/spaces/standup.lua#L13-L19">Encode that into Standup</a>.</p>
<p>It may not save me <em>all</em> that much time, but I have to imagine that every small piece of friction removed is hopefully making the way for useful work. It certainly gives me joy... every time I punch in my standup and it sets itself up for me so that all I do is hit &quot;Join Call?&quot; I grin like a fool <em>every</em> time.</p>
<h2><a href="#where-is-this-headed" aria-hidden="true" class="anchor" id="where-is-this-headed"></a>Where is this headed?</h2>
<p>Well, I can't stop tinkering. It's been changing as I write this blog post. 🤷</p>
<p>I am still tweaking my toggl project to headspace relationship as I begin to understand my own work and behavior, I am trying to track and encourage spending my time in meaningful ways.</p>
<p>I'll probably attempt to write a tool to set automatic timers/limits on how much time I spend in certain spaces. I spent <em>way</em> too much time just in Communication mode, and I like the idea of having measured work blocks where I can trust my system to give me breaks at intervals.</p>
<p>I think this series is basically done, but it has led me down some neat automation rabbit holes that I'll probably feature in standalone posts. For now, you can peek into my <a href="https://github.com/evantravers/hammerspoon-config/tree/40863179f918c1fa1379b4bc2dde588fb50ebc41/spaces">spaces folder</a> and see how I'm classifying my work. Maybe you'll get some ideas for your own automations.</p>
<p>I don't <em>really</em> expect anyone else to try this... but if you do: please <a href="/contact">shoot me an email</a> or <a href="https://github.com/evantravers/hammerspoon-config/issues">create a github issue</a>. If there's enough interest, I'll submodule out headspace to be it's own Spoon or something.</p>
<p>If you really want to try Headspace and doesn't want to code up some lua, I'll either help you, or try to hack together a control panel using <a href="https://www.hammerspoon.org/docs/hs.dialog.html"><code>hs.dialog</code></a> so that it is self-configurable with a UI.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I guess this is a bit of meta for my own process:</p>
<ul>
<li>In order to do information work:
<ul>
<li>Check the calendar. What was my original plan for this time?</li>
<li>Select task.</li>
<li>Start a timer, stating intention for this time and recording metrics.</li>
<li>Close anything unrelated to preserve my focus.
<ul>
<li>Apps I usually don't care about.</li>
<li>Browser tabs go into Instapaper.</li>
</ul>
</li>
<li>Open any applications or windows required by the work.</li>
<li>EITHER:
<ul>
<li>set up a single work window full screen (usually)</li>
<li>set up a consistent layout of windows for the task (occasionally)</li>
</ul>
</li>
<li>Work for the allotted time block.</li>
<li>Attempt to resist urgent, immediate distractions to accomplish my task.</li>
</ul>
</li>
</ul>
<a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a>
</li>
<li id="fn-2">
<p>This is my current favorite definition of Focus, taken from <a href="https://twitter.com/bobbleheadjoe">Mike Schmidtz</a> on <a href="https://www.relay.fm/focused/100">Focused Episode 100</a>. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-4">
<blockquote>
<p>As for the type of work that my iPad is superior? Writing. iOS is, by nature, a distraction-free work environment. I love that I have to move a little bit slower within iOS, and that apps are almost always in full screen mode. This is a feature to me.</p>
</blockquote>
<p>(<a href="https://thesweetsetup.com/first-impressions-of-the-new-12-9-ipad-pro-for-writing-and-photography/">First Impressions of the New 12.9″ iPad Pro for Writing and Photography</a>) <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-3">
<p><a href="https://shawnblanc.net/2014/11/alternatives-to-the-just-checks/">Alternatives to the Just Checks - shawnblanc.net</a> <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon: Toggl API Calls and Secret Tokens</title>
       <link>http://evantravers.com/articles/2020/06/13/hammerspoon-toggl-api-calls-and-secret-tokens/</link>
       <pubDate>Sat, 13 Jun 2020 13:38:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/13/hammerspoon-toggl-api-calls-and-secret-tokens/</guid>
       <description><![CDATA[ <p>Ok… I'm really excited to show you the tool in the <em>next</em> post, but some context has to be laid first.</p>
<h2><a href="#toggl" aria-hidden="true" class="anchor" id="toggl"></a>Toggl</h2>
<p>I've experimented with <a href="https://toggl.com/">toggl</a> for time tracking on and off for over a year now. My current methodology is lifted and modified from CGPGrey's comments in <a href="https://overcast.fm/+E7b4QJN1U/1:03:54">Cortex Ep. 101</a>. To summarize his thoughts…</p>
<p>Grey is <em>always</em> running a timer, usually from <a href="https://timeryapp.com/">Timery on iOS</a>. He uses the act of choosing a timer as a <em>moment of intention</em>: &quot;what am I intending to do?&quot; He retroactively marks time spent unintentionally (e.g. ending up on social media instead of writing) as &quot;bad.&quot; Periodically he will check the reports in Toggl, using the color coding to judge how much time he is spending on what moves the needle.</p>
<p>I <strong>really</strong> like the idea of timing as a means of intentionality. I haven't been timing my whole day, but the past month or two I've been experimenting with using time tracking next to my <a href="/articles/2020/05/09/creating-a-focus-budget/">Focus Budget</a>. I've isolated a few work activities that I highly value, and I'm attempting to graph how much time per week I spend on those high-value activities.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/toggl_report.png" alt="a pie graph, showing mostly light blue (shallow) and a little dark blue (deep)">
  <figcaption>
    <p>Here is last week's report from toggl... light blue is things like meetings and time spent in slack/email. Dark blue is the activities I've decided will "move the needle."</p>
    <p>I have a lot of room to grow. 🙇</p>
  </figcaption>
</figure>
<p>And of course, this lends itself to automation, so I started writing a toggl.lua. (I was really surprised I couldn't find anything on github!) So it's time to hit some REST APIs with Hammerspoon!</p>
<p>An <a href="https://github.com/evantravers/hammerspoon-config/commit/0e3170842e63f1c34e89139d3ef3c38d44c51fca#diff-951f5c0c2d38d9d86b671b2860fa3b7a">earlier version of this module</a> used the <code>curl</code> executable, but once again Hammerspoon's handy stdlib has a <code>hs.http</code> library that works perfectly.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start_timer</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">asyncPost</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://www.toggl.com/api/v8/time_entries/start&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">json</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encode</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;time_entry&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;description&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">description</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;pid&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">project_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;created_with&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;hammerspoon&#39;</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Content-Type&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;application/json; charset=UTF-8&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Authorization&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Basic &quot;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">base64</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">encode</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;:api_token&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http_number</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">headers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http_number</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="20">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Between <code>hs.json</code> and <code>hs.base64</code>, writing a simple toggl client was really fun and easy!<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> I wrote some other functions, but they pretty much all follow the same structure.</p>
<p>Now I have the ability to start, stop, and view the current timer from within my Hammerspoon setup!</p>
<h2><a href="#handling-secrets-via-json" aria-hidden="true" class="anchor" id="handling-secrets-via-json"></a>Handling secrets via json</h2>
<p>As I got into writing the code for toggl.lua, I realized I needed an easy way to get secrets like API keys into memory. I started with a simple file loading system, then realized that <code>hs.json</code> is <em>perfect</em> for this.</p>
<p>Here is the <strong>entire</strong> module.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;secrets&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">json</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">read</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;.secrets.json&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span>
</div></code></pre>
<p>Yep. Isn't that beautiful? I could add some error handling for when the file doesn't exist and such, but it's simple enough. As it is, it supports inserting a nested table into <code>hs.settings</code> that you can access from <em>any</em> module.</p>
<p>Here's an example of a .secrets.json for my uses...</p>
<pre class="lumis"><code class="language-json" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;standupURL&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;http://evantravers.com&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;standupCall&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://meet.google.com/respect-op-sec&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;toggl&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;key&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;my key&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;projects&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;communications&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;meetings&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;planning&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;reading&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;design&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;research&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;play&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;leadership&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;123456789&quot;</span>
</div><div class="line" data-line="15">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>I can access any of these keys using dot notation... like:</p>
<p><code>hs.settings.get('secret').toggl.key</code>.</p>
<p>To wrap that up and add some error handling, I have some small abstractions like this one:</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;secrets&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">settings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;secrets&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggl</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;You need to load a Toggl.com API key in to hs.settings under secrets.toggl.key&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p><code>hs.settings</code> is a cool little module for some shared state. It's even persistent between sessions if you want.</p>
<p>Well… we are nearly at the finish line. If you are still reading these posts, thanks. I'm glad there's another person who cares. I have been so excited to share the next idea with y'all…</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I should say… I <em>really</em> dislike lua as a language, but the two modules I've written here almost make me like it a little. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon: Handling Windows and Layouts</title>
       <link>http://evantravers.com/articles/2020/06/12/hammerspoon-handling-windows-and-layouts/</link>
       <pubDate>Fri, 12 Jun 2020 14:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/12/hammerspoon-handling-windows-and-layouts/</guid>
       <description><![CDATA[ <p>One of the main things people do with Hammerspoon is wrangle their window layouts. There is a <em>lot</em> of awesome Hammerspoon code to help you with that, from <a href="https://github.com/scottwhudson/Lunette/">clones of popular Mac applications like Spectacle</a> to <a href="http://www.hammerspoon.org/docs/hs.window.tiling.html">complex tiling systems</a>.</p>
<p>While ten years ago I would have leapt for the tiling options<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> (I still would like to give i3wm a go one of these days!) I have been making an effort to only have one application in view at any given time. I used to think multitasking was a super power of mine, now I think it's my kryptonite.</p>
<p>In my configuration, <a href="https://github.com/evantravers/hammerspoon-config/blob/be5c9284b02f2e509d53385a73e778ba7505532b/movewindows.lua">movewindows.lua</a> isn't very complex or interesting, and a lot of it was written originally by <a href="https://twitter.com/tbmiller">Tom Miller</a>. While much of movewindows.lua is very simple, there are two automations that I'm proud of.</p>
<h2><a href="#split-screen-easily" aria-hidden="true" class="anchor" id="split-screen-easily"></a>Split screen easily</h2>
<p>I work on a laptop monitor a lot, and even at my nice setup at my desk I try to keep my main monitor on a single app. One app, one task, single focus.</p>
<p>There is one use case where I'll commonly have two windows open… one to work on, the other for reference. Sometimes it's <a href="https://kapeli.com/dash">Dash.app</a>, some other reference material, or a ticket.</p>
<p>The process usually goes like this.</p>
<ol>
<li>Be me, full screened on my work.</li>
<li>Realize I need some reference material.</li>
<li>Go find that material, open it up full screen.</li>
<li>Flip back and forth (efficiently using <a href="/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">hyper.lua</a>!) a few times before realizing that I need them both at the same time.</li>
<li>Switch to my work, enter move mode, move it to the left. (<code>HYPER+m, h</code>)</li>
<li>Switch to my reference, enter move mode, move it to the right. (<code>HYPER+m, l</code>)</li>
</ol>
<p>Realizing just how common this particular use case is, and inspired by how easy it is to split a screen in vim using <a href="https://github.com/junegunn/fzf.vim">fzf.vim</a>, I wrote a function to make my life easier.</p>
<p>Here's what it looks like in action.</p>
<figure>
  <video src="https://images.evantravers.com/articles/2020/06/split.mov"
         controls=controls
         poster="https://images.evantravers.com/articles/2020/06/split.png"></video>
  <figcaption>
    <p>Hitting <code>HYPER+m</code> allows me to enter my window movement modal. It is sort of a leader key... I then hit `v` to enter my split window chooser, then I choose the window I want alongside my "work" window and everything is ready to go!</p>
    <p>It even maintains the focus on my work. I can just keep typing.</p>
  </figcaption>
</figure>
<p>Let's walk though the code... while it's not terribly complex, it's a good example of the powerful tools Hammerspoon gives you to build your own automations.</p>
<p>First we set up the modal and bind it to our old friend Hyper.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">movewindows</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hotkey</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">modal</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;m&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">movewindows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">enter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Next we create a specific binding for the movewindows modal for hitting the letter <code>v</code>. I've considered switching it to the same bindings I'm used to in vim, but this will do.</p>
<p>I get all the windows open, and build a lua table of them to pass to the <code>hs.chooser</code> object. I don't include the currently focused window, because it's the &quot;work&quot; window.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">movewindows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;v&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> function<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">windows</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fnutils</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getWindows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">text</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subText</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">imageFromAppBundle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Armed with this table of open windows, I setup up the chooser. <code>hs.chooser</code> (<a href="https://www.hammerspoon.org/docs/hs.chooser.html">docs</a>) provides a simple fuzzy-finder that is really great at filtering to what you want very quickly. If I choose a window, it uses <code>hs.layout</code> to layout the windows, and raises <code>toRead</code> to the foreground without focusing it... this is really nice when I'm still trying to type in my &quot;work&quot; window, I don't have to refocus it.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chooser</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chooser</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choice</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="3">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focusedWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toRead</span>  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">checkKeyboardModifiers</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;alt&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left70</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toRead</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right30</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">apply</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="13">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">left50</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toRead</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focused</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right50</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="15">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toRead</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">raise</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Nothing left to do but show the <code>hs.chooser</code>. I add some placeholder text to remind myself hotkeys for the interface, make sure that I can search the <code>subText</code> (which in this case is the application name,) and show the chooser, and exit the modal.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">chooser</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">placeholderText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Choose window for 50/50 split. Hold ⎇ for 70/30.&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">searchSubText</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">choices</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">windows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">movewindows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">exit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(abridged from <a href="https://github.com/evantravers/hammerspoon-config/blob/be5c9284b02f2e509d53385a73e778ba7505532b/movewindows.lua">movewindows.lua</a>)</p>
<p>I use this more than I thought I would, it turned out that most of my window moving was simply to bring two things close together for comparison or reference. It's a <em>very</em> small thing, but it brings me a lot of joy.</p>
<h2><a href="#autolayout-on-docking-or-undocking-the-laptop" aria-hidden="true" class="anchor" id="autolayout-on-docking-or-undocking-the-laptop"></a>Autolayout on docking or undocking the laptop</h2>
<p>After using my basic keys for moving windows around, I realized the main use case for me was setting up my windows on my two monitors after docking my laptop.</p>
<p>If I'm on one screen, I want everything full screened, and I switch between them using hyper shortcuts. If I have two screens, I want work right in front of me, and distraction/calendaring applications off to the side. Inspired by <a href="https://github.com/megalithic/dotfiles/tree/be5c9284b02f2e509d53385a73e778ba7505532b/hammerspoon">Seth Messer's config</a>, I wrote a simplified <a href="https://github.com/evantravers/hammerspoon-config/blob/be5c9284b02f2e509d53385a73e778ba7505532b/autolayout.lua">autolayout.lua</a> system.</p>
<p>Once again, we return to my <code>config</code> variable in init.lua. Using the same <code>applications</code> table as hyper, we add a new key/value pair for <code>preferred_display</code>.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applications</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.brave.Browser&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.brave.Browser&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preferred_display</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>With that in place, it's pretty simple to iterate over the list in autolayout.lua, getting the windows and moving them to the monitor that I prefer.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autolayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autoLayout</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pairs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applications</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if we have a preferred display</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preferred_display</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">and</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mainWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mainWindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moveToScreen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autolayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">target_display</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app_config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">preferred_display</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moveToUnit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">layout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">maximized</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>While I can trigger <code>autolayout.autolayout()</code> manually using a hyper key, I set up a watcher that fires when the number of monitors change. (This brilliant idea is also courtesy of Seth!) This means that when I dock or undock my laptop, instead of spending the next two minutes getting everything set up <em>just</em> the way I like it, my Hammerspoon butler kindly sweeps away all the windows to their proper place every time.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autolayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config_table</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">module</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config_table</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">watcher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num_of_screens</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allScreens</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autolayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">autoLayout</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">num_of_screens</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">screen</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">allScreens</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>All of this shows a little bit of what I have been calling meta-automation. Having the power to automate little things like moving a window back and forth gives me the ability to recognize the larger &quot;UX&quot; patterns at play and directly meta-automate them. It's the difference between asking myself &quot;what am I doing right now?&quot; and realizing &quot;what am I trying to accomplish?&quot;<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup></p>
<p>I <em>love</em> tinkering with this higher-order automation... it's more thoughtful an exciting, and I can't wait to show you what I've been building up to with these posts. This is all going somewhere... I promise!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Some of you may be wondering why I do all this instead of tiling... I have a <em>very</em> specific use case. I want all windows up and full screened, able to transition without a OS X spaces animation. hyper.lua handles that. If I want to compare, I have my movewindows.lua <code>split</code> function. I think if I use a tiling function, I'd lose the ability to quickly switch... but maybe not. I may be just reinventing the wheel, but it's <em>my</em> wheel! <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>Outcomes over outputs... <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon: Automating Airpods and Brave Browser</title>
       <link>http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/</link>
       <pubDate>Thu, 11 Jun 2020 18:38:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/</guid>
       <description><![CDATA[ <p>As I continue to document my Hammerspoon configuration, I'm going to expand on <a href="/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/">hyper.lua</a> and dive into a couple of modules with simple functionality I access <em>with</em> hyper: brave.lua and airpods.lua.</p>
<h2><a href="#bravelua-automating-my-browser" aria-hidden="true" class="anchor" id="bravelua-automating-my-browser"></a>Brave.lua: automating my browser</h2>
<p>I have been using the Brave Browser for a while… I wanted to not give Google any more information than it already has… I wanted to use Firefox and not give WebKit more market share, but Firefox doesn't have automation hooks.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> 🤷🏻‍♂️</p>
<p>The <a href="https://github.com/evantravers/hammerspoon-config/blob/47ed1c909c70ce1100bb7b0da5776de330480dbc/brave.lua">brave.lua module</a> is pretty simple, and has two parts: The first, a couple of JXA scripts for manipulating the tabs of the brave browser. The second, some helper methods for accessing parts of the configuration table I provide in init.lua.</p>
<p>To set up brave.lua, you require it and pass in any configuration you have setup.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">domains</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;twitter.com&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;twitter.com&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#distraction&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#socialmedia&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;brave&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Configuring the domains is optional, but makes using some of the functions easier.</p>
<p>Now you have access to brave's functions. The original reason I wrote it is because I often end up using Google Meet. Unlike Zoom, Meet usually runs in a browser tab. I had become used to pressing <code>HYPER+z</code> to focus Zoom to unmute when someone mentioned me, and I wanted the same functionality in Google Meet.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;z&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jump</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="3">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;meet.google.com|hangouts.google.com.call&quot;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<figure>
  <video src="https://images.evantravers.com/articles/2020/06/brave_demo.mov"
         controls=controls
         poster="https://images.evantravers.com/articles/2020/06/brave_demo.png"></video>
  <figcaption>
    <p>
      My new "jump to video button" in action. <code>F19</code> here is the hotkey that triggers my Hyper modal. No matter which window, which tab, it always focuses the right window and the right tab. 👍
    </p>
  </figcaption>
</figure>
<p>This is a cool UX hack… my muscle memory is used to pressing this key to &quot;jump to the video chat,&quot; and now it is consistent no matter which app I'm using.</p>
<p>In fact, my current iteration supports the same key for either zoom, google meet, or google hangouts…</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Jump to google hangout or zoom</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;z&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;us.zoom.xos&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launchOrFocusByBundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;us.zoom.xos&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jump</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;meet.google.com|hangouts.google.com.call&quot;</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(From <a href="https://github.com/evantravers/hammerspoon-config/blob/a85100b1389b10c83a9e63eb279a2c83561b1784/init.lua#L181-L188">init.lua</a>)</p>
<p>One key, and I always focus the video window when someone asks me a question. 👌</p>
<p><code>brave.jump()</code> uses some JXA that I believe I adapted from some AppleScript I found somewhere and rewrote. You can read the whole thing <a href="https://github.com/evantravers/hammerspoon-config/blob/a85100b1389b10c83a9e63eb279a2c83561b1784/brave.lua#L17-L34">here</a>. If nothing else, this highlights Hammerspoon's power to run random scripts based on your environment or input.</p>
<p>I use the exact same technique for a couple other things… I have a key that either focuses Figma.app, the Figma.com website, or Lucidchart (because sometimes I forget I use that.) It's basically a &quot;show me my visual design&quot; button. It's great!</p>
<p>There are some additional features in brave.lua that will be fleshed out in later posts.</p>
<h2><a href="#airpodslua" aria-hidden="true" class="anchor" id="airpodslua"></a>airpods.lua</h2>
<p>This is a small trick but I use it <em>all</em> the time. When I started on this, there was not a good way to connect your AirPods to your computer with a single keypress. I think there's at least three menubar applications now on the App Store, but <a href="https://github.com/evantravers/hammerspoon-config/blob/47ed1c909c70ce1100bb7b0da5776de330480dbc/airpods.lua">mine is free</a>!</p>
<p>I found some AppleScript by <a href="https://gist.github.com/daGrevis/">@daGrevis</a> that connects AirPods, wired it up in a lua module, require and specify the name of my AirPods, and connected it to my Hyper modal layer described earlier. That simple.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">airpods</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;airpods&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;a&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">output</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">airpods</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toggle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Evan’s AirPods&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ok</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">output</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Couldn&#39;t connect to AirPods!&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<h2><a href="#bonus-snip-browser-highlight-to-drafts-as-a-simple-markdown-zettelkasten" aria-hidden="true" class="anchor" id="bonus-snip-browser-highlight-to-drafts-as-a-simple-markdown-zettelkasten"></a>Bonus: Snip browser highlight to Drafts as a Simple Markdown Zettelkasten</h2>
<p>A lot of my <a href="/articles/2020/03/13/simple-markdown-zettelkasten/">simple markdown zettelkasten</a> starts as something that I'm reading in a browser. While Drafts.app provides a <em>lovely</em> integrated share function if you are using Safari, if you are using Brave (for reasons shared above!) you have to do something different.</p>
<p>When Drafts.app opened up a simple AppleScript api, I could finally do this. This requires enabling an option in Brave: <code>View -&gt; Developer -&gt; Allow Javascript from Apple Events</code>.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Snip current highlight in Brave</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;s&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">osascript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applescript</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[
</div><div class="line" data-line="4">    -- stolen from: https://gist.github.com/gabeanzelini/1931128eb233b0da8f51a8d165b418fa
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">    if (count of theSelectionFromBrave()) is greater than 0 then
</div><div class="line" data-line="7">      set str to &quot;tags: #link\n\n&quot; &amp; theTitleFromBrave() &amp; &quot;\n\n&gt; &quot; &amp; theSelectionFromBrave() &amp; &quot;\n\n[&quot; &amp; theTitleFromBrave() &amp; &quot;](&quot; &amp; theCurrentUrlInBrave() &amp; &quot;)&quot;
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">      tell application &quot;Drafts&quot;
</div><div class="line" data-line="10">        make new draft with properties &lbrace;content:str, tags: &lbrace;&quot;link&quot;&rbrace;&rbrace;
</div><div class="line" data-line="11">      end tell
</div><div class="line" data-line="12">    end if
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">
</div><div class="line" data-line="15">    on theCurrentUrlInBrave()
</div><div class="line" data-line="16">      tell application &quot;Brave Browser&quot; to get the URL of the active tab in the first window
</div><div class="line" data-line="17">    end theCurrentUrlInBrave
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">    on theSelectionFromBrave()
</div><div class="line" data-line="20">      tell application &quot;Brave Browser&quot; to execute front window&#39;s active tab javascript &quot;getSelection().toString();&quot;
</div><div class="line" data-line="21">    end theSelectionFromBrave
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">    on theTitleFromBrave()
</div><div class="line" data-line="24">      tell application &quot;Brave Browser&quot; to get the title of the active tab in the first window
</div><div class="line" data-line="25">    end theTitleFromBrave
</div><div class="line" data-line="26">  ]]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="27">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notify</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Snipped!&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;The snippet has been sent to Drafts&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/a85100b1389b10c83a9e63eb279a2c83561b1784/init.lua#L199-L226">init.lua</a>)</p>
<p>Here's what the script builds if I highlight a paragraph in this article.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">tags: #link
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">Hammerspoon: Automating Airpods and Brave Browser
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">When Drafts.app opened up a simple AppleScript api, I could finally do this. This requires enabling an option in Brave: View -&gt; Developer -&gt; Allow Javascript from Apple Events.
</div><div class="line" data-line="6"></span>
</div><div class="line" data-line="7">[Hammerspoon: Automating Airpods and Brave Browser](http://evantravers.com/articles/2020/06/11/hammerspoon-automating-airpods-and-brave-browser/)
</div></code></pre>
<p>I keep these in a Workspace in Drafts to process later, either saving to disk or sending to friends.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>That I can find… If you know of any, let me know! <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon: A Better, Better Hyper Key</title>
       <link>http://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/</link>
       <pubDate>Mon, 08 Jun 2020 13:07:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/08/hammerspoon-a-better-better-hyper-key/</guid>
       <description><![CDATA[ <p>This <em>all</em> started with Hyper. I <a href="/articles/2020/06/08/hammerspoon-history/">talked in the last post</a> about my history with the concept, how I learned from <a href="https://stevelosh.com/blog/2012/10/a-modern-space-cadet/">Steve Losh's post on the topic</a> and borrowed from <a href="https://brettterpstra.com/2016/09/29/a-better-hyper-key-hack-for-sierra/">Brett Terpstra</a>… and I've expanded the idea a bit. At the moment, my hyper implementation is contained in a lua module called <a href="https://github.com/evantravers/hammerspoon-config/blob/38a7d8c0ad2190d1563d681725628e4399dcbe6c/hyper.lua">hyper.lua</a>, with some dependencies on Karabiner-Elements.app.</p>
<p>I'm using hs.hotkey.modal to capture an <code>F19</code> keystroke, and only sending the &quot;hyper chord&quot; of <code>⌘⌥⇧⌃</code> if absolutely required. The <a href="https://github.com/evantravers/hammerspoon-config/blob/38a7d8c0ad2190d1563d681725628e4399dcbe6c/hyper.lua">code isn't that complex</a> so this post will be focused on the advantages of this approach.</p>
<h2><a href="#before-hyper-chord" aria-hidden="true" class="anchor" id="before-hyper-chord"></a>Before: hyper chord</h2>
<p>Traditionally, a Hyper key is implemented by sending to the Operating System &quot;hyper chord&quot; of <code>⌘⌥⇧⌃</code> by modifying the keyboard firmware or using <a href="https://karabiner-elements.pqrs.org/">Karabiner-elements.app</a>.</p>
<p><img src="https://images.evantravers.com/articles/2020/06/traditional.png" alt="" /></p>
<p>The user would then use some kind of automation software like Alfred or Keyboard Maestro to listen for the &quot;hyper chord&quot; and fire different automations. You can <em>absolutely</em> do this in Hammerspoon if you want.</p>
<p>While it works well, it has its limitations. Using the &quot;hyper chord&quot; as the entire &quot;hyper key&quot;, you can't add any more modifiers, because it is already <em>all</em> the modifiers. Because of this a lot of hyper key setups are limited to &quot;leader key&quot; style interactions.</p>
<h2><a href="#after-hshotkeymodal" aria-hidden="true" class="anchor" id="after-hshotkeymodal"></a>After: hs.hotkey.modal</h2>
<p>Using a single keycode as your &quot;hyper&quot; key, and handling the translation at the automation layer is much more expressive. In my case, Hammerspoon becomes a single &quot;router&quot; to all the automation and UI customization on my Mac.</p>
<p><img src="https://images.evantravers.com/articles/2020/06/hammerspoon.png" alt="" /></p>
<p>I use a single often-unused key (in my case, <code>F19</code>) to trigger a <code>hs.hotkey.modal</code> in Hammerspoon. Instead of having every single application listening to all the keystrokes, I can control it <em>one place</em>. In this as in all things, I am not the first. Brett Terpstra <a href="https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/">first wrote about this in &quot;A Useful Caps Lock Key&quot;</a> in 2012.</p>
<h3><a href="#hyper-shifted" aria-hidden="true" class="anchor" id="hyper-shifted"></a>Hyper… shifted?</h3>
<p>One big advantage to using Hammerspoon as a &quot;man-in-the-middle&quot; is using modifiers with your hyper key. Because your &quot;hyper key&quot; <strong>is not</strong> a cluster of modifier keys, you can actually use it in conjunction with any normal modifiers.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Press `HYPER+r`, get the Hammerspoon console.</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;r&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hswindow</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">focus</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Because my `HYPER` is actually F19,</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- I can press `HYPER+SHIFT+R`</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- Press `HYPER+⇧+R`, reload Hammerspoon configuration.</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;shift&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;r&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reload</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/38a7d8c0ad2190d1563d681725628e4399dcbe6c/init.lua#L167-L168">init.lua</a>)</p>
<p>I presently only use this in a few bindings, but I'm excited about all kinds of interesting ways to use it: quitting instead of launching an app, automatically choosing a window layout, the options are endless!</p>
<h3><a href="#truly-global-hotkeys-local-bindings" aria-hidden="true" class="anchor" id="truly-global-hotkeys-local-bindings"></a>Truly Global Hotkeys: Local Bindings</h3>
<p>There is one problem… if you want to use your hyper key to bind to an in-app Preference… <code>F19</code> is not supported by all applications.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/06/things-prefs.png" alt="Preference pane for Things 3, showing the Quick Capture.">
  <figcaption>
    <p>Things will not recognize <code>F19</code> as a keycode, or a modifier.</p>
    <p>To handle this, when I press <code>F19+.</code> Hammerspoon translates <a href="https://github.com/evantravers/hammerspoon-config/blob/38a7d8c0ad2190d1563d681725628e4399dcbe6c/init.lua#L69">that local binding</a> as if I'm pressing <code>⌘⇧⌥⌃+.</code>.</p>
  </figcaption>
</figure>
<p>Many apps give you the ability to set a hotkey in their preference panes for certain &quot;global&quot; tasks.</p>
<ul>
<li>Create to-do's in Things 3.</li>
<li>Open the Quick Capture in Drafts.app.</li>
<li>Open the clipboard history, file manager, and main search window of Alfred.</li>
</ul>
<p>To answer this, I have developed a concept of &quot;local bindings.&quot; If you set any <code>local_binding</code> key for the configuration, hyper.lua will intercept the <code>F19+&lt;key&gt;</code> keypress and instead send the traditional <code>⌘⇧⌥⌃+&lt;key&gt;</code> to the operating system… just like the Traditional model. First, set up the local bindings to the app in Hammerspoon. Then, use your new local bindings in the preference pane of the app of your choice.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local_bindings</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- for key in app.local_bindings</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pairs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local_bindings</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- send hyper chord + key</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;cmd&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;alt&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;shift&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;ctrl&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>(from <a href="https://github.com/evantravers/hammerspoon-config/blob/38a7d8c0ad2190d1563d681725628e4399dcbe6c/hyper.lua#L79-L94">hyper.lua</a>)</p>
<h3><a href="#even-when-the-app-is-closed" aria-hidden="true" class="anchor" id="even-when-the-app-is-closed"></a>Even when the app is closed</h3>
<p>In addition, I have incorporated an idea from <a href="https://thesweetsetup.com/oopsiethings-applescript-for-things-on-mac/">Shawn Blanc's OopsieThings applescript</a>. If the you trigger a local binding and Hammerspoon sees that app isn't open, it'll open it for you and <em>then</em> send the binding.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- if the app is open</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- send hyper chord</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;cmd&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;alt&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;shift&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;ctrl&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- launch the app</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">launch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- wait for it to launch</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">timer</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">waitWhile</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">app</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- then send hyper chord + key</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">eventtap</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">keyStroke</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;cmd&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;alt&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;shift&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;ctrl&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>That way my &quot;send a tweet using Tweetbot&quot; or &quot;make a Draft&quot; or especially &quot;make a to-do in Things&quot; buttons <strong>always</strong> work, regardless of whether the app is accidentally closed. 👍</p>
<h2><a href="#configuration" aria-hidden="true" class="anchor" id="configuration"></a>Configuration</h2>
<p>Hammerspoon loads an <code>init.lua</code> file by default… so I have a couple of configuration tables declared in there that I pass into the other modules.</p>
<p>I used to declare <code>config</code> as a global and just let all the other modules use it, but I wanted to make sure the modules can use whatever anyone wants to use,<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> so now each module has a <code>.start()</code> method that takes as an argument a config table. Since lua stores nearly everything as a reference, I'm not worried about blowing out memory.</p>
<p>Here is a minimalist example of a config for hyper.lua. I've removed some of the other keys and values for some of the other modules for the sake of discussion... just the config to launch Things 3, create local bindings for the capture options, and a quick function to reload the Hammerspoon config file.</p>
<pre class="lumis"><code class="language-lua" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">applications</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Things&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bundleID</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;com.culturedcode.ThingsMac&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper_key</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;t&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">local_bindings</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;,&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;.&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-- load as global, it&#39;s going to be used</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;hyper&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">start</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">config</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hyper</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bind</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;shift&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;r&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reload</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>It's very straightforward. My most common use of Hyper.lua is to launch an application, so I have a table of applications that I can define a &quot;hyper key&quot; for, and optionally some local bindings that I bind inside that application to use globally.</p>
<p>I use hyper.lua as the &quot;entry point&quot; for nearly all my Hammerspoon based automation... it's great. All my keybindings are declared in one place, and I <strong>know</strong> they will never conflict with any new applications that I download. No more discovering that weird app behavior is due to a double-bound keybinding.</p>
<p>As this series continues, I'll list the examples of how I connect hyper.lua to other automations here.</p>
<p>If you want to <a href="https://github.com/evantravers/hammerspoon-config/blob/abc945264a4ec1830083c53079b2bfd5c4a4d23d/hyper.lua">read Hyper.lua at the time of this blog post, it's available on my GitHub</a>. It's possible it's gone through new versions since this post. There's a few features in there now that I am not covering in this post, but we'll get to them later in this series.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>A lot of the configuration files I've seen for Hammerspoon use a similar pattern. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Hammerspoon: History</title>
       <link>http://evantravers.com/articles/2020/06/08/hammerspoon-history/</link>
       <pubDate>Mon, 08 Jun 2020 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/06/08/hammerspoon-history/</guid>
       <description><![CDATA[ <p>In 2012, I read the <a href="https://stevelosh.com/blog/2012/10/a-modern-space-cadet/">Modern Space Cadet article by Steve Losh</a>. This was hugely impactful and I've pretty much tried everything on it (the <a href="https://stevelosh.com/blog/2012/10/a-modern-space-cadet/#s16-shift-key-training-wheels">shift-key training wheels</a> were frustrating but helped my typing!) and I started playing around with all those tricks, especially the Hyper key.</p>
<p>Initially, the Hyper key is a &quot;magic&quot; hack for keyboard shortcut lovers where it assigns a single keypress to the unreachable modifier chord of <code>⌘⌥⇧⌃</code>. No OS X app uses that crazy chord, but most will let you use it as modifiers for a keyboard shortcut. This enables the user to set a custom keyboard shortcut that will not override a standard keyboard shortcut… effectively a layer of shortcuts that's all your own.</p>
<p>I used Mr. Losh's exact setup for quite a long time: Use KeyRemap4Macbook<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup> to map a key to the &quot;hyper&quot;, and use Keyboard Maestro to listen for that chord and fire off automations, primarily switching between applications.</p>
<p>It's hard to overstate the impact of this hack on my computing style. I haven't used the <code>⌘+TAB</code> app switcher regularly for nearly eight years now… my fingers just open the browser with <code>HYPER+k</code>, and that is How Computers Should Work<sup>TM</sup>. At the time, I was a software developer working mostly on the front-end, so the ability to instantly switch from my editor to the browser shortened my OODA loop and allowed me to iterate <em>very</em> quickly. If you bounce back and forth between two or three programs on a regular basis, I <strong>highly</strong> recommend investing in something like this.</p>
<p>This has gone through several iterations through the years. I moved from Keyboard Maestro to Alfred for this, using their visual workflow builder to define simple app switching rules. Eventually, there was some kind of breaking change that drove me to <a href="http://www.hammerspoon.org/">Hammerspoon</a><sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup> sometime in 2018. I'm not entirely sure where I found it, I know it was while searching for a solution to my Hyper-key problems.</p>
<p>I found Hammerspoon's Lua-powered little engine to be powerful and <strong>much faster</strong> than anything I had used. I was hooked.</p>
<p>While Keyboard Maestro is <em>very</em> powerful, and people have been writing applescripts for Automator forever, Hammerspoon snuggled into a sweet spot in my toolchain. I am a programmer, so anything that I can read and maintain in git is a major bonus. Hammerspoon has enough hooks and API libraries to make writing it fairly easy<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup>. I <em>frequently</em> find myself encoding a process or a UI layout into my Hammerspoon repo for repeatability and consistency.</p>
<p>As my job changed, my uses for Hammerspoon have changed. In some ways, the ability to instantly summon any application is now a bit of a curse to my precious focus rather than a boon to efficiency. I have started restructuring a bit in order to change with me, and it'll probably look totally different in two more years.</p>
<p>At the moment, I use Hammerspoon to:</p>
<ul>
<li>Focus apps with a hotkey.</li>
<li>Manage a globally accessible hotkey modal.</li>
<li>Connect and disconnect my AirPods.</li>
<li>Automatically close distractions in tabs and in apps.</li>
<li>Move my windows around.</li>
<li>Automatically create layouts for common tasks.</li>
<li>Track time to toggl based on activity.</li>
<li>Create projects in Things 3.</li>
</ul>
<p>And more to come... 😈</p>
<p>I'm going to take a few posts and document some of the modules and methodologies to my OS X desktop automation powered by Hammerspoon. While my configuration is a moving target this feels like a good point to do this, it's stable, I'm using it every day, and there are a few things that I've written that I haven't seen done before, and that I've been planning on writing for <em>years</em>.</p>
<p>If you just love automation, and you do not consider yourselves a programmer, you may be able to just <a href="https://github.com/evantravers/hammerspoon-config/tree/38a7d8c0ad2190d1563d681725628e4399dcbe6c">clone and tweak my system</a> or <a href="https://github.com/Hammerspoon/hammerspoon/wiki/Sample-Configurations">another user's</a>. You may also want to take the ideas in this series and implement them in Shortcuts on iOS or Keyboard Maestro. The techniques work regardless of implementation.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>Replaced by Karabiner.app, now replaced by Karabiner-elements.app. ¯(°_o)/¯ <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p><a href="https://github.com/evantravers/hammerspoon-config/commit/5f669b15b1a6b4ca7b40b7a42d0635f766c6133e">The original commit</a>. I wish I could remember <em>exactly</em> what led me here… it's very likely it was <a href="https://brettterpstra.com/2016/09/29/a-better-hyper-key-hack-for-sierra/">Brett Terpstra's post</a> or my friend <a href="http://megalithic.io">Seth</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>There's a <a href="https://www.hammerspoon.org/docs/">healthy standard lib</a>, but I can't believe I went so long without noticing <code>hs.inspect</code>. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: May</title>
       <link>http://evantravers.com/articles/2020/05/31/books-and-links-may/</link>
       <pubDate>Sun, 31 May 2020 21:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/31/books-and-links-may/</guid>
       <description><![CDATA[ <p>This month has been really busy for me. I've been doing a <em>lot</em> of reading on work topics, and I'm in the middle of re-writing much of my note-taking apparatus, so this month will be kind of wordy and unstructured.</p>
<p>This <em>may</em> be the last time I do a post like this... I would like to move to shorter posts more often. We will see.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#the-man-in-the-high-castle-by-philip-k-dick" aria-hidden="true" class="anchor" id="the-man-in-the-high-castle-by-philip-k-dick"></a>The Man in the High Castle by Philip K. Dick</h3>
<p>I think I started this in high school, so it was a fun quick re-read.</p>
<p>PKD's interior monologues are so skillful. Each character's mind speaks with its own voice. They don't get more poetic or use vernacular not accessible to that character's waking mind. It's subtle, but quite effective. I'm really tempted to get more intellectual or emotional within the mind of a character, but he stays with a very consistent voice.</p>
<p>The recursive symmetry of the book within a book is compelling. I imagine that when the characters of Man in the High Castle read A Grasshopper Lies Heavy they are reading about us reading them reading us reading them...</p>
<h3><a href="#the-raven-tower-by-ann-leckie" aria-hidden="true" class="anchor" id="the-raven-tower-by-ann-leckie"></a>The Raven Tower by Ann Leckie</h3>
<blockquote>
<p>Perhaps the length of one’s life was not important—except in the way it is to so many living beings, desperate to avoid death. Perhaps, long or short, it mattered how one spent that time.</p>
</blockquote>
<p>Seeing how much I enjoyed the Ancillary series, I picked this up. While I wouldn't say it's as strong as Ancillary, I really enjoyed this one. It's a fun world, I like the parallel histories going on between the story's present and past, and the existential questions about worship and language that Patience of the Hill presents.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#blank-vhs-covers-were-kinda-beautiful---youtube" aria-hidden="true" class="anchor" id="blank-vhs-covers-were-kinda-beautiful---youtube"></a>blank vhs covers were kinda beautiful - YouTube</h3>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/e9DfSCk-6Ko" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>This is <em>wonderful</em>. Growing up, my dad had boxes of taped soccer matches and I remember some of these!</p>
<p><a href="https://www.youtube.com/watch?v=e9DfSCk-6Ko&amp;feature=youtu.be">blank vhs covers were kinda beautiful - YouTube</a></p>
<h3><a href="#alabamas-nick-saban-the-scariest-man-in-college-football--gq" aria-hidden="true" class="anchor" id="alabamas-nick-saban-the-scariest-man-in-college-football--gq"></a>Alabama's Nick Saban: The Scariest Man in College Football | GQ</h3>
<p>I got this link from Dan Shipper's Superorganizer's profile on the author of The Profile. (Meta, right?)</p>
<p>I have to wonder if part of Saban's personality and the of perfection is rooted in the works-salvation of Catholicism.</p>
<blockquote>
<p>after a big victory, Saban feels less joy than relief. Saban is reaching for a standard, so there are only two possibilities: Either you did what you were supposed to do, or you fell short. If you fell short, you go work harder and better to try to meet the standard next time. And if you met the standard, you go work doubly hard to fight off complacency—a fatal disease transmitted by pats on the back and post-game confetti—so you have a shot at meeting it again. The process, then, is never over. Wins are not ends but merely data points that help Saban assess the state of the process at a given moment.</p>
</blockquote>
<p>It's a fascinating profile.</p>
<p><a href="https://www.gq.com/story/coach-nick-saban-alabama-maniac">Alabama's Nick Saban: The Scariest Man in College Football | GQ</a></p>
<h3><a href="#please-print-a-journaling-rant--the-cramped" aria-hidden="true" class="anchor" id="please-print-a-journaling-rant--the-cramped"></a>Please Print (A Journaling Rant) – The Cramped</h3>
<blockquote>
<p>In these historic times, many people have turned to journalling as a way of keeping account for the next generation. So when the grandkids ask what it was like to live through the 2020 Pandemic, you’ll be able grab your pipe, sit them on your lap, and regale them with yarns spun from your own written words.</p>
<p>I see so many that I know discussing how important their digital journalling app of choice has become for this purpose and… my heart sinks. I feel so sad for them. The reason….</p>
<p>None of these apps will be around.</p>
</blockquote>
<p>This is a <em>really</em> good point. He does have a good middle ground though:</p>
<blockquote>
<p>So please, I implore you, if you insist on journalling using any digital tool, please also regularly print what you are writing. Stick it somewhere cool and dry.</p>
</blockquote>
<p><a href="http://www.thecramped.com/please-print-a-journaling-rant/?ref=thenewsprint.co">Please Print (A Journaling Rant) – The Cramped</a></p>
<h3><a href="#psychicpaper--ios-135-sandbox-escapeentitlement-0day" aria-hidden="true" class="anchor" id="psychicpaper--ios-135-sandbox-escapeentitlement-0day"></a>psychicpaper | iOS &lt;13.5 sandbox escape/entitlement 0day</h3>
<p>A pretty great read of a very intriguing security flaw.</p>
<blockquote>
<p>[…] Because it’s very hard to parse XML correctly, valid XML makes all parsers return the same data, but slightly invalid XML makes them return just slightly not the same data. :D
In other words, any parser difference can be exploited to make different parsers see different things. This is the very heart of this bug, making it not just a logic flaw, but a system-spanning design flaw.</p>
</blockquote>
<p>Sadly, this is a 0day that was on iPhone for <em>quite</em> a while… still affects non-beta at the time of this post.</p>
<p>Another reminder that however slick the marketing packaging, every device is a 0day waiting to happen.</p>
<p><a href="https://siguza.github.io/psychicpaper/">psychicpaper | iOS 13.5 sandbox escape/entitlement 0day</a></p>
<h3><a href="#frank-chimero--redesign-table-of-contents" aria-hidden="true" class="anchor" id="frank-chimero--redesign-table-of-contents"></a>Frank Chimero · Redesign: Table of Contents</h3>
<blockquote>
<p>At the start of 2020, I’ll begin redesigning this website. In the past, I’ve done this work in secret, but I’d like to document the process this time through.</p>
</blockquote>
<p>Not only is Frank an engaging writer, this is basically a curriculum in good design, and in the integrated design process between code and notebook. I should have reviewed this before I started my redesign.</p>
<p><a href="https://frankchimero.com/blog/2019/redesign/">Frank Chimero · Redesign: Table of Contents</a></p>
<h3><a href="#3-tips-for-a-better-student-online-learning-experience---christensen-institute--christensen-institute" aria-hidden="true" class="anchor" id="3-tips-for-a-better-student-online-learning-experience---christensen-institute--christensen-institute"></a>3 tips for a better student online learning experience - Christensen Institute : Christensen Institute</h3>
<blockquote>
<p>With the shift to virtual learning, good teaching becomes more about checking in with students to coach them on self-directed learning activities and provide targeted interventions than about covering content via video lecture.</p>
</blockquote>
<p>While I'm sure it's different for everyone… this was <em>exactly</em> my homeschooling experience.</p>
<p><a href="https://www.christenseninstitute.org/blog/3-tips-for-a-better-student-online-learning-experience/">3 tips for a better student online learning experience - Christensen Institute : Christensen Institute</a></p>
<h2><a href="#zettel" aria-hidden="true" class="anchor" id="zettel"></a>Zettel</h2>
<p>I'm still using my Drafts system to create zettel from links, random thoughts... making it easy to create them means I've made a lot more than I thought. Here are some that are more useful for the three people who read my blog.</p>
<h3><a href="#a-price-is-a-signal" aria-hidden="true" class="anchor" id="a-price-is-a-signal"></a>A price is a signal</h3>
<blockquote>
<p>A price is a signal wrapped up in an incentive so if you want a strong signal and a strong incentive you need to let prices rise.</p>
</blockquote>
<p>I <em>think</em> I agree with this.</p>
<p>It's an interesting argument for cold-hearted capitalism, and one I have attempted to voice without being this articulate. I feel that (barring common grace) there is a severe downside since the signal's strength does not correlate with moral good… I don't think that it follows that the signal you send and the incentive you create are necessarily &quot;good&quot; or aligned with universal truth.</p>
<p><a href="https://marginalrevolution.com/marginalrevolution/2020/05/blood-money.html">Tyler Cowen, Blood Money - Marginal REVOLUTION</a></p>
<h3><a href="#minimum-viable-artifact" aria-hidden="true" class="anchor" id="minimum-viable-artifact"></a>Minimum viable artifact</h3>
<p>Minimum viable artifacts are the least amount of work required to communicate between peers.</p>
<p>Code artifacts are The Truth.
Design artifacts are part of a dialog to guide code.</p>
<ol>
<li>If the code is right, you don't need a design artifact.</li>
<li>If the code is wrong, simply draw the fix for only what is broken.</li>
</ol>
<p>It is hard to trust a peer with less than pixel perfect when you have been hurt and betrayed before, but it is time to change our habits.</p>
<p><a href="https://overcast.fm/+WLc2zGxC4">11. Brad Frost and Evan Lovely: Code is the Source of Truth — Design Systems Podcast — Overcast</a></p>
<h3><a href="#second-guessing-the-modern-web---macwrightorg" aria-hidden="true" class="anchor" id="second-guessing-the-modern-web---macwrightorg"></a>Second-guessing the modern web - macwright.org</h3>
<p>This article does a good job of pointing out some of the technical problems with what <a href="https://frankchimero.com/blog/2018/everything-easy/">Frank Chimero</a> and many others have pointed out about the &quot;modern web.&quot;</p>
<blockquote>
<p>As your React application grows, the application bundle grows. Unlike with a traditional multi-page app, that growth affects every visitor: you download the whole app the first time that you visit it. At some point, this becomes a real problem. Someone who lands on the About page is also downloading 20 other pages in the same application bundle. Bundle splitting ‘solves’ this problem by creating many JavaScript bundles that can lazily load each other. So you load the About page and what your browser downloads is an ‘index’ bundle, and then that ‘index’ bundle loads the ‘about page’ bundle.</p>
<p>This sort of solves the problem, but it’s not great. Most bundle splitting techniques require you to load that ‘index bundle’, and then only once that JavaScript is loaded and executed does your browser know which ‘page bundle’ it needs. So you need two round-trips to start rendering.</p>
</blockquote>
<p>Maybe I <em>am</em> an old fogey, but it really does feel like a lot of clever javascript build system is a solution in search of a problem. I'm prejudiced in favor of the &quot;new&quot; old-way of the so-called JAMstack: static pages, rich interaction where required, readable source code.</p>
<blockquote>
<p>But I’m at the point where I look at where the field is and what the alternative patterns are – taking a second look at unloved, unpopular, uncool things like Django, Rails, Laravel – and think what the heck is happening. We’re layering optimizations upon optimizations in order to get the SPA-like pattern to fit every use case, and I’m not sure that it is, well, worth it.</p>
</blockquote>
<p>Amen… but also great comments on how hard it is to swim against the industry current.</p>
<blockquote>
<p>But the cultural tides are strong. Building a company on Django in 2020 seems like the equivalent of driving a PT Cruiser and blasting Faith Hill’s “Breathe” on a CD while your friends are listening to The Weeknd in their Teslas. Swimming against this current isn’t easy, and not in a trendy contrarian way.</p>
</blockquote>
<p>I will be happily driving my PT Cruiser static-site blog long after React is as old-news as Angular 1.0. :-P</p>
<p><a href="https://macwright.org/2020/05/10/spa-fatigue.html">Second-guessing the modern web - macwright.org</a></p> ]]></description>
    </item>
    <item>
       <title>Busting Your Cache with the Power of Git</title>
       <link>http://evantravers.com/articles/2020/05/28/busting-your-cache-with-the-power-of-git/</link>
       <pubDate>Thu, 28 May 2020 01:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/28/busting-your-cache-with-the-power-of-git/</guid>
       <description><![CDATA[ <p>I've been using <a href="https://middlemanapp.com/">middleman</a> since 2012. While working on the current redesign, I once again encountered the problem that I had no way of busting the cache, <em>especially</em> for CSS files.</p>
<p>While <a href="https://middlemanapp.com/advanced/improving-cacheability/">Middleman provides handy tooling for cache busting</a>, I have not been using it because I've been trying to slowly wean my layouts away from using Middleman/Sinatra-specific helpers so that if I decide to move to a different static-site generator. ¯(°_o)/¯</p>
<p>I decided to tackle it by hand, because why not. My first try was naive to say the least.</p>
<pre class="lumis"><code class="language-diff" translate="no" tabindex="0"><div class="line" data-line="1">commit 1517eabb35fe34b6d2aac4150649798658d5c6f5
</div><div class="line" data-line="2">Author: Evan Travers &lt;evantravers@gmail.com&gt;
</div><div class="line" data-line="3">Date:   Wed May 20 09:17:56 2020 -0500
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">    Try adding a cachebreaker
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diff</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/source/layouts/layout.html.erb b/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ae25085</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b68fe67</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100644</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+++</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@@ -37,7 +37,7 @@</span>
</div><div class="line" data-line="12"> 
</div><div class="line" data-line="13">   &lt;link href=&quot;https://fonts.googleapis.com/css?family=Muli:300,400,400i,700|Literata:700,300&amp;display=swap&quot;
</div><div class="line" data-line="14">         rel=&quot;stylesheet&quot;&gt;
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#d1242f, #f85149); background-color: light-dark(#e4b7be, #2c171b); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  &lt;link rel=&quot;stylesheet&quot; href=&quot;/dist/style.css&quot;&gt;</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  &lt;link rel=&quot;stylesheet&quot; href=&quot;/dist/style.css?cachebreaker=&lt;%= Time.now.to_i %&gt;&quot;&gt;</span>
</div><div class="line" data-line="17"> &lt;/head&gt;
</div><div class="line" data-line="18"> &lt;body&gt;
</div><div class="line" data-line="19">   &lt;nav class=&quot;main_navigation&quot;&gt;
</div></code></pre>
<p>It first appeared to work... but do you see my mistake? When Middleman builds each file, <code>Time.now.to_i</code> is still ticking away. Every file will get a totally different cache-breaker! While each refresh will indeed get a fresh file, <em>every</em> page will re-request the css file. That's not right at all.</p>
<p>I realized that I needed to only change the URL when the CSS file changes. What system do I have in place that tracks changes? Source control!</p>
<pre class="lumis"><code class="language-diff" translate="no" tabindex="0"><div class="line" data-line="1">commit 7ec5bc915bc78735f43ffedd8660763b73cd1c6d
</div><div class="line" data-line="2">Author: Evan Travers &lt;evantravers@gmail.com&gt;
</div><div class="line" data-line="3">Date:   Wed May 20 09:28:02 2020 -0500
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">    More intelligent cachebreaker
</div><div class="line" data-line="6">    
</div><div class="line" data-line="7">    This one will only update if I update the style.scss file, and it&#39;ll be
</div><div class="line" data-line="8">    the same on _every_ page.
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diff</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/config.rb b/config.rb</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">72d2be8</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">8d0b238</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100644</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/config.rb</span>
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+++</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b/config.rb</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@@ -50,6 +50,10 @@ helpers do</span>
</div><div class="line" data-line="15">     &#39;evantravers.com&#39;
</div><div class="line" data-line="16">   end
</div><div class="line" data-line="17"> 
</div><div class="line" data-line="18"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  def style_cache_id</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">    `git log --pretty=format:&#39;%H&#39; -n 1 -- source/css/style.scss`</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  end</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="22">   def meta_description
</div><div class="line" data-line="23">     if is_blog_article?
</div><div class="line" data-line="24">       Sanitize.clean(current_page.summary).strip
</div><div class="line" data-line="25"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">diff</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">--git</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/source/layouts/layout.html.erb b/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="26"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ae25085</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">4904350</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">100644</span>
</div><div class="line" data-line="27"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="28"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+++</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b/source/layouts/layout.html.erb</span>
</div><div class="line" data-line="29"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@@ -37,7 +37,7 @@</span>
</div><div class="line" data-line="30"> 
</div><div class="line" data-line="31">   &lt;link href=&quot;https://fonts.googleapis.com/css?family=Muli:300,400,400i,700|Literata:700,300&amp;display=swap&quot;
</div><div class="line" data-line="32">         rel=&quot;stylesheet&quot;&gt;
</div><div class="line" data-line="33"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#d1242f, #f85149); background-color: light-dark(#e4b7be, #2c171b); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  &lt;link rel=&quot;stylesheet&quot; href=&quot;/dist/style.css&quot;&gt;</span>
</div><div class="line" data-line="34"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1a7f37, #3fb950); background-color: light-dark(#b8d0bf, #10231c); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  &lt;link rel=&quot;stylesheet&quot; href=&quot;/dist/style.css?cachebreaker=&lt;%= style_cache_id %&gt;&quot;&gt;</span>
</div><div class="line" data-line="35"> &lt;/head&gt;
</div><div class="line" data-line="36"> &lt;body&gt;
</div><div class="line" data-line="37">   &lt;nav class=&quot;main_navigation&quot;&gt;
</div></code></pre>
<p>So far, this works <em>wonderfully</em>. If I push an update without any CSS changes, no files change, and you get the benefit of the existing cache. If I push any change to the CSS file, every single page on the site gets a new URL for the style, forcing the cache to refresh. I do a little more file-moving and computation, but the user doesn't feel the pain.</p>
<p>Simple, but it works.</p> ]]></description>
    </item>
    <item>
       <title>Creating a Focus Budget</title>
       <link>http://evantravers.com/articles/2020/05/09/creating-a-focus-budget/</link>
       <pubDate>Sat, 09 May 2020 21:20:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/09/creating-a-focus-budget/</guid>
       <description><![CDATA[ <p>Around a year ago I started to block off time on my calendar to do <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/#what-i-did">deep work</a>. At first this was merely a shield preventing colleagues from claiming my time. Over the following months, I found that knowing the amount of time dedicated to focus gave me clarity for daily decisions. Do I <em>really</em> have enough bandwidth to say &quot;yes&quot; to this new project or this status meeting? If I take it on, what will I lose? Can I get back with you today?</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/05/budget-1.png" alt="">
  <figcaption>Looks like I have lots of time, doesn't it? It's deceptive.</figcaption>
</figure>
<p>Today, I think of this practice as a <strong>Focus Budget</strong>. Just like a <a href="https://en.wikipedia.org/wiki/Zero-based_budgeting">zero-based financial budget</a>, I have a limited resource to invest. I can change my mind and reallocate the resource, but as the clock ticks the time slips away. Being honest with how little focus time I have helps me be a good steward.</p>
<p>I have been trying this iteration of my Focus Budget system for about three months, and I <strong>really</strong> like it. It helps me juggle my manager/maker schedule by focusing first on what is essential.</p>
<p>On a week by week basis, I identify and commit to three Goals.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> These are the essential tasks that <a href="https://www.macsparky.com/blog/2019/5/moving-the-needle">Move the Needle</a>.</p>
<p>Armed with the Essential Three I create my Focus Budget. While filling the gaps in my calendar with focus time, I leave room for lunches and breaks. I use colors to make it easier to see what days are loaded with meetings, and which have hours of precious, uninterrupted focus.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/05/budget-2.png" alt="">
  <figcaption>Creating the Focus Budget. Green blocks for good focus, purple for margin/shallow tasks. I do not allow myself to look at Slack or email during Green focus time.</figcaption>
</figure>
<p>Looking at the essential tasks for the week and the newly made Focus Budget, I estimate how much I'll be able to accomplish. If I don't have enough dedicated time I consider dropping commitments that don't align with the three essential projects. If I am still behind, I consider which of the three can be delegated or dropped for this week. At the beginning of the week there is usually adequate time to make significant progress on all three… <em>if</em> I can protect it.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/05/budget-3.png" alt="">
  <figcaption>Giving Every Minute a Job.</figcaption>
</figure>
<p>I assign the focus blocks a task or project by renaming them, forming a rough plan for the week. I leave margin in the Focus Budget to accommodate last minute interruptions or tasks that I underestimated. This Monday morning commitment to the Essential is crucial to helping me move the needle.</p>
<p>On each morning, I scan the agenda, adjust the plan for that day, and fill the rest of the time by pulling prioritized tasks from my task manager. Because I've already budgeted some time to &quot;move the needle&quot;, I can more accurately take on a reasonable workload. I find I finish more and &quot;carry&quot; less unfinished tasks to the next day with this system. As priorities and meetings change, I am constantly reshuffling blocks… sometimes moving work forward to make a deadline, but always realizing that the time has to come from <em>somewhere.</em></p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/05/budget-4.png" alt="">
  <figcaption>Staying accountable with emojis! 💚</figcaption>
</figure>
<p>In the afternoon as part of my review ritual, I look back over the time blocks and ask myself if I was intentional and honest with the time. Working from memory and time-tracking data, I mark any wasted time blocks with an emoji. Blocks wasted entirely by distraction get an ❌. Focus blocks invaded by the previous task or meeting get a ⏬. I'll often put in the notes of the focus block what happened, for my weekly review.</p>
<p>Especially on weeks with a tight schedule, the Focus Budget helps me say no to that which is not Essential. If it's not part of the three most important things I need to do this week, why am I investing my time in it?</p>
<p>By being visually accountable with the emoji, I can see at a glance the cost of succumbing to the distractions of my phone or &quot;just checking&quot; slack or email. I often only get only ten or less focus hours a week… I can not afford to waste one. I want to be a good steward of my time, and this little system has helped.</p>
<p>This pattern did not spring fully formed from my personal headaches… it borrows heavily from several wiser folk whom I need to credit: the planning out of the day in blocks owes much to <a href="https://www.macsparky.com/blog/2018/2/the-hyper-scheduling-experiment">David Sparks' Hyper Scheduling</a>. The idea of tracking how you intended to spend your day (in blocks) compared to how you spent it looks a lot like things I've heard Matt Ragland say. Planning in shallow time to relax and unwind comes from <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Cal Newport's Deep Work</a>. Planning out your day in bursts of focus and margin is <a href="https://en.wikipedia.org/wiki/Pomodoro_Technique">the Pomodoro Technique</a>.</p>
<p>I'd love to hear what you do to protect the big rocks and pursue the most important tasks in your day, reply on the <a href="https://twitter.com/evantravers/status/1259251378523967489">twitter thread</a> if you have input!</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I described more about my system for keeping accountable to the essential in <a href="/articles/2020/03/30/my-current-bullet-journal-layout/">my recent post on my bullet journal spread</a>. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Time for a redesign...</title>
       <link>http://evantravers.com/articles/2020/05/07/time-for-a-redesign/</link>
       <pubDate>Thu, 07 May 2020 14:22:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/07/time-for-a-redesign/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/05/newdesign.png"></p><p>I started jonesing for a change, so I've been hacking away at nights on a minor redesign. I'm pretty happy with the final result. I think it's reasonably readable and usable, but I honestly think the overall effect is pretty boring and generic. 😜 I will <em>certainly</em> be reworking some pages over time. I'm not super pleased with the dark mode at the moment...it lacks character. There are also some small tweaks I need to make in order for it to be as accessible as I would like.</p>
<p>While we are here, here's a cherry-picked tour of some of the old designs!</p>
<p>(Btw, it's <em>unreasonably</em> hard to go back in time in an old ruby project... not sure how I feel about that.)</p>
<h2><a href="#2012" aria-hidden="true" class="anchor" id="2012"></a>2012</h2>
<p>The first public iteration of this site. I had been using blogger, then later custom tumblr themes for my sites. I decided to finally man up and wound up building this site in Middleman. Eight years on the same codebase!</p>
<p>I wrote this version using Zurb's Foundation css framework in Slim. I think I was also hosting it on heroku.</p>
<p><img src="https://images.evantravers.com/articles/2020/05/2012.png" alt="2012" /></p>
<p>I think this version had some visual homage to old versions of both <a href="http://csswizardry.com">csswizardry</a> and <a href="http://smashingmagazine.com/">Smashing Magazine</a>.</p>
<h2><a href="#2013" aria-hidden="true" class="anchor" id="2013"></a>2013</h2>
<p><img src="https://images.evantravers.com/articles/2020/05/2013.png" alt="2013" /></p>
<p>Here we have a minor font change, and I reversed the direction of everything. I think at this point I was still using Zurb's Foundation for the grid system.</p>
<p>I actually really like the big images with the border, I could see myself going back to that someday. They kind of pop.</p>
<p>Here I finally started using static sites for what they were designed, and deployed this bad boy to Amazon S3... where it has cost me about a dollar a month since. :P</p>
<h2><a href="#2014" aria-hidden="true" class="anchor" id="2014"></a>2014</h2>
<p>At some point, I had been using Bourbon.io's Neat framework, and I rebuilt my blog using that.</p>
<p><img src="https://images.evantravers.com/articles/2020/05/2014.png" alt="2014" /></p>
<p>Pretty much a clone of the previous site, just with better CSS.</p>
<p>Somewhere in here I started doing one-off pages like a resume and an <a href="http://evantravers.com/git">essay on git</a>.</p>
<h2><a href="#2015" aria-hidden="true" class="anchor" id="2015"></a>2015</h2>
<p>Somewhere in 2015 I stripped away <em>everything</em> and made it as simple as possible. The index page lost pagination, everything. Just a list of articles.</p>
<p><img src="https://images.evantravers.com/articles/2020/05/2015.png" alt="2015" /></p>
<p>Part of this effort was trying to make the site more mobile friendly, part of it was trying to emphasize writing.</p>
<p>The site got abandoned for a while... I posted <em>nothing</em> for all 2016! I think it was a combination of work, instagram, and getting to know a cute girl. :P</p>
<h2><a href="#2017" aria-hidden="true" class="anchor" id="2017"></a>2017</h2>
<p><img src="https://images.evantravers.com/articles/2020/05/2017.png" alt="2017" /></p>
<p>The site was reborn in 2017, just added some navigation, started working on mobile interfaces.</p>
<h2><a href="#2019" aria-hidden="true" class="anchor" id="2019"></a>2019</h2>
<p>At some point in 2018 to 2019, I started writing <em>much</em> more often. I added features related to what I was writing: footnotes, changelogs, <code>&lt;figure&gt;</code>s with <code>&lt;figcaption&gt;</code>, comments via IndieWeb. Mostly I just wrote posts.</p>
<p>I haven't found the exact series of commits, but I redesigned around the time I implemented the first dark-mode.</p>
<p><img src="https://images.evantravers.com/articles/2020/05/2019.png" alt="2019" /></p>
<p>This version finally had a more usable mobile menu that went through several redesigns, starting with the <a href="https://css-tricks.com/the-checkbox-hack/">&quot;checkbox trick&quot;</a> and then later using <code>&lt;details&gt;</code>.</p>
<p>I rewrote the whole thing in CSS grid, using some of the cooler new features like <code>grid-column-start</code> to move the footer out of the sidebar into the footer in the mobile version. <em>Very</em> cool.</p>
<h2><a href="#bonus" aria-hidden="true" class="anchor" id="bonus"></a>Bonus</h2>
<p>In 2013, <a href="/articles/2013/03/12/website-changes/">I posted some screenshots</a> of my very first websites in high school.</p>
<p><em>* shiver *</em></p>
<p>Anyway... I hope you have enjoyed this jaunt through my iteration. Putting this together was mostly for me, and it has made me laugh a lot at what I used to think was cool, and it's interesting to see how my concept of myself as a writer has changed over time. The site has moved from being a hub of all the disparate networks I used to being an independent voice, the main place I express myself, and I am pretty doggone proud of that.</p> ]]></description>
    </item>
    <item>
       <title>Five Things I Tell Every New Developer to Learn</title>
       <link>http://evantravers.com/articles/2020/05/03/five-things-i-tell-every-new-develop-to-learn/</link>
       <pubDate>Sun, 03 May 2020 19:26:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/03/five-things-i-tell-every-new-develop-to-learn/</guid>
       <description><![CDATA[ <p>In <a href="/articles/2020/05/02/the-question-that-made-my-whole-engineering-career/">my last post</a>, I talked about a question that helped guide my early career. By asking those I respected &quot;what do I need to learn to come work with you?&quot; I built a list of technologies and skills that I could acquire to become a valuable team member.</p>
<p>Sadly, I have lost the original list. Listed below are what I consider to be the most important skills on that list. All of them were not really emphasized or offered where I went to college. I prioritized learning them on my own, and I am so grateful that I did. More importantly than my own experience, these are all skills and habits of developers I respect and admire.</p>
<h2><a href="#know-a-scripting-language" aria-hidden="true" class="anchor" id="know-a-scripting-language"></a>Know a scripting language.</h2>
<p>You should have a lightweight universal language like bash, Ruby, or Python at your fingertips. Use it to solve repetitive or tedious tasks: renaming a giant folder of files, backing up your photos, launching all the files and folders you need for a project in the morning, etc. Look for an excuse to use it and soon you'll never look at your computer the same way again.</p>
<p>I am <em>constantly</em> writing little scripts to do my work for me. It's because of this advice. Today I used scripts I have written to:</p>
<ul>
<li>Automatically resize and position windows the way I like them.</li>
<li>Switch between apps effortlessly.</li>
<li>Search through my plain text notes.</li>
<li>Connect to AirPods.</li>
<li>Focus a video call.</li>
<li>Clip highlights from web pages for processing later in Drafts.</li>
<li>Save those clips from my phone to a specific  format in Dropbox.</li>
<li>Build this blog!</li>
</ul>
<p>Once you start using little scripts to automate a single repetitive task in your life, you'll see more possibilities… and there are many ways this is useful at work: build tasks, make files, environment setup and tear down, tests… it's all scripts.</p>
<p>A great way to acquire some knowledge of a scripting language is to use it to solve some <a href="https://projecteuler.net/">projecteuler.net</a> or <a href="https://adventofcode.com/">adventofcode.com</a> puzzles. Not only are they fun and a good code challenge, but there are large communities to learn from and see other people's solutions.</p>
<h2><a href="#master-a-text-editor" aria-hidden="true" class="anchor" id="master-a-text-editor"></a>Master a text editor.</h2>
<p>Pick a text editor that's universal enough to write in any programming language. <a href="https://code.visualstudio.com/">VS Code</a> is a good choice. In the old days I would have said emacs or vim. <a href="/articles/tags/vim">Y'all know which choice I made</a>.</p>
<p>You can start with learning how to do the following without thinking… probably using keyboard shortcuts:</p>
<ul>
<li>Open (fuzzy find) and save files.</li>
<li>Autocomplete words and close parentheses.</li>
<li>Join lines, split.</li>
<li>Reformat indentation on a file.</li>
<li>Find and replace across files with regex.</li>
<li>Jump to errors or uncommitted changes.</li>
</ul>
<p>Learn to pay attention to what you do on a daily basis in your editor. One at a time, find the most efficient way to perform these common tasks. By investing a little time today, you will save yourself hours and days of future productive time.</p>
<h2><a href="#use-a-debugger" aria-hidden="true" class="anchor" id="use-a-debugger"></a>Use a debugger.</h2>
<p>Especially with the contrived problems you encounter in school it is often enough to try every combination or method possible <a href="https://stackoverflow.com/questions/37947437/getting-rid-of-the-red-squiggly-lines-in-eclipse">until the squiggly red line goes away</a>.</p>
<p>We've all done it, there's no shame. <em>But</em> there is a better way. You can use a debugger to help you read through actually understand the state of the data as it moves through the code.</p>
<p>If the language you use has a debugger, learn how to use it. At very least, you most likely do something web related, and you can learn the debuggers built into dev tools in browsers. You should be comfortable with setting breakpoints, conditional breakpoints, stepping through the code after a breakpoint, reading the state.</p>
<p>If you are feeling extra adventurous, learn about <code>strace</code>. :)</p>
<h2><a href="#use-git-and-craft-good-commits" aria-hidden="true" class="anchor" id="use-git-and-craft-good-commits"></a>Use git, and craft good commits.</h2>
<p>(I recognize that <code>git</code> isn't the only game in town, but it's a pretty big one.)</p>
<p>I'd be pretty surprised to hear of a good job in programming that didn't involve using source control. You will work with code. You will work with people. The two intersect in source control.</p>
<p>First you should learn to craft a good commit<sup class="footnote-ref"><a href="#fn-5" id="fnref-5" data-footnote-ref>1</a></sup>. Then you should learn how to revise a commit or set of commits that need to be rewritten.</p>
<p>A good way to start thinking about commits is to write change sets that have no side effects. If your commit says &quot;rename foo to bar&quot;, you shouldn't be also chanting the indentation or checking in a dependency file.</p>
<p>I have recently revised <a href="http://evantravers.com/git">my &quot;living essay&quot; at evantravers.com/git</a>, there is a lot of useful stuff in there.</p>
<h2><a href="#study-writing" aria-hidden="true" class="anchor" id="study-writing"></a>Study writing.</h2>
<p>Programming code is made of words that are evaluated by computers, but they are also read by humans. The computer never misunderstands, but people <strong>often</strong> do. They say that naming is one of the hardest problems in programming… and that's not because of computers. It's because of people.</p>
<p>You are going to spend your <em>entire</em> career writing prose to be read by humans. You will write human-centered code, commits, documentation, emails, and chat messages. Learning how to edit yourself, to thoughtfully phrase a request so that you minimize back-and-forth, to write documentation that is clear and concise… this is the study of a lifetime. Whether your work is understandable or frustrating depends <em>directly</em> on your writing ability. Developers that recognize this and are intentional in this area reap substantial rewards.</p>
<p>Here is an incomplete list of places to start learning:</p>
<ul>
<li>Learn how to ask <em>good</em> questions.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup></li>
<li>Learn to lead with the point. <sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup></li>
<li>Learn how to proof and edit your own writing. <sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>4</a></sup></li>
<li>Be intentional and thoughtful in communication.<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>5</a></sup></li>
</ul>
<h2><a href="#this-list-is-always-incomplete" aria-hidden="true" class="anchor" id="this-list-is-always-incomplete"></a>This list is always incomplete.</h2>
<p>There's so much more to learn! This career path is branching and ever-changing. If you like to learn and grow, you are in the right place.</p>
<p>I had to cut a huge amount out of my main list<sup class="footnote-ref"><a href="#fn-6" id="fnref-6" data-footnote-ref>6</a></sup>. I don't judge them to be as universally helpful as the five above.</p>
<p>If you have thoughts or comments, strongly feel that I included something useless or that I left something out, feel free to comment on twitter.</p>
<p>Edit: I recently noticed <a href="https://missing.csail.mit.edu/">this amazing MIT-adjacent course</a> that covers nearly all the same topics.</p>
<ul>
<li><a href="http://www.catb.org/~esr/faqs/smart-questions.html">How to ask questions the smart way - catb.org</a></li>
<li><a href="https://stackoverflow.com/help/how-to-ask">How to ask good questions - Stack Overflow</a></li>
</ul>
<ul>
<li><a href="https://basecamp.com/guides/how-we-communicate">The Basecamp Guide to Internal Communication - basecamp.com</a></li>
<li><a href="https://developers.google.com/tech-writing">Technical Writing Courses - developers.google.com</a></li>
<li><a href="https://www.fastcompany.com/3064443/six-steps-for-avoiding-never-ending-email-threads">Six Steps For Avoiding Never-Ending Email Threads - fastcompany.com</a></li>
</ul>
<ul>
<li>Be familiar with some User Experience methodologies.</li>
<li>At least read about some Agile methodologies</li>
<li>Study leadership, both from a follower and leader's perspective.</li>
<li>Volunteer in your local community.</li>
<li>Date (don't marry!) a front-end framework.</li>
<li>Know how to write shell script.</li>
<li>Know how to maintain <strong>good</strong> CSS.</li>
<li>Be able to read SQL.</li>
<li>See and communicate basic algorithmic complexity.</li>
<li>Be an effective (asynchronous) communicator.</li>
<li>Learn how to work in legacy systems.</li>
<li>Be responsible for your own personal organization and time management.</li>
<li><a href="https://en.wikipedia.org/wiki/Design_Patterns">Design patterns</a>.</li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-5">
<p><a href="https://wiki.openstack.org/wiki/GitCommitMessages">Git Commit Good Practice - Openstack Wiki</a> <a href="#fnref-5" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>Asking questions: <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p><a href="https://en.wikipedia.org/wiki/Inverted_pyramid_(journalism)">Inverted Pyramid - Wikipedia</a> <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-1">
<p><a href="https://www.nytimes.com/2020/04/07/smarter-living/how-to-edit-your-own-writing.html">How to Edit Your Own Writing - nytimes.com</a> <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-4">
<p>Useful guides for thinking about communication: <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-6">
<p>Cut out of the main list: <a href="#fnref-6" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>The Question that Made My Whole Engineering Career</title>
       <link>http://evantravers.com/articles/2020/05/02/the-question-that-made-my-whole-engineering-career/</link>
       <pubDate>Sat, 02 May 2020 00:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/05/02/the-question-that-made-my-whole-engineering-career/</guid>
       <description><![CDATA[ <p>Close to the beginning of my career as a software engineer I got some incredible advice. I wish I could give credit to the wise person gave me this counsel. I owe them <strong>greatly</strong>.</p>
<p>When you meet someone you admire at a job you would like, ask:</p>
<blockquote>
<p>What do I need to learn in order to come work with you?</p>
</blockquote>
<p>It's a <em>great</em> question.</p>
<p>It is a solid start to a friendship. It asks for a small favor that doesn't require a huge commitment. The answers to this question help you tailor your skillset for the jobs in your network.</p>
<p>After the unremembered saint gave me this advice, I starting to ask this question of folks I respected. Depending on their industry or role I got specific answers, often tech particular to their company.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup> The intersection of all the answers made an <em>amazing</em> list! It guided the class enrollment and focused my extracurricular learning for topics college didn't offer. <sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>2</a></sup></p>
<p>I have lost the original list, but I am planning on posting a new tech-agnostic version from my perspective. I chose only the parts I remember being useful and are common traits of developers I still look up to today.</p>
<p>If you have insights or arguments on what should make the list, feel free to <a href="https://twitter.com/evantravers/status/1256405075179843586">comment on twitter</a> and I'll consider updating this post.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>Lots of PHP frameworks that have since fallen out of favor, and of course, Ruby on Rails, which I did pursue. ' <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-1">
<p>My college experience did not include <em>any</em> useful source control practices or strategies for working in legacy codebases, it was very academic-focused. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: April</title>
       <link>http://evantravers.com/articles/2020/04/30/books-and-links-april/</link>
       <pubDate>Thu, 30 Apr 2020 16:30:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/04/30/books-and-links-april/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/04/betterdays.jpeg"></p><p>Hey everyone! It's my birthday today, so lots of opportunities to give thanks. This quarantine time is going to make for a memorable birthday, that's for sure.</p>
<p>I'm still working on refactoring some of my systems, mostly pulling in reading and links in a different way into my knowledge system. This has enabled a bit more reading, and quite a bit more commentary, so feel free to throw away whatever isn't useful.</p>
<p>Currently this site is built in middleman and hosted on s3, but I'm thinking about moving it to netlify or codebuild to enable building on git commit, which means I could post from my phone using Drafts and Working Copy... I've just been busy with other things.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#mindset-the-new-psychology-of-success-by-carol-s-dweck-phd" aria-hidden="true" class="anchor" id="mindset-the-new-psychology-of-success-by-carol-s-dweck-phd"></a>Mindset: The New Psychology of Success by Carol S. Dweck Ph.D</h3>
<p>Started reading in April 2019 on kindle. It took me a year because I took a break to finish a bunch of other books. This is one of those books that's always name-checked in a list of &quot;important books.&quot;</p>
<p>The first part of the book shows the destructiveness of what is dubbed the &quot;fixed&quot; mindset… a world in which you are already all you can be, and you pursue success to prove your worth and avoid failure so that you aren't revealed as a loser.</p>
<blockquote>
<p>Believing that your qualities are carved in stone—the fixed mindset—creates an urgency to prove yourself over and over. If you have only a certain amount of intelligence, a certain personality, and a certain moral character—well, then you’d better prove that you have a healthy dose of them. It simply wouldn’t do to look or feel deficient in these most basic characteristics.</p>
</blockquote>
<p>It also introduces the growth mindset… a worldview where failure and being pushed is an opportunity to grow and become better than you were yesterday. Such a person is less stressed and able to achieve more.</p>
<blockquote>
<p>This growth mindset is based on the belief that your basic qualities are things you can cultivate through your efforts, your strategies, and help from others. Although people may differ in every which way—in their initial talents and aptitudes, interests, or temperaments—everyone can change and grow through application and experience.</p>
</blockquote>
<p>This book has hit very close to home. I considered myself to have above-average intellect as a kid. I was praised as a smart kid. I also considered myself to be not athletic and not disciplined. While I have learned over the next decade and a half how much effort counts, the old lies of a &quot;fixed mindset&quot; are still whispering away and have more influence on my actions than I'd care to admit.</p>
<p>The idea that we can be a mix of growth and fixed makes sense to me. I can see areas of my life: (math, introversion, athleticism) where I have been moved from fixed to growth by the challenges of parents, teachers, or a positive experience. As I am in a new season of leadership and caring for my family, I hope to use some of these tools to be more intentional of putting off a fatal fixed mindset.</p>
<p>I think that some of the stratagems in this book align wisdom from scripture, but the base psychology is more self-centered in motivation. I think it's compatible with a God-centric worldview, if you reconsider things from a biblical perspective.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#code" aria-hidden="true" class="anchor" id="code"></a>Code</h3>
<h4><a href="#how-gatsby-generates-your-site-at-compile-time--josh-w-comeau" aria-hidden="true" class="anchor" id="how-gatsby-generates-your-site-at-compile-time--josh-w-comeau"></a>How gatsby generates your site at compile-time · Josh W Comeau</h4>
<p>I found <a href="http://middlemanapp.com">middleman</a> in 2012, and I have been loving static site builders ever since. I need to check out the newest crop of generators… I honestly just don't want to end up in Javascript-land. I'm stubborn.</p>
<blockquote>
<p>The idea that users can access dynamic data without a made-to-order database request is wild. Think about the weights that it takes off our shoulders:</p>
<ul>
<li>If the database falls over, and the team can't figure out why, it's not an emergency because the site is still up and chugging along.</li>
<li>If a developer deploys a change that messes up the GraphQL API, you won't be able to build a new version of the site, but the current version has already made all the requests it needs to, so it isn't affected.</li>
</ul>
<p>Your database servers could be teleported to an alternate dimension by an evil wizard, and your users wouldn't even know that there's a problem.</p>
</blockquote>
<p><a href="https://joshwcomeau.com/gatsby/a-static-future/">How gatsby generates your site at compile-time · Josh W Comeau</a></p>
<h4><a href="#listboxes-vs-dropdown-lists" aria-hidden="true" class="anchor" id="listboxes-vs-dropdown-lists"></a>Listboxes vs. Dropdown Lists</h4>
<p><img src="https://media.nngroup.com/media/editor/2020/03/05/1-final-listbox-matrix" alt="dropdowns vs listboxes" /></p>
<p>Following up on <a href="https://adrianroselli.com/2020/03/stop-using-drop-down.html">last month's link</a> about not using the word &quot;drop downs&quot; to mean <em>everything</em>, here's what they actually are and what they actually can be used for.</p>
<blockquote>
<p>Summary: Listboxes and dropdowns are compact UI controls that allow users to select options. Listboxes expose options right away and support multi-selection while dropdowns require a click to see options and support only single-selection.</p>
</blockquote>
<p><a href="https://www.nngroup.com/articles/listbox-dropdown/">Listboxes vs. Dropdown Lists</a></p>
<h4><a href="#radius-a-design-system-accelerator--rangleio" aria-hidden="true" class="anchor" id="radius-a-design-system-accelerator--rangleio"></a>Radius: A Design System Accelerator | Rangle.io</h4>
<p>I'm not sure I want this yet, but it's a cool tool.</p>
<blockquote>
<p>The Radius DS is a collection of open-source tools and libraries that allow you to accelerate your design system. The choice of tools, their composition, and a set of foundational components guides you on how to build a constraint-based system.</p>
</blockquote>
<p><a href="https://rangle.io/radius/">Radius: A Design System Accelerator | Rangle.io</a></p>
<h4><a href="#how-im-using-shortcuts-and-data-jar-to-help-write-link-posts--chris-hannah" aria-hidden="true" class="anchor" id="how-im-using-shortcuts-and-data-jar-to-help-write-link-posts--chris-hannah"></a>How I’m Using Shortcuts and Data Jar To Help Write Link Posts – Chris Hannah</h4>
<blockquote>
<p>Last night I spent some time reading on my iPad, and I noticed a few articles that I might want to link to from my blog. Except I didn’t want to start creating drafts in iA Writer, or doing any manual work. I just wanted a way to remind myself that I want to link to this at some point.</p>
<p>[...]</p>
<p>So I came up with an idea of two shortcuts, one to store relevant data about the article I wanted to reference, and then another which I could use to select from the list and kick off a draft in iA Writer.</p>
</blockquote>
<p>In a way, I'm doing a <em>very</em> similar thing using plain-text and <a href="http://getdrafts.com/">Drafts</a>, but this is a very cool project. If nothing else, it's a great example how automation tools like Shortcuts allow almost anyone to create the application that they want to use.</p>
<p>Developers, be put on notice: Your URLschemes and Shortcuts integrations are part of your User Experience, and are <em>often</em> the reason I choose your app over another.</p>
<p><a href="https://blog.chrishannah.me/how-im-using-shortcuts-and-data-jar-to-help-write-link-posts/">How I’m Using Shortcuts and Data Jar To Help Write Link Posts – Chris Hannah</a></p>
<h3><a href="#ux" aria-hidden="true" class="anchor" id="ux"></a>UX</h3>
<h4><a href="#dont-listen-to-your-customers" aria-hidden="true" class="anchor" id="dont-listen-to-your-customers"></a>[Don’t] listen to your customers</h4>
<p>It is so important to listen past the initial &quot;reading&quot; of a statement to try and find the intent and meaning of a statement.</p>
<blockquote>
<ul>
<li>Your customers tend to make up stories to explain their behavior. This is the Press Secretary.</li>
<li>These stories tend to attribute behavior to attitudes, beliefs and preferences (e.g. “I care about my future”).</li>
<li>The stories tend to discount the choice environment’s influence on behavior (e.g. we don’t say, “the default made me do it”)</li>
<li>We’re not aware that any of this is going on. If anything, we are overconfident in our ability to reflect accurately on our behavior.</li>
</ul>
</blockquote>
<p><a href="https://www.uxbooth.com/articles/dont-listen-to-your-customers/">[Don’t] listen to your customers</a></p>
<h4><a href="#the-baymard-institute-a-glorious-evidence-based-trove-of-ux-best-practices" aria-hidden="true" class="anchor" id="the-baymard-institute-a-glorious-evidence-based-trove-of-ux-best-practices"></a>The Baymard Institute: A glorious, evidence-based trove of UX best practices</h4>
<blockquote>
<p>The full reports require payment (a la carte or through a subscription), but Baymard has also published more than 250 freely available articles on their site — each one containing a number of evidence-based recommendations.</p>
<p>Simply put, these articles are some of the best free resources out there for learning about concrete usability best practices. They’re one of my go-to recommendations for those new to UX design.</p>
</blockquote>
<p>Well, I feel rather foolish for not knowing about this. Already their <a href="https://baymard.com/blog/archive">UX archive</a> to my RSS reader, and you should too.</p>
<p><a href="https://medium.com/@seandexter1/the-baymard-institute-a-glorious-evidence-based-trove-of-ux-best-practices-189d839b1176">The Baymard Institute: A glorious, evidence-based trove of UX best practices</a></p>
<h3><a href="#business" aria-hidden="true" class="anchor" id="business"></a>Business</h3>
<h4><a href="#how-will-you-measure-your-life-by-clayton-christensen" aria-hidden="true" class="anchor" id="how-will-you-measure-your-life-by-clayton-christensen"></a>How Will You Measure Your Life? By Clayton Christensen</h4>
<p>I had not really heard of this man before his passing, but having read some of his writing I'm eager to learn more.</p>
<p>This article resonated with me greatly as a man trying to balance work and faith in a way that is consistent and effective.</p>
<blockquote>
<p>This past year I was diagnosed with cancer and faced the possibility that my life would end sooner than I’d planned. Thankfully, it now looks as if I’ll be spared. But the experience has given me important insight into my life.</p>
<p>I have a pretty clear idea of how my ideas have generated enormous revenue for companies that have used my research; I know I’ve had a substantial impact. But as I’ve confronted this disease, it’s been interesting to see how unimportant that impact is to me now. I’ve concluded that the metric by which God will assess my life isn’t dollars but the individual people whose lives I’ve touched.</p>
<p>I think that’s the way it will work for us all. Don’t worry about the level of individual prominence you have achieved; worry about the individuals you have helped become better people. This is my final recommendation: Think about the metric by which your life will be judged, and make a resolution to live every day so that in the end, your life will be judged a success.</p>
</blockquote>
<p>Clayton Christensen. <em><a href="https://hbr.org/2010/07/how-will-you-measure-your-life">How Will You Measure Your Life?</a></em>, Harvard Business Review. July 2010</p>
<h4><a href="#guide-to-internal-communication-the-basecamp-way" aria-hidden="true" class="anchor" id="guide-to-internal-communication-the-basecamp-way"></a>Guide to Internal Communication, the Basecamp Way</h4>
<blockquote>
<p>Companies don't have communication problems, they have miscommunication problems.</p>
</blockquote>
<p>While this is really long, there is a lot of great truth about communication in here. I would really like working at a company that operated this way. It is <em>very</em> anti-meeting and pro-writing.</p>
<p>Some highlights:</p>
<blockquote>
<p>Speaking only helps who’s in the room, writing helps everyone. This includes people who couldn't make it, or future employees who join years from now.</p>
</blockquote>
<p>This reminds me of <a href="https://www.hanselman.com/blog/DoTheyDeserveTheGiftOfYourKeystrokes.aspx">Scott Hanselman's limited keystrokes principle</a>.</p>
<blockquote>
<p>&quot;Now&quot; is often the wrong time to say what just popped into your head. It's better to let it filter it through the sieve of time. What's left is the part worth saying.</p>
</blockquote>
<p>This is just good counsel in general. The approach I'm attempting to make where I store <em>all</em> outgoing messages in drafts and process them at the end of the day is sort of building this into my world.</p>
<blockquote>
<p>Further, we take spacial context seriously. If we're discussing a specific task, we discuss it in the comment section below the task itself. If we're talking about a specific document, we discuss it in the comments attached to the document. Communications stay attached to the thing we're discussing. This provides the full story in one reliable place. The alternative is terrible - communication detached from the original source material, discussions all over the place, fragmented conversations missing entire chunks of time and detail, etc.</p>
</blockquote>
<p>This one piece has captured my thinking for several days. It's a common problem… I have one thread of conversation in JIRA, one in email with the Product Team, one in Slack with the developer, another backchannel private with one developer who has specific questions… I need to be more thoughtful about where I ask questions and start conversations spatially so as to not cause this problem for others.</p>
<p><a href="https://basecamp.com/guides/how-we-communicate">Guide to Internal Communication, the Basecamp Way</a></p>
<h3><a href="#random" aria-hidden="true" class="anchor" id="random"></a>Random</h3>
<h4><a href="#the-amish-health-care-system--slate-star-codex" aria-hidden="true" class="anchor" id="the-amish-health-care-system--slate-star-codex"></a>The Amish Health Care System | Slate Star Codex</h4>
<p>As always, Jason Alexander ends up with a <em>fascinating</em> look at a tiny microcosm of &quot;what if.&quot;</p>
<blockquote>
<p>But by some miracle, the US government played along and granted the Amish exemptions from all the usual health care laws. They don’t have to pay Medicare taxes or social security. They aren’t included in the Obamacare mandate. They can share health care costs the way they want, ignoring any regulations to the contrary. They are genuinely on their own.</p>
<p>They’ve ended up with a simple system based on church aid. Everyone pays tithes to their congregation (though they don’t call it that). The churches meet in houses and have volunteer leaders, so expenses minimal. Most of the money goes to “alms” which the bishop distributes to members in need. This replaces the social safety net, including health insurance. Most Amish go their entire life without needing anything else.</p>
</blockquote>
<p>How well does it work?</p>
<blockquote>
<p>The Amish outperform the English on every measured health outcome. 65% of Amish rate their health as excellent or very good, compared to 58% of English. Diabetes rates are 2% vs. 8%, heart attack rates are 1% vs. 6%, high blood pressure is 11% vs. 31%. Amish people go to the hospital about a quarter as often as English people, and this difference is consistent across various categories of illness (the big exception is pregnancy-related issues – most Amish women have five to ten children).</p>
</blockquote>
<p>His conclusions as to why this works so well for so cheaply are very intriguing, but here are my favorites:</p>
<blockquote>
<p>Second, the Amish are honorable customers. This separates them from insurance companies, who are constantly trying to scam providers however they can.
[...]
Fourth, the Amish never sue doctors. Doctors around Amish country know this, and give them the medically indicated level of care instead of practicing “defensive medicine”. If Amish people ask their doctors to be financially considerate – for example, let them leave the hospital a little early – their doctors will usually say yes, whereas your doctor would say no because you could sue them if anything went wrong. In some cases, Amish elders formally promise that no member of their congregation will ever launch a malpractice lawsuit.</p>
</blockquote>
<p>Finally and fascinatingly, a sense of stewardship guiding how spending is used.</p>
<blockquote>
<p>But for the Amish, those other people are their fellow church members and they feel an obligation to spend it wisely. For the English, the “other people” are faceless insurance companies, and we treat people who don’t extract as much money as possible from them as insufficiently savvy.</p>
</blockquote>
<p>If <em>any</em> of this is interesting, you should check out the whole article. It's worth it.</p>
<p><a href="https://slatestarcodex.com/2020/04/20/the-amish-health-care-system/">The Amish Health Care System | Slate Star Codex</a></p>
<h4><a href="#naqt--buzzword" aria-hidden="true" class="anchor" id="naqt--buzzword"></a>NAQT | Buzzword</h4>
<p>If you are looking for some quarantine fun, maybe give this trivia game a try.</p>
<p>It's quite fun, and even the easy level is <em>quite</em> hard.</p>
<blockquote>
<p>Buzzword is an exciting online game of knowledge and recall from NAQT, the leading provider of quiz bowl questions. Buzzword will challenge the depth and breadth of your knowledge in an engaging, audio-based format and let you compare your results with those of players at your level from around the world</p>
</blockquote>
<p><a href="https://www.naqt.com/buzzword/">NAQT | Buzzword</a></p>
<h4><a href="#the-most-dangerous-book-in-the-world--i-love-typography-ilt" aria-hidden="true" class="anchor" id="the-most-dangerous-book-in-the-world--i-love-typography-ilt"></a>The Most Dangerous Book in the World — I love Typography (ILT)</h4>
<p><img src="https://ilovetypography.com/img/2020/04/Tyndales-New-Testament-1525-g.jpg" alt="the frontispiece of the Gospel of St. Matthew in the Tyndale Bible" /></p>
<p>This is a beautiful article, celebrating the care and craft with which the first translators of the Bible put into their illegal, easily concealable Bible.</p>
<blockquote>
<p>While the Bible was being printed in secret, the loose lips of a tipsy workman at a local pub led to a raid on the print-shop, whereupon the unfinished Bibles were confiscated and destroyed. Tyndale managed to salvage a handful of loose sheets when he and his assistant William Roye made a run for it. Only 31 leaves of that first abortive 1525 edition have survived, and are held at the British Library.</p>
</blockquote>
<p><a href="https://ilovetypography.com/2020/04/20/the-most-dangerous-book-in-the-world/">The Most Dangerous Book in the World — I love Typography (ILT)</a></p>
<h4><a href="#hania-rani--f-major-on-vimeo" aria-hidden="true" class="anchor" id="hania-rani--f-major-on-vimeo"></a>HANIA RANI — F MAJOR on Vimeo</h4>
<iframe src="https://player.vimeo.com/video/397439878" width="100%" height="400" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
<p><a href="https://vimeo.com/397439878">HANIA RANI &mdash; F MAJOR</a> from <a href="https://vimeo.com/neels">Neels Castillon</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
<blockquote>
<p>Listening to Hania's music over and over, I began to dream of a single sequence shot that would follow her music floating in the wind of an unreal Icelandic landscape. I asked each dancer to give a personal interpretation of Hania's song. We were very lucky to succeed in this insane artistic performance despite the great cold (minus 7 celsius), it was such a moment of truth.</p>
</blockquote>
<p><a href="https://vimeo.com/397439878">HANIA RANI — F MAJOR on Vimeo</a></p> ]]></description>
    </item>
    <item>
       <title>Reworking my RSS Reading</title>
       <link>http://evantravers.com/articles/2020/04/15/reworking-my-rss-reading/</link>
       <pubDate>Wed, 15 Apr 2020 19:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/04/15/reworking-my-rss-reading/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/04/newsboat.png"></p><p>At the end of this month, my month's link post is going to be a little different. I'm changing all my note-taking systems under the hood… and I haven't rebuilt <a href="/articles/2020/03/04/how-i-auto-generate-books-and-links-posts/">my link sharing automation</a>. Yet.</p>
<h2><a href="#reeder--inoreader-to-newsboat" aria-hidden="true" class="anchor" id="reeder--inoreader-to-newsboat"></a>Reeder + Inoreader to Newsboat</h2>
<p>Prompted by Jeremy from Take On Rules<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>, I changed up the way I read blogs. For <em>years</em> I've been using the excellent <a href="http://reederapp.com">Reeder</a> to read RSS both on my phone and on my computer. I have <em>no</em> complaints with it. It is a <strong>great</strong> app. Unless you are a command-line geek, you should use Reeder. I used <a href="https://inoreader.com/">Inoreader</a> as the syncing engine, so that my unread count was always in sync between my computers and phone. I am a <em>big</em> fan of owning the stream of news coming into your life, so if you haven't tried this before (read: weren't active around the time Google Reader was alive) using tools like these to build your own newsfeed is very useful.</p>
<p>However, I've been trying to wean myself from the &quot;just checks&quot;<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup> on my phone… and Reeder has long been the <strong>number one thing</strong> I flip open when I have ten seconds to spare. After nearly a decade, it is time to change that.</p>
<p>Like Jeremy, I am switching to <a href="https://newsboat.org/">Newsboat</a>, which I can <em>only</em> access on a computer, hopefully reducing phone-addiction<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>3</a></sup>. I'm excited to own my news reading system, and hopefully to start writing some <a href="https://newsboat.org/releases/2.19/docs/newsboat.html#_bookmarking">bookmark scripts</a> that feed the rest of my note taking system.</p>
<p>I'm syncing the <code>cache.db</code> sqlite file back and forth with Dropbox, and so far it works well, as long as you <a href="https://github.com/newsboat/newsboat/issues/884">stick to either XDG or dotdir style folders</a>.</p>
<p>It's only been a few days, but I really like Newsboat. Part of it is just the novelty of change, but it does check several of my boxes: Owning my data. Customizable and scriptable. Based on plain text. I'm surprised that I didn't try this before.</p>
<p>I find that the combination of raw text makes it really scannable. I <em>want</em> to be more interested in essays over press releases, I find myself bookmarking more thoughtful articles than before.</p>
<p><img src="https://images.evantravers.com/articles/2020/04/search.png" alt="search for &quot;ux design&quot;" /></p>
<p>The search is <em>awesome</em>. The ability to boot it up, and find the link that I saw not that long ago? It's really fast in Newsboat.</p>
<p>I found a few tweaks that you'll definitely want to try in your config file (most of these came from <a href="https://takeonrules.com/2020/04/12/switching-from-inoreader-to-newsboat-for-rss-reader/">Jeremy's original post</a>:</p>
<p>First some general quality of life settings.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1"># Hide feeds where all the items are read.
</div><div class="line" data-line="2">show-read-feeds no
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"># Make the text width readable
</div><div class="line" data-line="5">text-width 50
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"># Use multiple threads to download all the news faster.
</div><div class="line" data-line="8">reload-threads 11
</div></code></pre>
<p>Setting the browser... there are a number of different ways to do this, but on OSX this is the cleanest that I have found. If you directly use the exectuable in the package (as I have seen some others do) you may get error messages trickling back into Newsboat. This seems to work 100% of the time without the weird errors and warnings.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1"># set browser for osx
</div><div class="line" data-line="2">browser /usr/bin/open -a &quot;/Applications/Brave Browser.app&quot; &#39;%u&#39;
</div></code></pre>
<p>Borrowing and expanding from an article I found <a href="https://forums.freebsd.org/threads/newsboat-rss-reader-enable-vim-key-bindings.69448/">here</a>, here's some config that will make newsboat behave more like vim for reading purposes.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1"># unbind keys
</div><div class="line" data-line="2">unbind-key ENTER
</div><div class="line" data-line="3">unbind-key j
</div><div class="line" data-line="4">unbind-key k
</div><div class="line" data-line="5">unbind-key J
</div><div class="line" data-line="6">unbind-key K
</div><div class="line" data-line="7">unbind-key ^D
</div><div class="line" data-line="8">unbind-key ^U
</div><div class="line" data-line="9">unbind-key o
</div><div class="line" data-line="10">unbind-key g
</div><div class="line" data-line="11">unbind-key G
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"># bind keys - vim style
</div><div class="line" data-line="14">bind-key j down
</div><div class="line" data-line="15">bind-key k up
</div><div class="line" data-line="16">bind-key l open
</div><div class="line" data-line="17">bind-key h quit
</div><div class="line" data-line="18">bind-key ^D pagedown
</div><div class="line" data-line="19">bind-key ^U pageup
</div><div class="line" data-line="20">bind-key b toggle-source-view
</div><div class="line" data-line="21">bind-key U toggle-show-read-feeds
</div><div class="line" data-line="22">bind-key u show-urls
</div><div class="line" data-line="23">bind-key g home
</div><div class="line" data-line="24">bind-key G end
</div><div class="line" data-line="25">bind-key b open-in-browser-and-mark-read
</div><div class="line" data-line="26">bind-key B open-in-browser
</div><div class="line" data-line="27">bind-key i sort
</div><div class="line" data-line="28">bind-key I rev-sort
</div></code></pre>
<h2><a href="#defeating-collectors-fallacy" aria-hidden="true" class="anchor" id="defeating-collectors-fallacy"></a>Defeating collector's fallacy.</h2>
<p>My goal is to be more intentional with my reading and sharing. Christian over at zettelkasten.de calls what I have been doing <a href="https://zettelkasten.de/posts/collectors-fallacy/">collector's fallacy</a>:</p>
<blockquote>
<p>There’s a tendency in all of us to gather useful stuff and feel good about it. To collect is a reward in itself. As knowledge workers, we’re inclined to look for the next groundbreaking thought, for intellectual stimulation: we pile up promising books and articles, and we store half the internet as bookmarks, just so we get the feeling of being on the cutting edge.</p>
</blockquote>
<p>I have been <em>very</em> guilty of this. I want to be more intentional and less… graze-y with my media consumption, and I think it's time to trim the fat on the RSS. I pruned some old feeds, feeds that haven't interested me in a while, and hid any feed that is 100% press releases. I can always find it if I need it, but being able to hide them is <em>awesome</em><sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>4</a></sup>.</p>
<p>I am still working on what a more intentional sharing system will look like, but this month I'll probably pull all the link notes for this month using the new script <a href="https://github.com/evantravers/smz">smz</a> that I'm working on with some folks on github: <code>smz s -t link | xargs cat | pbcopy</code>.</p>
<p>I normally store all my dotfiles in my dotfiles repo… but I'm not yet comfortable sharing my <code>urls</code> file with the universe. As it is, you can see my current <code>config</code> file <a href="https://gist.github.com/f85745f2c1113142f7b542f96da03d25">here</a>.</p>
<blockquote>
<p>With Newsboat, I’m able to continue using RSS. I can now consider leaving a paid subscription (which is certainly using my data as part of the surveillance capitalism paradigm). I had explored using NetWireNews, which provides a nice GUI, but didn’t quite work for me.</p>
</blockquote>
<blockquote>
<p>I also get the ability to write scripts against the entire ecosystem. I can specify the directory for the SQLite cache database, the file to use for URLs, and where to save the plain text articles.</p>
</blockquote>
<p><a href="https://takeonrules.com/2020/04/12/switching-from-inoreader-to-newsboat-for-rss-reader/">Switching from Inoreader to Newsboat for RSS Reader // Take on Rules</a></p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Switching from Inoreader to Newsboat for RSS Reader // Take on Rules <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>This idea is from <a href="https://shawnblanc.net/2016/01/margin-for-creativity/">Shawn Blanc's excellent article &quot;Margin for Creativity&quot;</a>. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-3">
<p>All that's left on my phone is Instapaper for articles I have intentionally chosen to peruse, and Kindle for reading books. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-4">
<p>In Newsboat you can have a <a href="https://newsboat.org/releases/2.19/docs/newsboat.html#_tagging">hidden tag</a> by prefixing with a <code>!</code>. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: March</title>
       <link>http://evantravers.com/articles/2020/04/01/books-and-links-march/</link>
       <pubDate>Wed, 01 Apr 2020 00:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/04/01/books-and-links-march/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/04/panorama.jpg"></p><p>Hey friends. This is a strange season of life. I hope you and yours are well.
My little family is safe and blessed... and other than our fears for our
friends we are quite happy. I happened to have taken a couple trips in
February... and as an introvert I'm kind of set for the present. :P</p>
<p>I'm in the middle of a big ol' refactor of my rituals and systems.. and I'm
trying to stay off social media to try and remain postive and focused on
gratitude.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#foucalts-pendulum-by-umberto-eco" aria-hidden="true" class="anchor" id="foucalts-pendulum-by-umberto-eco"></a>Foucalt's Pendulum by Umberto Eco</h3>
<blockquote>
<p>I believe that what we become depends on what our fathers teach us at odd
moments, when they aren’t trying to teach us. We are formed by little scraps
of wisdom.</p>
</blockquote>
<p>This was a strange read. I wish I had known earlier that the iPhone kindle app
has translation services built in, that would have made it easier.</p>
<p>I'm not sure how it makes me feel. It makes me feel uneasy, lost in its
mystery, but am I supposed to be? Am I trapped like Jacobo and Causabon, having
stared too long into the abyss that I can't escape? It doesn't help that I'm
presently worrying about pandemic, sifting through fake news and clues to try
and determine the fate of my little world.</p>
<p>It makes me wonder if it's a metaphor for some meme: Conspiracy theories.
Violence. Religion. I suppose the ideas of the violent, occult conspiratorial
Templars cover all of the above. It's a subtle andd broad enough metaphor to
cause allow him to aim his prosaic bullets at <em>everyone</em>.</p>
<p>I confess to having read it because it's one of the most abandoned books on GoodReads.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3>
  <a href='https://adrianroselli.com/2020/03/stop-using-drop-down.html'>Stop Using ‘Drop-down’</a>
</h3>
<p><strong>PREACH</strong>.</p>
<p>This <strong>so</strong> accurately portrays a conflict I have every day. Drop-down is far
too vague a phrase… and I love how Adrian goes on to give us alternatives.</p>
<p><a href="https://adrianroselli.com/2020/03/stop-using-drop-down.html">Read more...</a></p>
<h3>
  <a href='https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/'>How to Write a Note That You Will Actually Understand • Zettelkasten Method</a>
</h3>
<blockquote>
<p>Don’t just expect that you can understand yourself in a couple of years. At
least I had some difficulty to do so. Make it easy for your future self.</p>
</blockquote>
<p><a href="https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/">Read more...</a></p>
<h3>
  <a href='http://www.paulgraham.com/useful.html'>How to Write Usefully</a>
</h3>
<blockquote>
<p>What should an essay be? Many people would say persuasive. That's what a lot
of us were taught essays should be. But I think we can aim for something more
ambitious: that an essay should be useful.</p>
</blockquote>
<p>This is a <em>lovely</em> article about writing. I know that much of what I release
doesn't stand up to this standard, but I'd like it to someday.</p>
<p>Many gems like most Paul Graham articles... like this one.</p>
<blockquote>
<p>You need humility to measure novelty, because acknowledging the novelty of an
idea means acknowledging your previous ignorance of it.</p>
</blockquote>
<p><a href="http://www.paulgraham.com/useful.html">Read more...</a></p>
<h3>
  <a href='https://superorganizers.substack.com/p/seth-godin-hates-being-organized'>Seth Godin Hates Being Organized</a>
</h3>
<blockquote>
<p>Organizing is like building a case to hold your tools. You don’t get points
for making it fancy, you get points for doing the work.</p>
</blockquote>
<p><em>Very</em> convicting for me. I tend to overorganize and undership. This interview
is a good kick in the seat.</p>
<p><a href="https://superorganizers.substack.com/p/seth-godin-hates-being-organized">Read more...</a></p>
<h3>
  <a href='https://ethanmarcotte.com/wrote/a-design-system-darkly/'>Through a design system, darkly. — ethanmarcotte.com</a>
</h3>
<blockquote>
<p>That said, I think it’s high time organizations start creating their design
systems with a more process-led approach. Rather than starting with design
patterns, we need to looking at the ways our teams currently work, and then
identifying how a design system would function within that broader
organizational context.</p>
</blockquote>
<p>This aligns with how I've been thinking of a Design System... it's a tool of
communication or process, rather than an artifact of prescription.</p>
<p><a href="https://ethanmarcotte.com/wrote/a-design-system-darkly/">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>My Current Bullet Journal Layout</title>
       <link>http://evantravers.com/articles/2020/03/30/my-current-bullet-journal-layout/</link>
       <pubDate>Mon, 30 Mar 2020 18:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/03/30/my-current-bullet-journal-layout/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2020/03/old-journal.jpg"></p><p>Taking some time this afternoon to close down my third bullet journal notebook
and open up my fourth. While the practice of journaling has gone through
countless iterations for me over the past five years I continue to rely upon
handwritten prose to help me clarify what is really important and review the
blessings and struggles of my life. Here are some of the influences and reasons
that my journal has taken this month's form.</p>
<h2><a href="#weekly-layout" aria-hidden="true" class="anchor" id="weekly-layout"></a>Weekly Layout</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2020/03/weekly-layout.png" alt="">
  <figcaption></figcaption>
</figure>
<p>I think that this is currently layout v7 since I started bullet journaling. I
often tweak things from month to month, but this particular setup has been
stable for about six months. I had three goals for this layout: first, to
identify and focus on what moves the needle. Second, to help me work on habits
that will get me closer to my goals, Third, to give me a place to evaluate and
remember what has happened.</p>
<p>That's all there is to it. Dead simple.</p>
<p>I love my new weekly layout. While I did like the ritual of getting out a ruler
and painstakingly make a layout… the new one is focused, and just requires 20
seconds and a pen. No ruler, no level spot… I am free to start a new week
anywhere I am, I don't need 15 minutes of prep work.</p>
<h3><a href="#goals" aria-hidden="true" class="anchor" id="goals"></a>Goals</h3>
<p>I'm borrowing heavily from a many wiser people: The idea of committing to the
most important task a day ahead comes from <a href="https://shawnblanc.net/2015/06/the-note/">Shawn Blanc's The
Note</a>. The idea of identifying major
themes that &quot;move the needle&quot; comes from <a href="https://www.macsparky.com/blog/2019/5/moving-the-needle">David Sparks' Moving the
Needle</a>. I borrowed
the circle &quot;UI&quot; from the amazing <a href="https://www.thethemesystem.com/">Theme
System</a> journal.</p>
<p>The current plan: I determine the three most important themes on the last hour
of the previous Friday… the projects that actually move me towards my life
goals. Each day, I determine the most important task of the next day, and write
it next to the day header for the next day.</p>
<p>This hopefully provides some structure for how I approach the day. When I sit
down to log my habits each day, those Big Three themes and The Note greet me
first thing, before email or slack. If I stick to the ritual, I usually have a
good day. If I forget or am lazy… I can tell my productivity suffers and I
close less of my Big Three circles.</p>
<h3><a href="#habits" aria-hidden="true" class="anchor" id="habits"></a>Habits</h3>
<p>I use a very simple habit tracker that just pays attention to my most important
habits that I'm focusing on for this year. I'll add &quot;guest star&quot; habits
periodically.</p>
<h3><a href="#notes" aria-hidden="true" class="anchor" id="notes"></a>Notes</h3>
<p>This uses normal bullet journal conventions, with a few custom bits. It often
has a list of events or meetings (signified by a circle) with a link the other
side of the journal. After the event, I try to put a summary or takeaway in
parenthesis. I also make heavy use of smiley faces to give myself a rough
history of my mood, and to draw attention to wonderful small things that
increase my gratitude. (A lot have to do with my family… little jokes and
memories. It generally improves my mood to look back over the week and see the
little lovely things God put in there.)</p>
<h2><a href="#year-layout" aria-hidden="true" class="anchor" id="year-layout"></a>Year Layout</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2020/03/year-layout.png" alt="">
  <figcaption></figcaption>
</figure>
<p>This one is new for me. I found myself going back through the week pages to see
how my habits are doing and to figure out what happened in each week, so I
threw together a simple index of the weeks to make this easier.</p>
<p>While still in it's infancy for me, I still use it a lot. I could see working
this style of summary into an Index page too… but I like reading them all in a
row.</p>
<p>This has already been handy once during review season... it was easier to read
back and find the weeks that had the most context about work projects that I
wanted documented in a review.</p>
<h2><a href="#random-tips" aria-hidden="true" class="anchor" id="random-tips"></a>Random Tips</h2>
<h3><a href="#leave-your-notebook-early" aria-hidden="true" class="anchor" id="leave-your-notebook-early"></a>Leave your notebook early.</h3>
<p>Don't do the thing where you have like three pages left, and you nurse them for
a straight month, choosing to not write things down because you are afraid you
won't have enough room for &quot;something important.&quot;</p>
<p>End the notebook with four or five pages left, just start a new one. <em>Very</em>
freeing.</p>
<h3><a href="#keep-restarting-your-practice" aria-hidden="true" class="anchor" id="keep-restarting-your-practice"></a>Keep restarting your practice.</h3>
<p>Looking back at the past year that this journal represents… I can directly see
a correlation between higher stress levels and reduced journaling and
reviewing. I don't believe it's really the writing that is beneficial, but the
reading and reflection.</p>
<p>Just keep getting back to it, it is worth it.</p>
<h3><a href="#summaries-are-powerful" aria-hidden="true" class="anchor" id="summaries-are-powerful"></a>Summaries are powerful.</h3>
<p>If you are like me and record everything whether it's useful or not, having
indexes and summaries can make your notebook much more accessible and useful.
In addition, the act of reviewing and rewriting that which you deem to be
important is a useful and calming mental practice in itself. They say you don't
know something until you teach it to someone… writing a summary of your own
thoughts is like teaching yourself in the future.</p>
<p>If you have any sort of index or list of things… consider adding a tweet-length
description of what it is you are &quot;linking&quot; to. Not only will it make recall
easier, it'll provide an opportunity to teach yourself the value of it.</p>
<h3><a href="#stickers-doodles-and-stick-ins-are-the-real-memories" aria-hidden="true" class="anchor" id="stickers-doodles-and-stick-ins-are-the-real-memories"></a>Stickers, doodles, and &quot;stick ins&quot; are the real memories.</h3>
<p><img src="https://images.evantravers.com/articles/2020/03/new-journal.jpg" alt="new journal" /></p>
<p>To be honest… I think I'm mostly going to miss the rad stickers in #3. I am
looking forward to seeing what 2020 brings this journal… starting with this Ron
Swanson I picked up in San Diego. He's going to remind me that in the end all
that matters is <em>doing</em> the work that matters, not writing about it.</p> ]]></description>
    </item>
    <item>
       <title>Simple Markdown Zettelkasten: Drafts.app</title>
       <link>http://evantravers.com/articles/2020/03/19/simple-markdown-zettelkasten-drafts-app/</link>
       <pubDate>Thu, 19 Mar 2020 21:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/03/19/simple-markdown-zettelkasten-drafts-app/</guid>
       <description><![CDATA[ <p><video
src="https://images.evantravers.com/articles/2020/03/zettel.mp4"
controls=controls
poster="https://images.evantravers.com/articles/2020/03/zettel-poster.png"></p>
<div class="admonition tldr">
<p>I wrote a <a href="https://actions.getdrafts.com/g/16J">Drafts Action Group</a> to manipulate MMD metadata and build workflows from Drafts to my Simple Markdown Zettelkasten.</p>
</div>
<p><a href="http://getdrafts.com/">Drafts.app</a> is one of the most used apps on my phone.</p>
<p>I use Drafts heavily to take notes during meetings or sermons, store thoughts and quotes from books, comment on links from the web, or just record my own thoughts about the world.</p>
<p>Some assumptions:</p>
<ul>
<li>I use Drafts purely as a capture tool. I don't permanently store the zettel in Drafts, I save them to Dropbox.</li>
<li>I won't browse my zettel archive in Drafts, so it doesn't have to be able to follow a freelink.<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup></li>
</ul>
<p>Working backwards from the &quot;data structure&quot; of a Simple Markdown Zettelkasten to the implementation proved to be the thing I had been missing all this time. I started re-writing individual actions for all the different kinds of notes I post, but quickly realized that I was re-writing the same js scripts for &quot;get the title&quot; or &quot;update a metadata field&quot;.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2020/03/zettelkasten utilities.png">
  <figcaption>
    By unchecking the radio buttons for visibility, I can create a "library" action that empowers and simplifies all the other actions.
  </figcaption>
</figure>
<p>While there wasn't built in functions for dealing with Multimarkdown metadata, Drafts Action steps <a href="https://forums.getdrafts.com/t/is-there-an-easy-way-to-getting-or-set-mmd-metadata-easily-in-scripts/6949/4">can share variables</a>, so I ended up rewriting a lot of my shared code into one &quot;hidden&quot; script Action called &quot;Zettelkasten Utilities.&quot; This action just instantiates a few javascript functions that make dealing with the MMD metadata easier, and then future actions can use them. If you want, you can read <a href="https://gist.github.com/evantravers/63f4edcd147d660cad9705d435e01cab">the current source code here</a>.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup></p>
<p>The other trick was so <em>obvious</em> I wish I had done it earlier. Testing a Draft action can involve a <strong>lot</strong> of tedious clicking back in and out of the Drafts Actions panel. For a bit I was editing the Action on one laptop, and testing on another. Then I had taken to copying a function out into a Chrome console to tweak and play with it… finally I up and made a &quot;test.js&quot; file and wrote some basic tests using <code>console.assert()</code> to work my way through some of the edge cases, just running it using nodeJS. <em>Much</em> better.</p>
<p>The file changed a lot as I was testing, but here's a stub demonstrating the <code>console.assert()</code> statements and a mock Draft object. (The only thing I had to change between Drafts and nodeJS was to comment out when I called a Drafts specific call like <code>Draft.update()</code>.)</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// mock</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newDraft</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`Creating a note
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  Most of the time, we don&#39;t have the #time or #focus to do all the work to store a note.
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">  That&#39;s where automation is wonderful. Saving #time.`</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// &lt; .. implementation .. &gt;</span>
</div><div class="line" data-line="14">
</div><div class="line" data-line="15"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// test</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">newDraft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">assert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;metadata is empty&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">assert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;body is content&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21">
</div><div class="line" data-line="22"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_extract_tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="23"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">log</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>With this library in place, writing two specific actions for my most common use cases became much easier and robust.</p>
<h2><a href="#saving-a-zettel" aria-hidden="true" class="anchor" id="saving-a-zettel"></a>Saving a Zettel</h2>
<p>The first problem to solve is simply transforming a normal draft into a Simple Markdown Zettelkasten. With the help of the &quot;library,&quot; this is simple. (I actually wrote this as &quot;pseudocode&quot; and then implemented the functions later.)</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// courtesy of drdrang</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(underline, underline);">https://forums.getdrafts.com/t/specify-draft-title/6469/7</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cleanTitle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">toLowerCase</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">z</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">9</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\s</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">\s</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;-&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/wiki/archive/&quot;</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`$&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> $&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cleanTitle</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.md`</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_update_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;id&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_extract_tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">db</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Dropbox</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">db</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;append&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alert</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Couldn&#39;t save to &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>I owe <code>cleanTitle(title)</code> to the awesome <a href="https://leancrew.com/all-this/">drdrang</a>. All the magic is in the library file. <code>zk_title()</code> will grab the title either from the metadata or the Draft title and <code>zk_extract_tags()</code> goes through the whole draft finding any <code>#hashtags</code> and moving them to the <code>tags:</code> MMD metadata. Quick and easy.</p>
<p>You could expand/change this Action to respond to tags within Drafts.app. For instance, I will likely add a conditional to add tags based on whether this note has to do with my day job.</p>
<p>As it is, we have stable IDs based on the Draft creation date, way to pull out tags… we are ready to implement more complex flows.</p>
<h2><a href="#book-notes" aria-hidden="true" class="anchor" id="book-notes"></a>Book Notes</h2>
<p>I actually started here with the book note, which is the place that I first really saw the value of this flow <a href="/articles/2019/09/28/world-of-textfiles-daily-use/#booknotes">back when I implemented it using vimwiki's file structures</a>.</p>
<p>There are two Actions, &quot;Add Book…&quot; and &quot;Cite Book…&quot;.</p>
<h3><a href="#add-book" aria-hidden="true" class="anchor" id="add-book"></a>Add Book</h3>
<p>First we need some record of books that I'm currently listening to or reading. This one actually uses no part of the Zettelkasten library. It just prompts the user to fill in some data and puts it into a template found in another Draft.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;UUID of Template&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// create new draft and assign content/tags</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;template&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Prompt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTextField</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTextField</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;author&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Author&#39;s Name&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Last Name, First Name&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTextField</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;publisher&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Publisher&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Unknown Publisher&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTextField</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;year&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Year Published&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;2020&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addButton</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Confirm&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buttonPressed</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="22">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setTemplateTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title_text&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="23">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setTemplateTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;author_text&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;author&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="24">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setTemplateTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;publisher_text&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;publisher&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="25">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setTemplateTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;year_text&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;year&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="26">
</div><div class="line" data-line="27">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">processTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="28">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">
</div><div class="line" data-line="30">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// load new draft</span>
</div><div class="line" data-line="31">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">editor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">load</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="32">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">editor</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="33"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>The template is really simple.</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">title: [[title_text]]
</div><div class="line" data-line="2">author: [[author_text]]
</div><div class="line" data-line="3">publisher: [[publisher_text]]
</div><div class="line" data-line="4">year: [[year_text]]
</div><div class="line" data-line="5">id: [[created|%Y%m%d%H%M%S]]
</div></code></pre>
<p>That's it. I believe this Action is heavily copied from <a href="https://actions.getdrafts.com/a/1PD">New from Template</a> by @hinnerkhaardt.</p>
<h3><a href="#cite-book" aria-hidden="true" class="anchor" id="cite-book"></a>Cite Book</h3>
<p>I typically am reading or listening to a couple books at a time. I will jot down thoughts and file them after the listening session. Before, I would just append them to one giant book note, but that's not the <a href="https://zettelkasten.de/posts/when-start-new-note/">zettelkasten way</a>.</p>
<p>Now that we have a few books loaded, we can use their metadata to generate a citation, and because the IDs are stable based on the Draft creation date, we can link them even though they haven't been written to the archive yet.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// The following just builds a prompt to choose a book.</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">workspace</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Workspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Booknotes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknotes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">workspace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">query</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;inbox&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bookTitles</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknote</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknotes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bookTitles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknote</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title: &quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Prompt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addLabel</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Choose booknote:&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addSelect</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;selectBook&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Book:&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bookTitles</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="20">
</div><div class="line" data-line="21"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addButton</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Choose Book&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="24">
</div><div class="line" data-line="25"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// After we&#39;ve chosen a book</span>
</div><div class="line" data-line="26"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buttonPressed</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="27">
</div><div class="line" data-line="28">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bookIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknotes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">findIndex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bk</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bk</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">includes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;selectBook&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">booknotes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bookIndex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="30">
</div><div class="line" data-line="31">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// - Adds a citation to the book to the current note.</span>
</div><div class="line" data-line="32">
</div><div class="line" data-line="33">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_get_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;author&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="34">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_get_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">publisher</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_get_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;publisher&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="36">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_get_metadata</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;year&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="37">
</div><div class="line" data-line="38">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">. _$&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_. $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">publisher</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">, $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">year</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="39">
</div><div class="line" data-line="40">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// - Links the current note to the ID of the booknote.</span>
</div><div class="line" data-line="41">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[$&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]] $&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="42">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="43">
</div><div class="line" data-line="44">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// - Adds a link to this zettel in the main booknote, if there’s a title, uses that as a summary</span>
</div><div class="line" data-line="45">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[[$&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]] $&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">zk_title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span>
</div><div class="line" data-line="46">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">book</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="47"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Here's an example of a zettel where I cited a book I'm reading:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">tags: #stress, #effort, #mindset, #cool
</div><div class="line" data-line="2">id: 2020313101825
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">Many people believe that perfection should be effortless. This unreasonable
</div><div class="line" data-line="5">expectation causes stress.
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">A report from researchers at Duke University sounds an alarm about the
</div><div class="line" data-line="8"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">anxiety and depression among female undergraduates who aspire to “effortless
</div><div class="line" data-line="9"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">perfection.” They believe they should display perfect beauty, perfect
</div><div class="line" data-line="10"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">womanhood, and perfect scholarship all without trying (or at least without
</div><div class="line" data-line="11"></span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">appearing to try). [41][^mindset]
</div><div class="line" data-line="12"></span>
</div><div class="line" data-line="13">I wonder if this is related to the popular trope that &quot;cool guys&quot; don&#39;t care,
</div><div class="line" data-line="14">or don&#39;t have to try. Over and over in 80s movies you have characters that do
</div><div class="line" data-line="15">not seem to exert any effort to win, it just comes naturally.
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">[[2020313101751 cool isnt new.md]]
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">[^mindset]: Dweck, Carol S., _Mindset: the New Psychology of Success_.
</div><div class="line" data-line="20">  Ballantine Books, 2016.
</div></code></pre>
<p>And here's the link it created in the note about the book:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1">[[2020313101825]] Many people believe that perfection should be effortless. This unreasonable expectation causes stress.
</div></code></pre>
<p>And just like that… we've got a single zettel note with the full context of our singular thought, linked automagically to a note about the book. You could just as easily use <code>&lbrace;&lbrace;multimarkdown transclusion&rbrace;&rbrace;</code> syntax to build back the giant file, it's all up to you!</p>
<h2><a href="#where-to-now" aria-hidden="true" class="anchor" id="where-to-now"></a>Where to now?</h2>
<p>I can write and tag zettels easily, save them to my archive… nothing is stopping me from building my archive till I hit that legendary point where it starts generating ideas for me (hopefully). This is a good little mobile inbox for my system, and I'm going to stop tweaking and start writing.</p>
<p>I may find myself writing some more actions for diary style entries and for sermon notes. I also have a hankering to write a simple Dropbox search that is able to build a file link based on a simple file search... but it can wait.</p>
<p>At this point, I'm going to be spending some time brushing up on my vim-based browsing/editing scripts. I'll probably start with implementing a script that finds notes with no backlinks so that I can start processing that &quot;inbox&quot; for unlinked notes. More to come I'm sure…</p>
<p>If you found any of this useful, or you've already been down this road, I'd love to hear from you. <a href="/contact">Drop me a line</a> or hit me up on <a href="http://twitter.com/evantravers">twitter</a>.</p>
<p>I posted the <a href="https://actions.getdrafts.com/g/16J">Zettelkasten Action Group</a> to the Drafts Actions Directory.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>As I hinted at in my last post, 1Writer is <em>perfect</em> for that. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-2">
<p>At some point, I'd like to put it into a module and export the functions under a namespace, but this will do for now. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Simple Markdown Zettelkasten</title>
       <link>http://evantravers.com/articles/2020/03/13/simple-markdown-zettelkasten/</link>
       <pubDate>Fri, 13 Mar 2020 16:14:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/03/13/simple-markdown-zettelkasten/</guid>
       <description><![CDATA[ <p><em><strong>Update</strong>: I've updated my recommendation to use YML frontmatter instead of MultiMarkdown and plain titles. More <a href="/articles/2021/09/28/simple-markdown-zettelkasten-1-5/">here</a>.</em></p>
<p>As I've lurked productivity twitter I've noticed that a <em>lot</em> of the digital
Zettelkasten<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup> systems that I've seen fall into two categories: ones using
markdown plain text files, and ones using a dedicated tool like
Roam/Notion/Evernote. Systems using markdown files can differ wildly given
the needs of the particular user, and their favorite text editor.</p>
<p>As I've tried to build my own system my goals were simplicity and portability.
I want files that are compatible with different apps and editors, so that I can
easily take my knowledge-base <em>anywhere</em>.</p>
<p>After intense research I discovered my &quot;new&quot; idea is an old idea<sup class="footnote-ref"><a href="#fn-7" id="fnref-7" data-footnote-ref>2</a></sup>. Here is a
modified version of what the experts at Zettelkasten.de say is be the most
compatible markdown format for plain-text Zettelkasten files:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Pursuit of perfection causes anxiety</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tags</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#stress, #effort, #mindset, #cool</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">Many people believe that perfection should be effortless. This unreasonable expectation causes stress.
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; </span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">A report from researchers at Duke University sounds an alarm about the anxiety and depression among female undergraduates who aspire to “effortless perfection.” They believe they should display perfect beauty, perfect womanhood, and perfect scholarship all without trying (or at least without appearing to try). [41][^mindset]
</div><div class="line" data-line="9"></span>
</div><div class="line" data-line="10">I wonder if this is related to the popular trope that &quot;cool guys&quot; don&#39;t care, or don&#39;t have to try. Over and over in 80s movies you have characters that do not seem to exert any effort to win, it just comes naturally.
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">[[cool-people-are-bored.md]]
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">[^mindset]: Dweck, Carol S. _Mindset: the New Psychology of Success_.  Ballantine Books, 2016.
</div></code></pre>
<p>There is more detail about the parts of a <a href="https://zettelkasten.de/posts/baseline-zettelkasten-software-reviews/">simple markdown zettelkasten over at
zettelkasten.de</a>.
<em>Edit:</em> There is more argument for using YML frontmatter in a <a href="http://evantravers.com/articles/2020/11/23/zettelkasten-updates/">later post</a>.</p>
<h2><a href="#implementation-details" aria-hidden="true" class="anchor" id="implementation-details"></a>Implementation Details</h2>
<h3><a href="#connections" aria-hidden="true" class="anchor" id="connections"></a>Connections</h3>
<p>In the original paper implementation<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>3</a></sup>, notes relate to other notes by
proximity, and by a ID-powered link.</p>
<p>In a digital format you have a couple different ways to relate notes: Folders,
Links, and Tags. I won't concern myself too much with folders in this document…
I will probably have a very flat file structure, only occasionally using
folders for very specific domains (work vs. home, etc.)</p>
<h4><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h4>
<p>Markdown has a syntax for making a link via <code>[link text](url/or/path/to/file)</code>.
While this is great, I have found that it's nice to have a separate syntax
specifically for the in-archive links between notes.<sup class="footnote-ref"><a href="#fn-5" id="fnref-5" data-footnote-ref>4</a></sup></p>
<p>Although it's not part of the official markdown spec, it seems a fair number of
major editors<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>5</a></sup> support &quot;wikilink&quot; or <a href="http://meatballwiki.org/wiki/FreeLink">&quot;freelink&quot;
style</a> links (e.g., <code>[[link]]</code>). The
ones that don't<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>6</a></sup> are more prose-writing centric rather than notes databases,
so I feel pretty comfortable continuing down this path.</p>
<p>Some of these editors prefer links without the file extension (just the
filename/title), and some support the file extension. For maximum backwards
compatibility, I recommend the full filename and extension.</p>
<h4><a href="#tags" aria-hidden="true" class="anchor" id="tags"></a>Tags</h4>
<p>There are many different ways to represent a tag<sup class="footnote-ref"><a href="#fn-9" id="fnref-9" data-footnote-ref>7</a></sup>, but using <code>#hashtags</code>
inside of MMD/YAML front matter is the most compatible implementation.</p>
<p>The incredibly organized <a href="https://twitter.com/sirupsen">@sirupsen</a> is using
<a href="https://superorganizers.substack.com/p/how-to-build-a-learning-machine">#hashtag
style</a>
in the body of the zettel, but that can conflict with the markdown syntax for a
header, so I'm worried about the ramifications<sup class="footnote-ref"><a href="#fn-6" id="fnref-6" data-footnote-ref>8</a></sup>. Putting the hashtags into
the frontmatter dodges this issue by keeping them outside the normal
markdown, while still letting some apps search for and take advantage of the
common hashtag format<sup class="footnote-ref"><a href="#fn-10" id="fnref-10" data-footnote-ref>9</a></sup>.</p>
<h2><a href="#its-just-files" aria-hidden="true" class="anchor" id="its-just-files"></a>Its just files</h2>
<p>I am constantly distracted by lovely tools 😈.  One lovely thing about
implementing zettelkasten as flat text files is that you can <a href="https://www.xkcd.com/378/">technically work
it by hand</a>…</p>
<p>Since I've been paralyzed too long by trying to build/discover the perfect
tooling, I am going to just start building my &quot;archive&quot;. By hand. Then I will
slowly develop tooling to enable what I do most often. On desktop, I am
perfectly able to use vim to create, edit, and search files quickly. I'm just
going to start, and build tools as I need them.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<p>I've been scouring my own old wiki for references… here are links I used while
researching and putting this together.</p>
<h3><a href="#general-information-about-what-is-a-zettelkasten" aria-hidden="true" class="anchor" id="general-information-about-what-is-a-zettelkasten"></a>General Information about what is a Zettelkasten</h3>
<h4><a href="#building-blocks-of-a-zettelkasten" aria-hidden="true" class="anchor" id="building-blocks-of-a-zettelkasten"></a><a href="https://zettelkasten.de/posts/zettelkasten-building-blocks/">Building Blocks of a Zettelkasten</a></h4>
<blockquote>
<p>There’s a thing called “Zettelkasten”, and then there’s you using it. The
former is the toolkit, the latter is your application of a method.</p>
</blockquote>
<p><em>Required Reading</em>. If any of this intrigues you, this is where I think you
should start.</p>
<h4><a href="#how-to-take-smart-notes-a-step-by-step-guide" aria-hidden="true" class="anchor" id="how-to-take-smart-notes-a-step-by-step-guide"></a><a href="https://www.nateliason.com/blog/smart-notes">How to Take Smart Notes: A Step-by-Step Guide</a></h4>
<p>A review of a book about a particular implementation of a Zettelkasten system
for taking notes. There's some key points in here about <em>how</em> to run this
system.</p>
<h4><a href="#baseline-zettelkasten-software-reviews" aria-hidden="true" class="anchor" id="baseline-zettelkasten-software-reviews"></a><a href="https://zettelkasten.de/posts/baseline-zettelkasten-software-reviews/">Baseline Zettelkasten Software Reviews</a></h4>
<p>This article helped me understand what it is that I'm trying to build, and
largely influenced the direction I'm headed in.</p>
<h4><a href="#zettelkasten--how-one-german-scholar-was-so-freakishly-productive" aria-hidden="true" class="anchor" id="zettelkasten--how-one-german-scholar-was-so-freakishly-productive"></a><a href="https://writingcooperative.com/zettelkasten-how-one-german-scholar-was-so-freakishly-productive-997e4e0ca125">Zettelkasten — How One German Scholar Was So Freakishly Productive</a></h4>
<p>A popular medium post about zettelkasten. Generally good infio.</p>
<h4><a href="#you-only-find-what-you-have-identified" aria-hidden="true" class="anchor" id="you-only-find-what-you-have-identified"></a><a href="https://zettelkasten.de/posts/add-identity/">You Only Find What You Have Identified</a></h4>
<p>The importance of identifiers in the Zettelkasten archive.</p>
<h4><a href="#how-to-write-a-note-that-you-will-actually-understand" aria-hidden="true" class="anchor" id="how-to-write-a-note-that-you-will-actually-understand"></a><a href="https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/">How to Write a Note That You Will Actually Understand</a></h4>
<p>Not only good advice for writing ZK, but generally technical writing.</p>
<h4><a href="#when-should-you-start-a-new-note" aria-hidden="true" class="anchor" id="when-should-you-start-a-new-note"></a><a href="https://zettelkasten.de/posts/when-start-new-note/">When Should You Start a New Note?</a></h4>
<p>A helpful flowchart of when to write a new note, when to split a long note,
etc. Interesting context for how a zettelkasten works in practice.</p>
<h4><a href="#manage-citations-for-a-zettelkasten" aria-hidden="true" class="anchor" id="manage-citations-for-a-zettelkasten"></a><a href="https://zettelkasten.de/posts/bibliography-zettelkasten/">Manage Citations for a Zettelkasten</a></h4>
<h4><a href="#luhmanns-zettelkasten-with-devonthink" aria-hidden="true" class="anchor" id="luhmanns-zettelkasten-with-devonthink"></a><a href="http://www.organizingcreativity.com/2013/09/luhmanns-zettelkasten-with-devonthink/">Luhmann’s Zettelkasten with DEVONthink</a></h4>
<p>There are other ways to build a inter-woven linked archive. Here's one.</p>
<h3><a href="#markdown-specific-implementations" aria-hidden="true" class="anchor" id="markdown-specific-implementations"></a>Markdown-Specific Implementations</h3>
<h4><a href="#using-nvalt-as-a-zettel-note-archive" aria-hidden="true" class="anchor" id="using-nvalt-as-a-zettel-note-archive"></a><a href="https://zettelkasten.de/posts/nvalt-zettelkasten-implementation/">Using nvALT as a Zettel Note Archive</a></h4>
<p>If you don't already have a preferred text editor, but this idea fascinates you, you should probably just use nvALT. Very helpful for anyone thinking about setting up a ZK.</p>
<h4><a href="#vim-zettel" aria-hidden="true" class="anchor" id="vim-zettel"></a><a href="https://github.com/michal-h21/vim-zettel">vim-zettel</a></h4>
<p>Very cool package built on top of fzf and vimwiki.</p>
<h4><a href="#renerocksaisublime_zk" aria-hidden="true" class="anchor" id="renerocksaisublime_zk"></a><a href="https://github.com/renerocksai/sublime_zk">renerocksai/sublime_zk</a></h4>
<p>A very robust package for sublime text. Popular on the zettelkasten.de forums.</p>
<h4><a href="#how-to-make-yourself-into-a-learning-machine" aria-hidden="true" class="anchor" id="how-to-make-yourself-into-a-learning-machine"></a><a href="https://superorganizers.substack.com/p/how-to-build-a-learning-machine">How to Make Yourself Into a Learning Machine</a></h4>
<p>A look into how one zettelkasten fan uses his system to expand his learning
power. Some links to some very customized viml scripts to make his system flow.</p>
<h4><a href="#httpsdocszettlrcomenguidesguide-zettelkasten" aria-hidden="true" class="anchor" id="httpsdocszettlrcomenguidesguide-zettelkasten"></a><a href="https://docs.zettlr.com/en/guides/guide-zettelkasten/">https://docs.zettlr.com/en/guides/guide-zettelkasten/</a></h4>
<p>How zettlr (an OSS note taking app) can be used for ZK. Obviously by the name,
it's designed a little bit for this.</p>
<h4><a href="#some-thoughts-on-how-to-keep-a-zettelkasten" aria-hidden="true" class="anchor" id="some-thoughts-on-how-to-keep-a-zettelkasten"></a><a href="https://trms.me/some-thoughts-on-how-to-keep-a-zettelkasten/">Some Thoughts on How to Keep a Zettelkasten</a></h4>
<p>A great post on how this writer uses iA Writer to build his ZK.</p>
<h2><a href="#supported-zettelkasten-specific-editors" aria-hidden="true" class="anchor" id="supported-zettelkasten-specific-editors"></a>Supported Zettelkasten-Specific Editors</h2>
<p>Being markdown plain text editors, all of these &quot;support&quot; all the features… but
which ones have built-in tooling to search? This is by <em>no</em> means an exhaustive
list, just the ones that I tested.</p>
<p>If there's ones I'm missing, feel free to <a href="/contact">message me</a> and I'll add
them to the table. I know there's some org-mode/emacs afficiandos out there who
have some amazing stuff.</p>
<table>
  <colgroup>
    <col/>
    <col/>
    <col/>
    <col/>
    <col/>
    <col/>
  </colgroup>
  <thead>
    <tr>
      <th> Editor </th>
      <th colspan="2"> Link Styles </th>
      <th colspan="3"> Tag Styles </th>
      <th> Notes </th>
    </tr>
    <tr>
      <th> </th>
      <th> Freelink </th>
      <th> Other </th>
      <th> Hashtag </th>
      <th> MMD </th>
      <th> Other </th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td> <a href="https://github.com/vimwiki/vimwiki">nvim + vimwiki</a> </td>
      <td> ✅ </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> ❌ </td>
      <td> <code>:tag:</code>, same as org-mode </td>
      <td> Vim being vim, you can adjust or grep for any string, so #tag or front matter will work, it&#8217;s just not built in. </td>
    </tr>
    <tr>
      <td> <a href="https://github.com/michal-h21/vim-zettel">nvim + vimwiki + vim-zettel</a> </td>
      <td> ✅ </td>
      <td> Vim&#8217;s capability </td>
      <td> ❌ </td>
      <td> ❌ </td>
      <td> <code>:tag:</code>, same as org-mode </td>
      <td> Pretty robust… especially for the backlinks. </td>
    </tr>
    <tr>
      <td> <a href="https://github.com/renerocksai/sublime_zk">sublime text 3 + sublime_zk</a> </td>
      <td> ✅ </td>
      <td> Vim&#8217;s capability </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> </td>
      <td> Seems super well put together… very cool. </td>
    </tr>
    <tr>
      <td> <a href="https://getdrafts.com/">Drafts.app</a> </td>
      <td> ❌ </td>
      <td> drafts:// URLscheme </td>
      <td> ❌ </td>
      <td> ❌ </td>
      <td> Built-in tags </td>
      <td> More for capturing information than storing it, but you could do it if you wanted. Drafts.app lists documents by the first line in the document, so while it supports MMD front matter, <a href="https://forums.getdrafts.com/t/toggle-title-metadata/4091">it makes the title look strange</a>. </td>
    </tr>
    <tr>
      <td> <a href="https://bear.app/">Bear.app</a> </td>
      <td> ✅ </td>
      <td> ✅ </td>
      <td> ✅ </td>
      <td> ✅ </td>
      <td> n/a </td>
      <td> Honestly… as this app seems to check so many of the options, I&#8217;m surprised I haven&#8217;t given it a better go. </td>
    </tr>
    <tr>
      <td> <a href="https://brettterpstra.com/projects/nvalt/">nvAlt</a> </td>
      <td> ✅ </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> ❌ </td>
      <td> Stores tags in database </td>
      <td> The search and interface is very good. </td>
    </tr>
    <tr>
      <td> <a href="http://nvultra.com/">nvUltra</a> </td>
      <td> ✅ </td>
      <td> urlScheme </td>
      <td> ❌ </td>
      <td> ✅ </td>
      <td> n/a </td>
      <td> Still in beta… seems very promising. Has a super powerful &#8220;related notes&#8221; feature that I think is nearly ideal for this. </td>
    </tr>
    <tr>
      <td> <a href="https://zettelkasten.de/the-archive/">The Archive.app</a> </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> </td>
      <td> The OG zettelkasten application.</td>
    </tr>
    <tr>
      <td> <a href="https://zettlr.com/">Zettlr</a> </td>
      <td> ✅ </td>
      <td> n/a </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> </td>
      <td> This seems like a cool tool. </td>
    </tr>
    <tr>
      <td> <a href="http://1writerapp.com/">1Writer</a> </td>
      <td> ✅ </td>
      <td> iOS urls </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> ❌ </td>
      <td> </td>
    </tr>
    <tr>
      <td> <a href="https://obsidian.md/">obsidian</a> </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td> ✅ </td>
      <td> ❌ </td>
      <td></td>
      <td>Supports a graph mode like roam research.</td>
    </tr>
  </tbody>
</table>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>For this document, I'm not going to try to define what the Zettelkasten system or practice is, there are <a href="https://zettelkasten.de/">entire blogs</a> and <a href="https://www.youtube.com/results?search_query=zettelkasten">YouTube videos</a> dedicated to this topic. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-7">
<p>I thought I was being very clever… I had originally written this long argument for structuring files this way, but it turns out that <a href="https://zettelkasten.de/posts/baseline-zettelkasten-software-reviews/">the answer has been there</a> all along. <a href="#fnref-7" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-2">
<p>I'm not really an expert, I only know as much as can be known by reading blog posts on the subject. I haven't taken a course or read the book. <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-5">
<p>It makes searching for in-archive links a lot simpler… imagine you want to write a regex for searching for all notes that link to the current note… it's a lot easier if you can assume that all in-archive links follow freelink syntax. Some editors go a step further and the text within a freelink is actually more of a search than a file link. (I think The Archive does this.) <a href="#fnref-5" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
<li id="fn-3">
<p>I tested: vimwiki, Bear, nvAlt, nvUltra, <a href="https://actions.getdrafts.com/a/1Tg">Drafts with a custom action</a> and 1Writer <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="5" aria-label="Back to reference 5">↩</a></p>
</li>
<li id="fn-4">
<p>Editors that don't support free links include: Drafts, Vim's default markdown syntax, iA Writer, and Ulysses <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="6" aria-label="Back to reference 6">↩</a></p>
</li>
<li id="fn-9">
<p>In my current files, I have been lightly using vimwiki style tags (I think they get them from mediawiki?) They look like <code>:this:</code>. I don't like writing the regex for these tags, and I can't find <em>anything</em> but vimwiki that supports them. <a href="#fnref-9" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="7" aria-label="Back to reference 7">↩</a></p>
</li>
<li id="fn-6">
<p><a href="https://github.com/markedjs/marked/issues/201">This issue</a> here shows some of the issues that can arise when you allow this in markdown. <a href="#fnref-6" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="8" aria-label="Back to reference 8">↩</a></p>
</li>
<li id="fn-10">
<p><a href="https://nvultra.com/help/tagging-and-metadata">NvUltra uses MMD style front matter for tags</a>, and offers syncing them to OS X metadata so you can search in spotlight, which is <em>very</em> cool. 1Writer uses the #hashtag format for it's built in tag search. I stole my solution from <a href="https://zettelkasten.de/posts/1writer-note-archive-ipad-iphone/">prolific ZK blogger Christian uses a combo of MMD and hashtag</a>, which I may adopt since 1Writer is pretty nifty on the iPhone. <a href="#fnref-10" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="9" aria-label="Back to reference 9">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>How I Auto-Generate Books and Links Posts</title>
       <link>http://evantravers.com/articles/2020/03/04/how-i-auto-generate-books-and-links-posts/</link>
       <pubDate>Wed, 04 Mar 2020 15:58:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/03/04/how-i-auto-generate-books-and-links-posts/</guid>
       <description><![CDATA[ <blockquote>
<p>I’m assuming you have a cool tool that keeps track of these things when you
read them? And that you’ve already done a post on it (which I somehow can’t
find)?</p>
<p>— <a href="https://twitter.com/classic_katie/status/1235200734527922176" class="u-in-reply-to">Katie Ford (@classickatie)</a></p>
</blockquote>
<p>Well, I did mention it <a href="http://evantravers.com/articles/2019/09/28/world-of-textfiles-daily-use/#links">briefly I
think</a>,
but I've never described it in detail.</p>
<div class="admonition tldr">
<div class="admonition__title">Everything I want to read goes to Instapaper. An IFTTT automation makes</div>
<p>a file in my dropbox every time I favorite, highlight, or comment an article in
Instapaper. I run a script on my computer to scoop up the links for the month,
and format them for a blog post.</p>
</div>
<h2><a href="#before" aria-hidden="true" class="anchor" id="before"></a>Before</h2>
<p>I used to have all my favorite sites in a giant folder in my Firefox bookmarks.
After I discovered the wonders of Google Reader (RIP!), I moved most of those
self-updating blogs and sites into my RSS reader... but I was left with an
archive of Neat Things I Think May Be Useful in that folder. I eventually moved
that into the wonderful delicious.com (RIP!) until it's sudden but inevitable
demise.</p>
<p>I also at some point set up some kind of integration where I automatically
posted everything I starred to twitter. That explains my ridiculously high
tweet count, and for anyone who was following me at that time... I am deeply
sorry.</p>
<p>Over the past few years, I've used <a href="http://instapaper.com/">Instapaper</a> to
save and read <em>all</em> incoming links. I'd comb through social media and my RSS
reader, anything that caught my attention would go to instapaper where I could
read the chosen few.</p>
<p>At some point, I realized blowing up twitter with <em>everything</em> I thought was
interesting was probably frustrating. I unfollow people who do that, why would
I do that?</p>
<p>I also didn't have a long term place to store This Might Be Useful Someday
links, so I was just using folders in Instapaper, which worked well until they
launched their premium pricing which took away search and unlimited
highlights.<sup class="footnote-ref"><a href="#fn-pricing" id="fnref-pricing" data-footnote-ref>1</a></sup></p>
<h2><a href="#now" aria-hidden="true" class="anchor" id="now"></a>Now</h2>
<p>When Instapaper changed their pricing, I just really gotten into their
highlight system. It made finding the quote or part of the page easier to find.
I had also started reading about zettelkasten, and it fit the need well. I also
had been slowly trying to wean my knowledge system from web-services and move
it to plain text I could own and take with me wherever I go... so I whipped up
a simple <a href="http://ifttt.com">ifttt.com</a> applet:</p>
<p><img src="https://images.evantravers.com/articles/2020/03/ifttt.png" alt="ifttt settings" /></p>
<p>The result is a giant folder of everything I've liked in Instapaper!</p>
<p><img src="https://images.evantravers.com/articles/2020/03/finder.png" alt="finder with files" /></p>
<p>As a developer, I have tons of tools for filtering, finding, and relating words
in plain text. If I'm going to start researching about starting a design system
at work, I can <code>rg</code> the whole folder for any files that contain the words
&quot;design system.&quot; I can further filter to files also containing the words &quot;tool&quot;
if I'm looking for tooling to help. It's been <em>very</em> powerful.</p>
<p>The zettelkasten method involves both recording the quote you found useful, and
the <em>thought</em> that the quote/content inspired in your mind. Recording the
inspiration is the key thought, even if it's as simple as &quot;I can use x to do y
later.&quot; If nothing else, it's more key words for your full-text search. An
example:</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">Daniel Gross on productivity - Marginal REVOLUTION
</div><div class="line" data-line="2">
</div><div class="line" data-line="3">&gt; The longer you think about a task without doing it, the less novel it becomes
</div><div class="line" data-line="4">&gt; to do [...] my solution is to (somewhat counter-intuitively) not think about
</div><div class="line" data-line="5">&gt; the task until I am ready to fully execute it. I do not unwrap the piece of
</div><div class="line" data-line="6">&gt; gum until I’m ready to enjoy it in its entirety. I need to save the fun of
</div><div class="line" data-line="7">&gt; thinking to pull myself into flow.
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">This is a very interesting idea. I can see the value of it, especially as I
</div><div class="line" data-line="10">over-engineer a todo task.
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">January 28, 2020 at 01:07PM
</div><div class="line" data-line="13">via Instapaper https://marginalrevolution.com/marginalrevolution/2020/01/daniel-gross-on-productivity.html
</div></code></pre>
<p>At some point I started blogging again, and inspired by
<a href="http://daringfireball.net">Gruber</a> and others decided to start putting links
and commentary on my blog. The first was built manually... but I quickly
started writing a script. The descriptions I had been adding to each link
provided the commentary that I needed to make the linkpost be a little bit more
meaningful than just &quot;I read this. Here.&quot;</p>
<p>When it's the end of the month, I run <code>bundle exec middleman article &quot;Books and Links: February&quot;</code> to generate a blog post. I then edit it in vim, running <code>read !elixir get_links.ex</code>, thus pulling the result of the script into the file.</p>
<p>Don't laugh, it's overly complicated. Here's a tour:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">defmodule</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">GetLinks</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moduledoc</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># &lt;... abbreviated ...&gt;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">run</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;&quot;
</div><div class="line" data-line="8">    ---
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">    title: &quot;Books and Links: &lt;month&gt;&quot;
</div><div class="line" data-line="11">    date:
</div><div class="line" data-line="12">    tags: reading, books, links
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">    ---
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">    &quot;&quot;&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span>
</div></code></pre>
<p>Middleman relies on <a href="https://middlemanapp.com/basics/frontmatter/">YAML
frontmatter</a> to drive some of the
features. I print some out for consistency.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;## Books</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;-</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Path</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expand</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~/dropbox/wiki/booknotes/2020&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="3">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ls!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=~</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~</span>r/<span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>txt<span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>md/<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is_current_month?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stat!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:local</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print_reference</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span>
</div></code></pre>
<p>I also make reviews for books that I read... there's another <a href="/articles/2019/09/28/world-of-textfiles-daily-use/#booknotes">whole
workflow</a> for
recording that that has been updated since that post. This snippet just dumps
them under the right heading. I usually edit out most of the notes and leave
the high-level review at the top.</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1">
</div><div class="line" data-line="2">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;## Links</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">with</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;-</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cd</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Path</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">expand</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;~/dropbox/wiki/links&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="4">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ls!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=~</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~</span>r/<span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span>txt/<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">is_current_month?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">month</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">stat!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">time: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:local</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print_reference</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">IO</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>This does the same thing for the links.</p>
<p>There's some more I've concealed (although the full script is linked below,)
but the bulk of the script is extracting the title, content, and link, and
printing it into a markdown format, like this:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">build_markdown</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link: </span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">_</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;&quot;
</div><div class="line" data-line="3">    &lt;h3&gt;
</div><div class="line" data-line="4">      &lt;a href=&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/a&gt;
</div><div class="line" data-line="5">    &lt;/h3&gt;
</div><div class="line" data-line="6">
</div><div class="line" data-line="7">    </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">    [Read more...](</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">link</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">    &quot;&quot;&quot;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>While writing this post, I'm seeing a good possibilty of a refactor ahead,
especially with the hardcoded year in the books section, but that can wait.</p>
<p>These days, I just read on instapaper. If I find something I want to keep, I
favorite it. A few moments later, I'll edit the file (often in the Dropbox.app
on my iPhone,) adding some commentary or quotes that I like.</p>
<p>At the end of the month, I'll run this script, and then edit the resulting
file. I'll cut out some links that are redundant or I can't picture anyone else
wanting, add some images or videos if relevant, rewrite the booknotes for
public use, and push to S3.</p>
<p>I'd like to automate this further, letting the site self-publish on <code>git push</code>,
but that can come later.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://gist.github.com/evantravers/642bdcc6a95d5ba8dfc2cb3c4f5ee9f6">The full get_links.ex script.</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-pricing">
<p>As some of you have realized, 75% of my problems would be solved
simply by paying for Instapaper. I probably will end up doing just that. It's
a fantastic product. The highlights system is pretty much 99% of what I want,
and it has lots of integrations. If I was willing (and by writing this, I'm
persuading myself) to pay for premium, I could cut out a lot of steps when it
comes to notating the links, but I actually like that this hack led me down
the path of writing my own commentary and including quotes manually, I think
it makes me be a little more particular about what I spend my time saving. <a href="#fnref-pricing" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: February</title>
       <link>http://evantravers.com/articles/2020/02/29/books-and-links-february/</link>
       <pubDate>Sat, 29 Feb 2020 17:41:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/02/29/books-and-links-february/</guid>
       <description><![CDATA[ <h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#digital-minimalism-by-cal-newport" aria-hidden="true" class="anchor" id="digital-minimalism-by-cal-newport"></a>Digital Minimalism by Cal Newport</h3>
<blockquote>
<p>Digital Minimalism A philosophy of technology use in which you focus your
online time on a small number of carefully selected and optimized activities
that strongly support things you value, and then happily miss out on
everything else.</p>
</blockquote>
<p>I've been slogging at this one for a bit... the first part is basically an
extended version of the same story from Deep Work, but then eventually it
opens up into a compelling series of arguments to detach from screen addiction
and embrace a healthy and vigorous personal leisure time. I enjoyed it, after
I got through the first third.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3>
  <a href='https://daverupert.com/2020/01/the-web-is-industrialized-and-i-helped-industrialize-it/'>The Web is Industrialized and I helped industrialize it</a>
</h3>
<blockquote>
<p>Often the concise description of the problem is the solution. It can of
course be improved, but not bad for two minutes of work. But it only works if
people feel they have autonomy and are a part of a cohesive team. Otherwise,
they'll go rogue.</p>
</blockquote>
<p>This is a great design system pulse check for where we are as an industry.</p>
<p><a href="https://daverupert.com/2020/01/the-web-is-industrialized-and-i-helped-industrialize-it/">Read more...</a></p>
<h3>
  <a href='https://marginalrevolution.com/marginalrevolution/2020/02/the-smart-phone-as-pacifier.html'>The smart phone as pacifier - Marginal REVOLUTION</a>
</h3>
<blockquote>
<p>In other words, in a sense, smartphones are not unlike adult pacifiers. This
psychological comfort arises from a unique combination of properties that
turn smartphones into a reassuring presence for their owners: the portability
of the device, its personal nature, the subjective sense of privacy
experienced while on the device, and the haptic gratification it affords.</p>
</blockquote>
<p>Well, this is terrifying.</p>
<p><a href="https://marginalrevolution.com/marginalrevolution/2020/02/the-smart-phone-as-pacifier.html">Read more...</a></p>
<h3>
  <a href='http://www.paulgraham.com/noob.html'>Being a Noob</a>
</h3>
<blockquote>
<p>But if the feeling of being a noob is good for us, why do we dislike it? What
[...] purpose could such an aversion serve?</p>
</blockquote>
<p><a href="http://www.paulgraham.com/noob.html">Read more...</a></p>
<h3>
  <a href='https://adactio.com/journal/16369'>Architects, gardeners, and design systems</a>
</h3>
<blockquote>
<p>In that light, design systems take their place in a long history of
dehumanising approaches to manufacturing like Taylorism. The priorities of
scientific management are the same as those of design systems increasing
efficiency and enforcing consistency.</p>
</blockquote>
<p>Ouch.</p>
<p><a href="https://adactio.com/journal/16369">Read more...</a></p>
<h3>
  <a href='https://css-tricks.com/innovation-cant-keep-the-web-fast/'>Innovation Can't Keep the Web Fast | CSS-Tricks</a>
</h3>
<blockquote>
<p>If we're to make progress in making a faster web for everyone, we must
recognize some of the impediments to that goal:</p>
<ul>
<li>The relentless desire to monetize every square inch of the web, as well as
the army of third party vendors which fuel the research mandated by such
fevered efforts.</li>
<li>Workplace cultures that favor unrestrained feature-driven development.
This practice adds to but rarely takes away from what we cram down the wire
to users.</li>
<li>Developer conveniences that make the job of the developer easier, but can
place an increasing cost on the client</li>
</ul>
</blockquote>
<p><a href="https://css-tricks.com/innovation-cant-keep-the-web-fast/">Read more...</a></p>
<h3>
  <a href='https://dev.to/richharris/a-new-technique-for-making-responsive-javascript-free-charts-gmp'>A new technique for making responsive, JavaScript-free charts</a>
</h3>
<p>This is pretty doggone rad. What a unique way of doing charts... I wonder how
performant it is with multiple charts on the page?</p>
<p><a href="https://dev.to/richharris/a-new-technique-for-making-responsive-javascript-free-charts-gmp">Read more...</a></p>
<h3>
  <a href='https://twitter.com/skuwamoto/status/1223300834332639233'>Twitter Thread from @skuwamoto on the line between product manager and product designer</a>
</h3>
<p>This is a question me and my colleagues have been wrestling over for a while...
this thread has a lot of great resources and thoughts.</p>
<p><a href="https://twitter.com/skuwamoto/status/1223300834332639233">Read more...</a></p>
<h3>
  <a href='https://adamsilver.io/articles/building-an-accessible-autocomplete-control/'>Building an accessible autocomplete control by Adam Silver | Designer, London, UK.</a>
</h3>
<p>This is a great resource for building a typeahead or autocomplete. I especially
like he walks you through it step by step, explaining both the reasoning and
the code.</p>
<p>He even has a good demo
<a href="https://nostyle.herokuapp.com/examples/autocomplete">here</a>.</p>
<p><a href="https://adamsilver.io/articles/building-an-accessible-autocomplete-control/">Read more...</a></p>
<h3>
  <a href='https://toggl.com/programming-princess/'>Git the Princess!</a>
</h3>
<p>I love <a href="http://toggl.com">toggl</a> and this delightful comic only makes it
better.</p>
<p>H/T to
<a href="https://twitter.com/codinghorror/status/783423066084823040">@codinghorror</a></p>
<p><a href="https://toggl.com/programming-princess/">Read more...</a></p>
<h3>
  <a href='https://adactio.com/journal/16400'>Design systems roundup</a>
</h3>
<p>Given how many wonderful thinkers have weighed in on this topic in the past few
weeks I'm sure you've seen this, but it's a great resource.</p>
<blockquote>
<p>There's a big difference between having smart, reusable patterns at your
disposal and creating a dictatorial culture designed to enforce conformity
and swat down anyone coloring outside the lines.</p>
</blockquote>
<p><a href="https://adactio.com/journal/16400">Read more...</a></p>
<h3>
  <a href='https://blog.jcoglan.com/2020/02/02/why-recursion-matters-part-1/'>Why recursion matters, part 1: proof by induction â The If Works</a>
</h3>
<blockquote>
<p>In Douglas Hofstadterâs classic book GÃ¶del, Escher, Bach , the
philosopher Zenointroduces his famous paradox by saying: Not the wind, not
the flagâneither oneâ¦</p>
</blockquote>
<p><a href="https://blog.jcoglan.com/2020/02/02/why-recursion-matters-part-1/">Read more...</a></p>
<h3>
  <a href='https://ethanmarcotte.com/wrote/the-design-systems-we-swim-in/'>The design systems we swim in. â ethanmarcotte.com</a>
</h3>
<blockquote>
<p>Which brings me back to my earlier question: when was the last time a design
system empowered you to make a decision about the best way to proceed?</p>
</blockquote>
<p><a href="https://ethanmarcotte.com/wrote/the-design-systems-we-swim-in/">Read more...</a></p>
<h3>
  <a href='https://mattstauffer.com/blog/setting-up-your-webcam-lights-and-audio-for-remote-work-podcasting-videos-and-streaming/'>Setting Up Your Webcam, Lights, and Audio for Remote Work, Podcasting, Videos, and Streaming</a>
</h3>
<p>Great resource for anyone with regular internet calls.</p>
<p>(H/T to @chevinbrown for the link)</p>
<p><a href="https://mattstauffer.com/blog/setting-up-your-webcam-lights-and-audio-for-remote-work-podcasting-videos-and-streaming/">Read more...</a></p>
<h3>
  <a href='https://superorganizers.substack.com/p/ceo-by-day-internet-sleuth-by-night'>CEO By Day. Internet Sleuth By Night.</a>
</h3>
<blockquote>
<p>Recently, I was up until midnight one night after I put my kids to bed, just
sitting there and doing research for no reason into the origins of a
particular quote.</p>
<p>And at the end of it, I found an answer that I don't think anyone else in the
world has ever found. And that's fun.</p>
</blockquote>
<p>As a rampant consumer of readily available information, this dedication to go
deeper, to uncover the truth is intriguing and somewhat convicting to me.</p>
<p><a href="https://superorganizers.substack.com/p/ceo-by-day-internet-sleuth-by-night">Read more...</a></p>
<h3>
  <a href='https://mtlynch.io/why-i-quit-google/'>Why I Quit Google to Work for Myself</a>
</h3>
<blockquote>
<p>February 28, 2018 12-minute read For the past four years, I've worked as a
software developer at Google. On February 1st, I quit.</p>
</blockquote>
<p>This is a good warning to those who think an 'unbiased fair system' can replace
a healthy line of communication about work and how people should be rewarded.</p>
<blockquote>
<p>I proudly and lovingly nursed the pipeline back to health. I fixed dozens of
bugs and wrote automated tests to make sure they wouldn't reappear. I deleted
thousands of lines of code that were either dead or could be replaced by
modern libraries. I documented the pipeline as I learned it so that the
institutional knowledge was available to my teammates instead of siloed in my
head.</p>
<p>The problem, as I discovered at promotion time, was that none of this was
quantifiable. I couldn't prove that anything I did had a positive impact on
Google.</p>
</blockquote>
<p>Yikes.</p>
<p><a href="https://mtlynch.io/why-i-quit-google/">Read more...</a></p>
<h3>
  <a href='https://www.nateliason.com/blog/smart-notes'>How to Take Smart Notes: A Step-by-Step Guide - Nat Eliason</a>
</h3>
<blockquote>
<p>The core idea of Smart Notes is that purely extracting highlights is
generally a waste of time. A highlight speaks to you when you take it, but if
you don't capture the idea that the highlight gave you, you're unlikely to
remember the importance of that highlight later. Or even if you do feel some
spark when revisiting the highlight, it might be a different interpretation.</p>
<p>If you've ever looked back at your book highlights and thought to yourself,
&quot;why did I highlight this?&quot; then you know what problem we're solving here.
And if you don't already take book highlights, even better! You're going to
dramatically level up your reading comprehension and retention.</p>
</blockquote>
<p>That's the cleanest description of the capturing part of zettelkasten I have
ever encountered.</p>
<p><a href="https://www.nateliason.com/blog/smart-notes">Read more...</a></p>
<h3>
  <a href='https://www.theatlantic.com/health/archive/2020/02/covid-vaccine/607000/'>Youâre Likely to Get the Coronavirus</a>
</h3>
<blockquote>
<p>COVID-19 is already reported to have killed more than twice that number. With
its potent mix of characteristics, this virus is unlike most that capture
popular attention: It is deadly, but not too deadly. It makes people sick,
but not in predictable, uniquely identifiable ways. Last week, 14 Americans
tested positive on a cruise ship in Japan despite feeling fine the new virus
may be most dangerous because, it seems, it may sometimes cause no symptoms
at all.</p>
</blockquote>
<p>The assertion that this virus could just be uncontained and we'd have a
COVID-19 season next to flu and cold season is kind of frightening. God is in
control of all things, but it is worrisome.</p>
<p><a href="https://www.theatlantic.com/health/archive/2020/02/covid-vaccine/607000/">Read more...</a></p>
<h3>
  <a href='https://open.nytimes.com/how-to-dox-yourself-on-the-internet-d2892b4c5954'>How to Dox Yourself on the Internet</a>
</h3>
<blockquote>
<p>A step-by-step guide to finding and removing your personal information from
the internet.</p>
</blockquote>
<p>I'm probably going to need this eventually.</p>
<p><a href="https://open.nytimes.com/how-to-dox-yourself-on-the-internet-d2892b4c5954">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Customizing a Keyboard Layout</title>
       <link>http://evantravers.com/articles/2020/02/22/customizing-a-keyboard-layout/</link>
       <pubDate>Sat, 22 Feb 2020 18:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/02/22/customizing-a-keyboard-layout/</guid>
       <description><![CDATA[ <blockquote>
<p>The following is an insane train of thought… and one that isn't completed
yet. I have had a few conversations recently about how to think through
customizing a keyboard layout, and I thought I'd just write stream of thought
notes while working on my current layout, and see if that is useful to anyone
out there. (By this I mean just George, Seth, and Kevin. Hi guys!)</p>
<p>I am honestly re-thinking things that shouldn't be re-thought. It is
<em>entirely</em> unnecessary for most people. Only fool around with this level of
tweakery if you really love messing with things and you have time to burn.</p>
<p>Still here? Ok…</p>
</blockquote>
<p>I'm pretty happy with the modified version of the OLKB Planck layout that I've
been using for a number of years. When I first got my Planck, I modified the
layout to have modifiers on both the RH and LH, and I use a separate finger on
each column for each modifier, and it works really well. I'm having to modify
this for my new <a href="https://blog.splitkb.com/blog/introducing-the-kyria">Kyria</a>
keyboard… because I'm trying to make use of the thumb mods effectively.</p>
<h2><a href="#parts-of-the-keymap" aria-hidden="true" class="anchor" id="parts-of-the-keymap"></a>Parts of the Keymap</h2>
<p>Modifying a keymap can be overwhelming. I tend to split up the keymap into some
constituent parts. Unless you get <em>really</em> crazy, you mostly only will be
changing the location and behavior of modifiers, and the location of special
characters.</p>
<h3><a href="#alphas" aria-hidden="true" class="anchor" id="alphas"></a>Alphas</h3>
<p>I use QWERTY for now. Because I have embraced ortholinear/columnar keyboards,
Every keyboard I own has at least a 3x10 grid that represents most of the
normal layout.</p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">/* Qwerty
</div><div class="line" data-line="2"> *
</div><div class="line" data-line="3"> * ,---------------------------------------.
</div><div class="line" data-line="4"> * | Q | W | E | R | T | Y | U | I | O | P |
</div><div class="line" data-line="5"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="6"> * | A | S | D | F | G | H | J | K | L | ; |
</div><div class="line" data-line="7"> * |---+---+---+---+---+---+---+---+---+---|
</div><div class="line" data-line="8"> * | Z | X | C | V | B | N | M | , | . | / |
</div><div class="line" data-line="9"> * `---------------------------------------&#39;
</div><div class="line" data-line="10"> */
</div></code></pre>
<p>I'm not really going to change that.<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>1</a></sup></p>
<p>(While not in this grid, there is the <code>'</code> and <code>\</code> character which appear in the
standard QWERTY layout too, and I usually do put those in the RH column in
their usual spots.)</p>
<h3><a href="#modifiers" aria-hidden="true" class="anchor" id="modifiers"></a>Modifiers</h3>
<p><img src="https://images.evantravers.com/articles/2020/02/orthomods.png" alt="ortho mods" /></p>
<p>On my grid/ortholinear keyboards, I simply have the mods at the bottom of each
column. It works <em>really</em> well, each mod has a LH and RH variant, and each mod
has a dedicated finger that can drop down to the bottom of the column to press
it.</p>
<p><img src="https://images.evantravers.com/articles/2020/02/kyriamods.png" alt="kyria mods" /></p>
<p>On my first staggered columnar keyboard, the Kyria, I'm starting to like the
thumb modifiers, especially for single keys. I'm also using some clever QMK
<a href="https://beta.docs.qmk.fm/features/feature_advanced_keycodes#mod-tap">&quot;modtap&quot;
functionality</a>
to have those keys function both as mods and as keys.</p>
<p>It's challenging to lay the mods out in a manner that allows for the major
mod chords: <code>⌘+⇧</code> and <code>⌘+⌥</code></p>
<p>With the way I currently have them laid out, <code>⌘+⌥</code> is a chord where I slab my
thumb across both rows, but <code>⌘+⇧</code> requires lifting a hand off home row in order
to do it one handed. I may have to have a LH pinky shift <em>just</em> for this case
(this is what the default keymap does,) but that seems inconsistent. Something
tells me there's a double tap or something that could make this easier… hmm…</p>
<p>I'd prefer to have identical modifiers on the left and right, although I'm not
sure that's possible or a good idea. I know with the CRKBD (which I should note
I don't have, but I'm thinking purchasing eventually,) this is basically
<strong>impossible</strong>. I want to be able to press all my keyboard shortcuts with just
the LH side for design work and that sort of thing… although maybe this is a
layer problem not an identical mods problem.</p>
<h3><a href="#numbers" aria-hidden="true" class="anchor" id="numbers"></a>Numbers</h3>
<p><img src="https://images.evantravers.com/articles/2020/02/orthonums.png" alt="ortho nums" /></p>
<p>I like 40% keyboards… by necessity, this means the number row is under a layer.
I especially like having a row of numbers layered under <code>q</code> to <code>p</code>, and another
ten key style number thing in the RH. If you stagger it right on some boards,
you can connect the 789 on both ten key and row to make it consistent. Fancy.</p>
<h3><a href="#special-characters-or-symbols" aria-hidden="true" class="anchor" id="special-characters-or-symbols"></a>Special Characters or Symbols</h3>
<p>When I'm using a board that relies on thumb shifting, I am starting to be
persuaded that I ought to be able to press <em>every</em> symbol from one layer
without having to hit shift or other modifiers… I have found I don't like
moving my thumb quickly to hit different mods for different keys… (ex: <code>|&gt;</code> for
elixir requires hitting lower for the pipe, and shift for the less-than.)</p>
<p>On a normal keyboard, there are roughly three groups of special characters… a
group shared between LH and RH on the num row, and a group curled under the
pink side on the RH. All non-numrow special character keys have a shifted
special character as well.</p>
<p>Thinking this way, this is the list of special characters, by location:</p>
<h4><a href="#lh-column" aria-hidden="true" class="anchor" id="lh-column"></a>LH column</h4>
<p><code>`</code>
<code>~</code></p>
<h4><a href="#numrow" aria-hidden="true" class="anchor" id="numrow"></a>Numrow</h4>
<p><code>!</code>, <code>@</code>, <code>#</code>, <code>$</code>, <code>%</code>, <code>^</code>, <code>&amp;</code>, <code>*</code>, <code>(</code>, <code>)</code></p>
<h4><a href="#rh-column" aria-hidden="true" class="anchor" id="rh-column"></a>RH Column</h4>
<p><code>-</code>, <code>=</code>, <code>_</code>, <code>+</code></p>
<p><code>[</code>, <code>]</code>, <code>&lbrace;</code>, <code>&rbrace;</code>, <code>\</code>, <code>|</code></p>
<h4><a href="#included-in-the-qwerty-grid" aria-hidden="true" class="anchor" id="included-in-the-qwerty-grid"></a>Included in the QWERTY grid</h4>
<p>These I don't feel I really have to account for, I'm probably just going to
reach for them in their usual spots.</p>
<p>I do make exceptions for the <code>&lt;</code>, <code>&gt;</code>, <code>:</code>. These are on a shift modifier, and
they appear often enough in programming sentences that I think they probably
deserve some visibility in a symbols layer.</p>
<p><code>;</code>, <code>:</code>, <code>'</code>, <code>&quot;</code></p>
<p><code>,</code>, <code>.</code>, <code>&lt;</code>, <code>&gt;</code>,<code>/</code>, <code>?</code></p>
<p>Total: 22 before the QWERTY grid, 32 including all QWERTY symbols.</p>
<p>My target symbols to cover in a symbol layer: 26.</p>
<h3><a href="#the-outer-keys" aria-hidden="true" class="anchor" id="the-outer-keys"></a>The Outer Keys</h3>
<p>The Outer Keys (non-official name) are <code>Tab</code>, <code>Caps Lock</code>, <code>Backspace</code> and
<code>Delete</code>. On all my boards the key in the normal &quot;Caps Lock&quot; position behaves
as a <code>Control</code>, and is <code>ESC</code> when double-tapped.</p>
<p>These I have mostly left in place, although I could see a world where I moved
tab to a different spot. I honestly don't find myself hitting tab as often as I
use vim shortcuts to reformat text, so it's ok for it to be there.</p>
<p>I also spend a lot of time in the command line, and I tend do use Readline
shortcuts for tab and enter, (<code>⌃+i</code> and <code>⌃+j</code> respectively). I could see moving
those prominently to the thumb cluster otherwise, but I've just become so used
to using the Readline ones that it doesn't matter that much to me.</p>
<p>Ortholinear boards follow a similar pattern, but the Kyria is still in flux.</p>
<h3><a href="#arrow-keys-functions-and-etc" aria-hidden="true" class="anchor" id="arrow-keys-functions-and-etc"></a>Arrow Keys, Functions, and Etc.</h3>
<p>As a long time user of 60% or less keyboards, having the arrow keys on a layer
is normal to me at this point. While I typically also use Readline shortcuts
for moving around, if I need arrow keys, I have a traditional pyramid on one
layer, though I typically use a vim-style bar on <code>hjkl</code>.</p>
<p>Function keys can be similarly placed to the
number row mentioned earlier, and I'm pretty happy having all kinds of layers
to control RGB and other things. I typically <a href="http://evantravers.com/articles/2019/04/03/my-keyboard-setup/#qmk-layers">run a macro layer for specialized
design
purposes</a>.</p>
<h2><a href="#options" aria-hidden="true" class="anchor" id="options"></a>Options</h2>
<p>Here is what I've tried so far. I'm not using some of QMK's fancier options…
for instance I tend not to put the layer keys inside the space bars… I never
have been able to type at speed with that. It just trips me up. :(<sup class="footnote-ref"><a href="#fn-4" id="fnref-4" data-footnote-ref>2</a></sup></p>
<h3><a href="#option-1-planck-variant-raise-for-symbols-lower-for-shifted-symbols" aria-hidden="true" class="anchor" id="option-1-planck-variant-raise-for-symbols-lower-for-shifted-symbols"></a>Option 1: Planck variant (Raise for symbols, Lower for shifted symbols)</h3>
<p>This is basically an implementation of the layout that I was using on the
Planck.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/04/keyboard-layout.png" alt="">
  <imgcaption>Plank version</imgcaption>
</figure>
<figure>
  <img src="https://images.evantravers.com/articles/2020/02/kyrialayout.png" alt="">
  <imgcaption>
    Current Kyria version, not super readable, sorry! Try opening image in a
    new tab.
  </imgcaption>
</figure>
<p>It crushes in all the special characters, and follows the mnemonic: all special
characters are &quot;crushed&quot; inward into the 4x12 grid on the raise layer. All
characters that would be shifted variants of the same are on the lower layer.</p>
<p>Because this follows a consistent pattern, it's pretty easy for me to remember.
Do I want to type <code>@</code>? It's &quot;above&quot; <code>2</code>, just like it is on a normal keyboard.
<code>&lbrace;&rbrace;</code> is found &quot;shifted&quot; above <code>[]</code>. <code>-</code> is next to <code>=</code>, and the shifted
variants are the same as a normal keyboard. When I was learning the layout, I
usually was able to find something by looking at my laptop and remembering how
the layout pulls everything inward.</p>
<p>The downside is that shifting between a layer and another layer, or more
especially a layer and a shifted character in the QWERTY set is slow… slower
still if you have thumb mods for shift <em>and</em> space.</p>
<p>Those shifted QWERTY characters are: <code>:</code>, <code>&quot;</code>, <code>&lt;</code>, <code>&gt;</code>, and <code>?</code></p>
<p>For my programming purposes, probably the <code>&lt;&gt;</code> characters are most problematic.</p>
<h4><a href="#option-2-ergodox-symbol-layer" aria-hidden="true" class="anchor" id="option-2-ergodox-symbol-layer"></a>Option 2: Ergodox (Symbol layer)</h4>
<p>This is the variant that the default Kyria <em>roughly</em> follows.</p>
<p>The &quot;lower&quot; layer contains only symbols, all the symbols except for a few
shifted key codes, ironically creating the same problem with special characters
as the Planck style layout.</p>
<p>However, if you follow this logic of having a full on &quot;symbol layer,&quot; then
programming should become easier as things like <code>#&lbrace;&rbrace;</code>, <code>|&gt;</code>, or <code>=&gt;</code> move under
a single layer with a single layer press. I think over time this would be a
major advantage. With the Planck system, to type consecutive special characters
often requires a layer change, or a layer key to shift change… with a symbol
layer, just hold one layer key and type.</p>
<p>I'm just not convinced that the layout the ergodox promotes is the right one. I
think in part it relies on having all the keys necessary to hit all the special
characters (especially number row,) and it mostly utilizes the symbol layer as
a shortcut for commonly used programming characters. I think it also relies on
the fact you can layer with your thumbs and shift with your pinky fingers…
which at the moment I am trying to avoid because it could potentially lead me
down a path of even smaller keyboards. <sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>3</a></sup></p>
<p><img src="https://media2.giphy.com/media/xcNDsrQfWxluM/giphy.gif" alt="evil cackle" /></p>
<p>The main problem is that I am not easily able to discern the logic behind the
symbols system, especially the RH symbols on the default ergodox/Kyria layer.
They aren't organized in any way that makes sense to me.</p>
<h2><a href="#where-do-we-go-from-here" aria-hidden="true" class="anchor" id="where-do-we-go-from-here"></a>Where do we go from here?</h2>
<p>Typing this monstrous document out has helped me think this through.</p>
<p>Here are my present thoughts:</p>
<p>Playing around, I think that long-term, having a full &quot;symbols only&quot; layer is
probably going to be the most ergonomic solution… eliminating a lot of thumb
juggling between momentary layer to shift to layer, especially for some of the
weird character strings found in programming. (<code>&lt;!-- --&gt;</code> or <code>#&lbrace;&rbrace;</code> anyone?) I
have two possible paths forward:</p>
<ol>
<li>I could try to find a Planck-like grouped solution that mimics the groupings
on a traditional keyboard in order to allow me to remember where they are. This
would probably necessitate either:
<ul>
<li>giving myself a way to shift easily while in a layer… probably a pinky
shift like the ergodox, kyria, or Kinesis Advantage<sup class="footnote-ref"><a href="#fn-3" id="fnref-3" data-footnote-ref>4</a></sup>.</li>
<li>Trying to fit the few shifted characters from the QWERTY grid in between
the mnemonic layers.</li>
</ul>
</li>
<li>I could try to identify which of the special characters is most important,
group some of them that <em>need</em> to be grouped (parens, braces, etc.), and try to
organize the rest of them by usage and how often I type.</li>
</ol>
<p>I'll probably look to the second… it's a far cry from what I have been doing,
but I think long term it'll be the most interesting.</p>
<p>I think that I'm probably going to pursue a thumb mod solution to allow me to
hit <code>⌘+⇧</code> easier. I may try to pursue another arrangement of keys to allow a
thumb smash, or utilize QMK's ability to have double-tap and hold in order to
handle it. I'll probably look to a clever QMK solution, because if history is
any indicator, my next keyboard will have even less keys. :P</p>
<p>If you want to see where my layout is at the time of this entry, <a href="https://github.com/evantravers/qmk_firmware/commit/f0bd3f694d46ed717750b0b9fe083976a4592c5f">here's the
last change I
made</a>.
I'm using macros based on <a href="https://github.com/qmk/qmk_firmware/blob/master/users/drashna/wrappers.h">@drashna's
layout</a>,
so it may be a little hard to read.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-2">
<p>(I hear you Colemak fan in the back, I haven't been able to figure out
how to do this and still use vim,) <a href="#fnref-2" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-4">
<p>I know there's configuration options to help with this, but so far I
haven't found the magic numbers that work for me. <a href="#fnref-4" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-1">
<p>If I can get away from pinky shifting, then I can lose an entire column,
and the Kyria even supports breaking that column off the PCB… why I want to do
this? Madness, I think. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
<li id="fn-3">
<p>The Kinesis and ergodox have more keys and columns, and don't try to
utilize layers except as ergonomic shortcuts. <a href="#fnref-3" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="4" aria-label="Back to reference 4">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Taking Screenshots in Chrome or Firefox</title>
       <link>http://evantravers.com/articles/2020/02/18/taking-screenshots-in-chrome-or-firefox/</link>
       <pubDate>Tue, 18 Feb 2020 20:13:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/02/18/taking-screenshots-in-chrome-or-firefox/</guid>
       <description><![CDATA[ <p>If you work on any web application or website… you will eventually need to take
some screenshots.</p>
<p>In the old days, I'd expand the window to the maximum size for that montior
(trying to keep all my screenshots a consistent size,) use whatever screenshot
tool was built into the operating system, then use photoshop to trim out the
browser chrome and stitch together successive images to have a tall image that
represented the scrollable portion. I'm pretty sure that I had an Imagemagick
script at one point to do this automatically.</p>
<p>There are <strong>much</strong> better ways.</p>
<p>Recently I've just used an extension like <a href="https://chrome.google.com/webstore/detail/full-page-screen-capture/fdpohaocaechififmbbbbbknoalclacl">Full Page Screen
Capture</a>.
This is <em>way</em> easier than the old manual way.</p>
<h2><a href="#extension-we-dont-need-no-stinkin-extension" aria-hidden="true" class="anchor" id="extension-we-dont-need-no-stinkin-extension"></a>Extension? We don't need no stinkin' extension!</h2>
<p><img src="https://images.evantravers.com/articles/2020/02/fullscreenshot.png" alt="chrome's screenshot" /></p>
<p>You don't have to use an extension though. Chrome and Firefox have screen shot
features built in. In Chrome, if you summon the inspector and enable the Device
Toolbar, you can access screenshot options from the triple dot menu icon in the
top right of the Device Toolbar. It allows you to take both a full-length
screenshot, or just the visible portion.</p>
<p><img src="https://images.evantravers.com/articles/2020/02/commandsearch.png" alt="chrome command menu" /></p>
<p>While using the Device Toolbar can help you ensure that all your screenshots
are the same resolution (handy for putting together documentation or a
presentation!) you may wish to take a screenshot at the full size available to
your monitor. In Chrome, the only I have found to do this is to invoke the
<a href="https://developers.google.com/web/tools/chrome-devtools/command-menu/">Command
Menu</a>
feature using <code>⌘+⇧+P</code> and searching for &quot;screenshot.&quot;</p>
<p><img src="https://images.evantravers.com/articles/2020/02/firefox.png" alt="chrome command menu" /></p>
<p>Firefox has a nearly identical feature in the same place, but it lacks the
ability to take a screenshot of the full scrollable area. It does have a
clearer little camera icon.</p>
<p><img src="https://images.evantravers.com/articles/2020/02/nodescreenshot.png" alt="chrome command menu" /></p>
<p>Both Firefox and Chrome also have a feature that let you take a screenshot of
<em>just</em> the currently selected element in the DOM inspector, also very handy for
selecting just an iframe or a component you are documenting.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: January</title>
       <link>http://evantravers.com/articles/2020/01/31/books-and-links-january/</link>
       <pubDate>Fri, 31 Jan 2020 02:36:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/01/31/books-and-links-january/</guid>
       <description><![CDATA[ <p>It's been a busy start to the year... looking forward to what God brings in the
new year!</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>I've been reading a lot... but here's a cherry picked selection:</p>
<h3><a href="#design" aria-hidden="true" class="anchor" id="design"></a>Design</h3>
<p>Reading a <em>ton</em> about design systems... both the good and the bad.</p>
<h4>
  <a href='https://ethanmarcotte.com/wrote/the-hoof-and-the-horse/'>The hoof and the horse. — ethanmarcotte.com</a>
</h4>
<blockquote>
<p>In my experience, the challenge of design systems work is helping teams think
in more cross-functional, interdisciplinary ways. They need an awareness on
how changing a single slice will affect the hyperobject—or more specifically,
how it will affect the other teams and people who work within the system.</p>
</blockquote>
<p><a href="https://ethanmarcotte.com/wrote/the-hoof-and-the-horse/">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=mAiNdU1go1A'>Mind the gap, user centered design in large organizations with Luke Wroblewski</a>
</h4>
<iframe src="https://www.youtube.com/embed/mAiNdU1go1A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>Wonderful talk, some really great points on how to responsibly handle A/B testing.</p>
<ul>
<li>Test high contrast hypotheses</li>
<li>Responsible feature rollouts… everything is released as an experiment. Has to pass a metric test.</li>
</ul>
<p>I’m definitely going to get my team to watch this.</p>
<ul>
<li>Mind the gap. Speak for the user directly, listen for anywhere they are left out.</li>
<li>You are what you measure. “What do you want to happen?”</li>
<li>Spend time with customers.</li>
</ul>
<p><a href="https://www.youtube.com/watch?v=mAiNdU1go1A">Read more...</a></p>
<h4>
  <a href='http://jordanm.co.uk/2019/07/30/intentional-and-emergent-design-systems.html'>Intentional and Emergent Design Systems | Product Design, Responsive Web Design, UX Design, Belfast Northern Ireland | Jordan Moore</a>
</h4>
<blockquote>
<p>The fundamental difference between the two competing methods is the point at
which design decisions become codified as part of a design system. This may
seem like a minor point to get stuck on but it touches on an old CSS problem:
it’s hard to remove CSS after the fact because it isn’t clear where certain
style rules are used or perhaps never used. Front-loading a design system
with granular, variable-like CSS rules is as good as saying those rules are
immovable and any attempt to move them will have unintended consequences up
the design system chain from granular to fully formed components and
patterns.</p>
</blockquote>
<p>This article really spoke to me. I also really appreciated <a href="https://twitter.com/jordanmoore/status/1220853177135894529">Jordan’s clarifying
advice on Twitter</a>.</p>
<p><a href="http://jordanm.co.uk/2019/07/30/intentional-and-emergent-design-systems.html">Read more...</a></p>
<h4>
  <a href='https://www.robinrendle.com/essays/systems-mistakes-and-the-sea'>Systems, Mistakes, and the Sea › Robin Rendle</a>
</h4>
<blockquote>
<p>My point here is that, yes, before tackling these issues we must see the
design system and the hyperobject at our respective companies, but to do so
we must see ourselves clearly first. And a big part of that is owning up to,
and being honest about, our mistakes. So I would like to be honest with all
of mine; this year I’ll be writing about every mistake I’ve made in the field
of design systems and speaking up a bit more about the ways I’ve messed
things up.</p>
</blockquote>
<p><strong>Incredible</strong> article about Design Systems and the challenges of maintaining
them. Highly recommended.</p>
<p><a href="https://www.robinrendle.com/essays/systems-mistakes-and-the-sea">Read more...</a></p>
<h3><a href="#code" aria-hidden="true" class="anchor" id="code"></a>Code</h3>
<h4>
  <a href='https://martinfowler.com/articles/on-pair-programming.html'>On Pair Programming</a>
</h4>
<p>My friend <a href="http://megalithic.io">Seth</a> and I were just talking about the
difficulties and delights of pair programming, and then this incredible guide
dropped. Great read if you are just starting or trying to get to the next
level.</p>
<p><a href="https://martinfowler.com/articles/on-pair-programming.html">Read more...</a></p>
<h4>
  <a href='https://csswizardry.com/2020/01/performance-budgets-pragmatically/'>Performance Budgets, Pragmatically – CSS Wizardry – Web Performance Optimisation</a>
</h4>
<blockquote>
<p>most organisations aren’t ready for challenges, they’re in need of safety
nets. Performance budgets should not be things to work toward, they should be
things that stop us slipping past a certain point. They shouldn’t be
aspirational, they should be preventative.</p>
</blockquote>
<p><a href="https://csswizardry.com/2020/01/performance-budgets-pragmatically/">Read more...</a></p>
<h4>
  <a href='https://twobithistory.org/2020/01/05/foaf.html'>Friend of a Friend: The Facebook That Could Have Been</a>
</h4>
<blockquote>
<p>I express my network in a FOAF file, and that is the start of the revolution.
—Tim Berners-Lee (2007)</p>
</blockquote>
<blockquote>
<p>Facebook does seem to have a monopoly, whether natural or unnatural—not over
social media per se (I spend much more time on Twitter), but over my internet
social connections with real people I know. It has a monopoly over, as they
call it, my digitized “social graph”; I would quit Facebook tomorrow if I
didn’t worry that by doing so I might lose many of those connections. I get
angry about this power that Facebook has over me. I get angry in a way that I
do not get angry about the MTA, even though the Subway is, metaphorically and
literally, a sprawling trash fire. And I suppose I get angry because at root
I believe that Facebook’s monopoly, unlike the MTA’s, is not a natural one.</p>
</blockquote>
<p><a href="https://twobithistory.org/2020/01/05/foaf.html">Read more...</a></p>
<h4>
  <a href='https://www.fastcompany.com/90449853/this-woman-knows-the-secret-to-fixing-big-techs-most-pervasive-problem'>This coding legend knows the secret to fixing Big Tech’s most pervasive problem</a>
</h4>
<blockquote>
<p>Refusing to follow a “move fast” model put Hamilton directly in conflict with
NASA itself. In one famous instance, when Hamilton pointed out a potential
software error triggered by an errant button-push that could strand Apollo 11
astronauts on the moon, the initial response within NASA was aggrieved
disbelief: Astronauts are some of the best-trained people in the world; of
course they won’t trigger the error by hitting the wrong button! But that’s
exactly what they did on the Apollo 11 mission—and Neil Armstrong, Buzz
Aldrin, and Michael Collins only avoided being stranded on the moon (or
killed immediately on impact) by Hamilton winning that argument before they
took off.</p>
</blockquote>
<p><a href="https://www.fastcompany.com/90449853/this-woman-knows-the-secret-to-fixing-big-techs-most-pervasive-problem">Read more...</a></p>
<h3><a href="#interesting" aria-hidden="true" class="anchor" id="interesting"></a>Interesting</h3>
<h4>
  <a href='https://bittersoutherner.com/the-broken-road-of-peggy-wallace-kennedy'>The Broken Road of Peggy Wallace Kennedy — THE BITTER SOUTHERNER</a>
</h4>
<blockquote>
<p>All white Southerners live with the sins of their fathers. But what if your
dad was one of the most famous segregationists in history?</p>
</blockquote>
<p><a href="https://bittersoutherner.com/the-broken-road-of-peggy-wallace-kennedy">Read more...</a></p>
<h4>
  <a href='https://superorganizers.substack.com/p/how-to-run-your-life-inside-of-notion'>How To Run Your Life Inside of Notion - Superorganizers</a>
</h4>
<p>This is incredibly impressive. I don't know that I've ever seen a more complex
system... although I'm sure some old org-mode person is going to blow my mind
at any point now.</p>
<p>Is notion web 2.0 orgmode?</p>
<p><a href="https://superorganizers.substack.com/p/how-to-run-your-life-inside-of-notion">Read more...</a></p>
<h4>
  <a href='https://www.macstories.net/ios/my-markdown-writing-and-collaboration-workflow-powered-by-working-copy-3-6-icloud-drive-and-github/'>My Markdown Writing and Collaboration Workflow, Powered by Working Copy 3.6, iCloud Drive, and GitHub</a>
</h4>
<p>This git-enabled ios-friendly workflow blew my mind. I've been thinking about
notes and documents on ios for a long time, and this is a very interesting idea
to me.</p>
<p><a href="https://www.macstories.net/ios/my-markdown-writing-and-collaboration-workflow-powered-by-working-copy-3-6-icloud-drive-and-github/">Read more...</a></p>
<h4>
  <a href='https://www.theverge.com/2018/7/16/17566276/cockygate-amazon-kindle-unlimited-algorithm-self-published-romance-novel-cabal'>How a cabal of romance writers cashed in on Amazon Kindle Unlimited</a>
</h4>
<p>(Content warning: some coarse joking about bedroom matters)</p>
<p>This really shouldn't surprise me, but the weird amount of combination economic
incentive and cobra-farming that lead to this even being a story is just
breathtaking.</p>
<p>H/T to gwern.net for the link.</p>
<p><a href="https://www.theverge.com/2018/7/16/17566276/cockygate-amazon-kindle-unlimited-algorithm-self-published-romance-novel-cabal">Read more...</a></p>
<h4>
  <a href='https://www.thisiscolossal.com/2020/01/boda-boda-madness-jan-hoek-bobbin-case/'>Nairobi's Motor Taxi Drivers Sport Extravagant Costumes in 'Boda Boda Madness'</a>
</h4>
<p><img src="https://www.thisiscolossal.com/wp-content/uploads/2020/01/hoek-8.jpg" alt="motor taxi" /></p>
<blockquote>
<p>Captivated by the motor taxis occupying the streets of Nairobi, Dutch artist
Jan Hoek collaborated with Ugandan-Kenyan fashion designer Bobbin Case.. each
driver dons an extravagant ensemble developed by the designer that matches
their rides.</p>
</blockquote>
<p><a href="https://www.thisiscolossal.com/2020/01/boda-boda-madness-jan-hoek-bobbin-case/">Read more...</a></p>
<h4>
  <a href='https://marginalrevolution.com/marginalrevolution/2020/01/daniel-gross-on-productivity.html'>Daniel Gross on productivity - Marginal REVOLUTION</a>
</h4>
<blockquote>
<p>The longer you think about a task without doing it, the less novel it becomes
to do [...] my solution is to (somewhat counter-intuitively) not think about
the task until I am ready to fully execute it. I do not unwrap the piece of
gum until I’m ready to enjoy it in its entirety. I need to save the fun of
thinking to pull myself into flow.</p>
</blockquote>
<p>This is a very interesting idea. I can see the value of it, especially as I
over-engineer a todo task.</p>
<p><a href="https://marginalrevolution.com/marginalrevolution/2020/01/daniel-gross-on-productivity.html">Read more...</a></p>
<h4>
  <a href='https://moxie.org/stories/brink-of-death/'>Moxie Marlinspike >> Stories >> Hypothermia</a>
</h4>
<blockquote>
<p>The suddenness of it was unbelievable, as if I was on a tiny model made of
paper which someone had simply flicked with their finger; I didn't even have
time to register that it was happening. I landed in the water, felt the shock
of intense cold run through my system, and gasped as I clambered onto one of
the overturned hulls. The wind was blowing so hard that it effectively pinned
the boat down, preventing me from righting it, and eventually turtling it
completely.</p>
</blockquote>
<p>It's scary how quickly a situation can go from in control to utterly out of
control... there's a reason sailors throughout through history have been so
superstitious about the capricious sea.</p>
<p><a href="https://moxie.org/stories/brink-of-death/">Read more...</a></p>
<h4>
  <a href='https://en.wikipedia.org/wiki/Angus_Wallace'>Angus Wallace - Wikipedia</a>
</h4>
<blockquote>
<p>With the limited medical equipment on board, Wallace and Wong had to
improvise heavily. The medical kit had lidocaine – a local anaesthetic – but
the catheter in the kit was designed only for urinary catheterisation and was
too soft for use as a chest tube. The doctors fashioned a trocar from a metal
clothes hanger to stiffen the catheter, and a check valve from a bottle of
water with holes poked in the cap.[9] They sterilised their equipment in
Courvoisier cognac, and began surgery by making an incision in the patient's
chest, but with no surgical clamps available, Wong had to hold the incision
open with a knife and fork while Wallace inserted the catheter.[7] The whole
surgery lasted about ten minutes; the doctors successfully released the
trapped air from the patient's chest, and she passed the rest of the flight
uneventfully, eating and watching in-flight movies.[9]</p>
</blockquote>
<p>What.</p>
<p><a href="https://en.wikipedia.org/wiki/Angus_Wallace">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Italics in Tmux using Kitty&#39;s terminfo</title>
       <link>http://evantravers.com/articles/2020/01/17/italics-in-tmux-using-kitty/</link>
       <pubDate>Fri, 17 Jan 2020 14:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/01/17/italics-in-tmux-using-kitty/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2020/01/kitty.png" alt="pretty colors and italics" /></p>
<p>I'm presently using <a href="https://sw.kovidgoyal.net/kitty/index.html">Kitty</a> as my
terminal emulator.</p>
<p>I had been using <a href="https://iterm2.com/">iTerm2</a> for years, and it is an
<em>excellent</em> emulator.  After trying
<a href="https://github.com/alacritty/alacritty">Alacritty</a><sup class="footnote-ref"><a href="#fn-alacritty" id="fnref-alacritty" data-footnote-ref>1</a></sup>, I settled on
Kitty. Kitty was fast, cross-platform, and simple to configure. I use
<a href="http://evantravers.com/articles/tags/tmux/">tmux</a> as my multiplexer, so having
a very bare-bones terminal that is easy to configure makes lots of sense to me.
I haven't looked back.<sup class="footnote-ref"><a href="#fn-iterm" id="fnref-iterm" data-footnote-ref>2</a></sup></p>
<p>Kitty has another advantage that I discovered only very recently. I recently
switched my font to <a href="https://www.jetbrains.com/lp/mono/">Jetbrains Mono</a> on a
lark, and started to look and see what would be required in order to get
italics and underlines to work properly in my terminal. To get tmux to play
nice with italics, you have to specify a terminfo file that also supports it,
and most people were rolling their own custom one.</p>
<p>It turns out that <a href="https://sw.kovidgoyal.net/kitty/protocol-extensions.html?highlight=terminfo">kitty supplies a custom terminfo
file</a>
that supports all the features I could ever want, so all I have to do is tell
tmux to use <code>xterm-kitty</code><sup class="footnote-ref"><a href="#fn-xterm" id="fnref-xterm" data-footnote-ref>3</a></sup>, and I'm done! It was a <em>lot</em> easier than
making a shell script that copies my standard terminfo, patches it with italic
support, and installs it using tic.</p>
<p>I've tested it only a little bit, but this appears to work in other terminals
as well. You could just <code>brew cask install kitty</code>, and continue to use it in
Terminal.app or iTerm2.</p>
<h2><a href="#relevant-configurations" aria-hidden="true" class="anchor" id="relevant-configurations"></a>Relevant Configurations</h2>
<ul>
<li><a href="https://github.com/evantravers/dotfiles/tree/f8d2e64f7aa5473dd3d4c3b4398fb27ef8fd85d0/kitty/.config/kitty">Kitty</a></li>
<li><a href="https://github.com/evantravers/dotfiles/tree/f8d2e64f7aa5473dd3d4c3b4398fb27ef8fd85d0/tmux">Tmux</a></li>
</ul>
<p>I still miss one iTerm
feature: I haven't found a suitable replacement for <a href="https://iterm2.com/features.html#annotations">iTerm2's mark
system</a>. It's wonderful.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-alacritty">
<p>While it has a fantastic icon, it also has <a href="https://github.com/alacritty/alacritty/issues/93">frustrating
bug</a>. <a href="#fnref-alacritty" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-iterm">
<p>If you don't like messing with things, it's probably the best choice.
As it was, I wanted to look around at the other options… especially with an
eye to speed, and I wanted a simple textfile configuration option rather than
the messy plist format that iTerm stores its data in. <a href="#fnref-iterm" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-xterm">
<p><a href="https://github.com/evantravers/dotfiles/commit/3fe5f38de8af595468fb6287dd1fba1feeeed8af">Relevant git commit</a> <a href="#fnref-xterm" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Configuring Slack for Focus</title>
       <link>http://evantravers.com/articles/2020/01/14/configuring-slack-for-focus/</link>
       <pubDate>Tue, 14 Jan 2020 18:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/01/14/configuring-slack-for-focus/</guid>
       <description><![CDATA[ <p>Slack is a wonderful application… and it can really bring teams together, especially ones that are far-flung and remote. However it is a constant drain on our focus muscle… dinging and bouncing away and drawing our attention and time away from our best work.</p>
<p>Each team is different… and no tech-tweak is a good substitute for a team to have an open and honest conversation about expectations and communication styles.</p>
<p>That being said, here are some suggestions to enable a more purposeful use of Slack. (I'm on OSX, but the basic principles should apply anywhere.)</p>
<h2><a href="#hear-less" aria-hidden="true" class="anchor" id="hear-less"></a>Hear less.</h2>
<h3><a href="#turn-off-notifications" aria-hidden="true" class="anchor" id="turn-off-notifications"></a>Turn off notifications</h3>
<p><img src="https://images.evantravers.com/articles/2020/01/slack_notifications.png" alt="How I have my notifications configured" /></p>
<p>Set your desktop notifications to be only notified for Direct messages, mentions, &amp; keywords. You can also enable threads.</p>
<p>Turn off notifications on your mobile devices. Just try it. You won't die.</p>
<h3><a href="#snooze-notifications" aria-hidden="true" class="anchor" id="snooze-notifications"></a>Snooze notifications</h3>
<p>Sometimes turning down the notification level doesn't work for a team. In this case, you can also employ the <a href="https://slack.com/help/articles/214908388">snooze notifications</a> or DND feature. Some people have figured out a way to start it automatically. I know that some plugins and bots can access it.</p>
<h3><a href="#minimize-distraction" aria-hidden="true" class="anchor" id="minimize-distraction"></a>Minimize Distraction</h3>
<h4><a href="#quitterapp" aria-hidden="true" class="anchor" id="quitterapp"></a>Quitter.app</h4>
<p><img src="https://images.evantravers.com/articles/2020/01/quitter.png" alt="quitter" /></p>
<p>I use <a href="https://marco.org/apps#quitter">Marco Arment's Quitter.app</a> to hide Slack after 1 minute of inactivity. This reduces the chance that I'll be compelled to read all my unreads as they flicker in my peripheral vision. This helps a lot.</p>
<h4><a href="#ignore-the-dots" aria-hidden="true" class="anchor" id="ignore-the-dots"></a>Ignore the dots</h4>
<p>I have my dock and menubar completely hidden on my mac, but if you are a dock user, you may want to <a href="https://zapier.com/apps/slack/tutorials/turn-off-red-dot-slack">disable showing the activity badge on Slack</a>. This just pulls you out of focus whenever that little red circle appears… you just want to know what conversational present has arrived! (And it's usually not that exciting.)</p>
<h2><a href="#listen-more" aria-hidden="true" class="anchor" id="listen-more"></a>Listen more.</h2>
<p><img src="https://images.evantravers.com/articles/2020/01/sidebar_preferences.png" alt="quitter" /></p>
<h3><a href="#show-only-what-you-need-to-see" aria-hidden="true" class="anchor" id="show-only-what-you-need-to-see"></a>Show only what you need to see</h3>
<p><img src="https://slack.zendesk.com/hc/en-us/article_attachments/203675978/blog2.png" alt="image showing distraction reduction" /></p>
<p>As you stay in a community, you tend to join a ton of channels and talk to a lot of people. It kills me when I see people scrolling up and down a 300 person long list just to see who messaged them last when you could enable this setting in <a href="https://slack.com/help/articles/212596808-manage-your-sidebar-display#hide">Preferences -&gt; Sidebar: Unreads and starred conversations</a>. This means that you will only see the updated conversations.</p>
<p>This setting makes more sense if you primarily use <code>⌘+K</code> to jump between channels or conversations. <code>⌘+⇧+K</code> allows you to specifically target conversations and create group channels.</p>
<p>If you want to browse through all your people, you can always still click on the Channels or Direct Messages pane to scroll through the full list.</p>
<h3><a href="#all-unreads" aria-hidden="true" class="anchor" id="all-unreads"></a>All Unreads</h3>
<p>In Preferences -&gt; Sidebar you can enable <a href="https://slack.com/help/articles/226410907-View-all-your-unread-messages">All Unreads</a>. It sits at the top of your sidebar as a summary digest of <em>everything</em> you've missed. It's really the best.</p>
<p>While you can click on it in the sidebar, I access it using <code>⌘+⇧+A</code>, and will then scan all my channels and conversations for things that I need to address. More often than not, there's nothing there that needs my input, and I can hit <code>⇧+ESC</code> to clear all notifications.</p>
<p>(Similarly, you can read all threads similarly with <code>⌘+⇧+T</code>.)</p>
<h3><a href="#remind-to-defer" aria-hidden="true" class="anchor" id="remind-to-defer"></a><code>/remind</code> to defer</h3>
<p>Sometimes I will see a message that does deserve my attention, but not right now. Sometimes I'll copy a link to the message and put it in my task manager, other times I'll simply use the <a href="https://slack.com/help/articles/208423427-Set-a-reminder"><code>/remind</code> command</a> in Slack to create a reminder to &quot;get back with John Smith in 1 hour.&quot;</p>
<h2><a href="#no-longer-drowning" aria-hidden="true" class="anchor" id="no-longer-drowning"></a>No longer drowning.</h2>
<p>So far this system has worked really well for me. I tend to schedule times to
get back online and check my email and slack, and I am working with my team to
ensure that my cadence fulfills their needs without detracting too much from
my focus.</p> ]]></description>
    </item>
    <item>
       <title>Planning as a Decision Making Tool</title>
       <link>http://evantravers.com/articles/2020/01/07/planning-as-a-decision-making-tool/</link>
       <pubDate>Tue, 07 Jan 2020 14:46:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/01/07/planning-as-a-decision-making-tool/</guid>
       <description><![CDATA[ <p>When you make a plan for your day, your week, your year… you are taking a
moment to intentionally invest your time. With the information you have, you
choose the best use of the time ahead.</p>
<p>But what if what you know changes?</p>
<p>One of the values of planning is that it creates a baseline by which to filter
the other activities that come to your mind. You are constantly asking the
question: Is this new thing more important<sup class="footnote-ref"><a href="#fn-important" id="fnref-important" data-footnote-ref>1</a></sup> than the plan to which
you committed and invested energy?</p>
<p>Planning isn't just about saying yes to one thing… it's actively saying no to
unimportant things.</p>
<p>A plan does not lock you in to a lesser goal. If a more important opportunity
or task comes along, you won't lose it because of your plan. You will more
readily identify it as valuable <em>because</em> of its relative worth to your
original plan. A good plan highlights and enables true opportunities because it
discards the unimportant and the merely urgent.</p>
<p>When you are beleaguered by distraction, dragged around by far too much to do
in too little time… now is the time to push it all aside for just a moment and
plan out your time. A plan is never perfect, but it helps you say no to the
unimportant and yes to what is most important.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-important">
<p>Knowing what &quot;is important&quot; is the hardest part of this whole
endeavor. If your plans are failing, I'll wager it has less to do with your
plans and more to do with your definition of important. Without a clear
definition of importance derived from your core values, you will consider
every non-hellacious opportunity as &quot;important&quot; and therefore be in the same
distracted position as before. <a href="#fnref-important" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>2019</title>
       <link>http://evantravers.com/articles/2020/01/01/2019-in-review/</link>
       <pubDate>Wed, 01 Jan 2020 23:08:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2020/01/01/2019-in-review/</guid>
       <description><![CDATA[ <p>I am grateful for the Lord's protection and guidance through the past year. To God be <em>all</em> the glory.</p>
<h2><a href="#spiritual-life-and-focus" aria-hidden="true" class="anchor" id="spiritual-life-and-focus"></a>Spiritual Life and Focus</h2>
<p>Last year I planned to focus on my spiritual life and career. While I think I made some strides in both, I generally am a little disappointed with my lack of investment in my spiritual life this year. I think my growing commitment to exercise competed too heavily with my quiet time. Lesson learned, his mercies are new each morning, and I get to start afresh.</p>
<h2><a href="#health" aria-hidden="true" class="anchor" id="health"></a>Health</h2>
<p>I'm pleased with progress towards physical goals. I've continued to be faithful in my morning workouts<sup class="footnote-ref"><a href="#fn-activities" id="fnref-activities" data-footnote-ref>1</a></sup>, I've seen headway in areas that I'm weak, and I had enough left over to participate in some events<sup class="footnote-ref"><a href="#fn-events" id="fnref-events" data-footnote-ref>2</a></sup>, even without specialized training. While I'm definitely carrying more weight than I ought, I am stronger and faster than I have been in a long time.</p>
<p>My diet still is terrible. I lack self control for sweets. On a positive note, I have been drinking a lot more water.</p>
<p>I don't value sleep like I should. Thinking about investing in some blackout curtains at least.</p>
<h2><a href="#reading-and-writing" aria-hidden="true" class="anchor" id="reading-and-writing"></a>Reading and Writing</h2>
<p>I blocked reddit off my phone, and that resulted in a lot more books and blog posts.</p>
<p>I ended up reading 42 books and took and 55,180 words of book notes. (Don't be impressed, there's a lot of kindle highlights in there too.) I wrote 47 blog posts this year… 45% of my total blog posts ever. :-/</p>
<p>I saved 338 annotated links in using my ifttt.com -&gt; dropbox scheme… some of those wound up in the blog posts I made once per month.</p>
<h2><a href="#life" aria-hidden="true" class="anchor" id="life"></a>Life</h2>
<p>A lot is happening very quickly these days. We bought a house this year, I've just started a new job, and we have had lots of little mini family adventures all year long. I could not survive without my incredible wife who makes my every moment wonderful and gives me so much wise counsel.</p>
<h2><a href="#2020-clarity" aria-hidden="true" class="anchor" id="2020-clarity"></a>2020: Clarity</h2>
<p>In keeping with both the ideas of the <a href="https://www.thethemesystem.com/">Theme System</a> and <a href="https://thefocuscourse.com/plan-your-year/">Plan Your Year</a>, I'm choosing as my theme for 2020 the word &quot;clarity.&quot; Clarity means for me that I know at all times what is <strong>most</strong> important. I usually let the urgent and small crowd out what is most important in my life… I want to fight against that this year.</p>
<ul>
<li><a href="https://runsignup.com/Race/Results/24797/IndividualResult/fkFR?resultSetId=180222#U16421508">Blow Away 5k</a> 24:39.91</li>
<li><a href="https://www.spartan.com/en/race/detail/4927/results?fullResults=true">Spartan Super (10k)</a> 2:52:44</li>
<li><a href="https://www.pantherrun.net/wp-content/uploads/2019/06/pr2019_overall-elite-1.pdf">Panther Run 5k</a> 01:03:01</li>
<li><a href="https://f3greenwood.com/2019/07/27/iron-pax-2019/">The Iron PAX Challenge</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-activities">
<p>128 hours, 312.7 km, 262 activities. <a href="#fnref-activities" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-events">
<p>2019 Events <a href="#fnref-events" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: December</title>
       <link>http://evantravers.com/articles/2019/12/31/books-and-links-december/</link>
       <pubDate>Tue, 31 Dec 2019 22:21:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/12/31/books-and-links-december/</guid>
       <description><![CDATA[ <p>A year comes to a close, I'm going to a year-in-review post later, but until
then, here's what I read this month:</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#dead-astronauts-by-jeff-vandemeer" aria-hidden="true" class="anchor" id="dead-astronauts-by-jeff-vandemeer"></a>Dead Astronauts by Jeff Vandemeer</h3>
<p>(Content warning: Some Strong Langauge)</p>
<p>I think I started this year reading the Annilihation trilogy, and finishing it
with Vandemeer's lurid fluorescent ravings of a somewhen not far away is
appropriate.</p>
<p>As always, Vandemeer leaves me with a rough brush against a flavor of a
meaning… no moral but wafting sick odor of the meaningless of human endeavor
against the currents of time and nature's endurance. (It's kind bleakly
hopeful?)</p>
<h3><a href="#sense-and-respond-by-jeff-gothelf-and-josh-seiden" aria-hidden="true" class="anchor" id="sense-and-respond-by-jeff-gothelf-and-josh-seiden"></a>Sense and Respond by Jeff Gothelf and Josh Seiden</h3>
<p>The main benefit of Sense and Respond to me is a description of the other
business practices that have to change to support a customer centric agile
team: leadership, planning, budget, hiring. It paints a useful picture of what
could be if the organization goes all in on understanding the market needs and
responding quickly.</p>
<blockquote>
<p>Strategy is expressed as intent. Rather than lay out a detailed plan,
leadership set direction and asked the folks close to the customer.
Commitments are made to outcomes rather than features. By tying initiatives
to outcomes rather than to features, leaders gave staff members the
flexibility to pursue their missions and use their best judgment to achieve
the desired outcomes.</p>
</blockquote>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>With some time off, I've also caught up on a lot of podcasts and gotten
instapaper zero for the first time in <em>years</em>.</p>
<h3><a href="#design" aria-hidden="true" class="anchor" id="design"></a>Design</h3>
<p>Talking a lot about design systems at work, so I've been doing some reading.</p>
<h4>
  <a href='https://bradfrost.com/blog/post/level-of-effort/'>Level of Effort</a>
</h4>
<blockquote>
<p>We need to say “death to the waterfall” and quit handing off Zeplin links as
gospel. We need to make frontend designers equal partners in the design
process. Developers need to snap out of it and demand to be a part of the
design process instead of blindly building out bad “requirements”.</p>
</blockquote>
<p>I really like the description of the dance between design and development...
&quot;hot potato&quot; is as good a description as any.</p>
<p><a href="https://bradfrost.com/blog/post/level-of-effort/">Read more...</a></p>
<h4>
  <a href='https://adactio.com/journal/16214'>The Technical Side of Design Systems by Brad Frost</a>
</h4>
<p>Jeremy Keith again with a great resource for those of us who didn't make it to
An Event Apart.</p>
<blockquote>
<p>When Brad talks to companies, he asks “Have you got a design system?” They
invariably say they do …and then point to a Sketch library. When the focus
goes on the design side of the process, the production side can suffer.
There’s a gap between the comp and the live site. The heart and soul of a
design system is a code library of reusable UI components.</p>
</blockquote>
<p><a href="https://adactio.com/journal/16214">Read more...</a></p>
<h4>
  <a href='https://adactio.com/journal/16210'>The Mythology of Design Systems by Mina Markham</a>
</h4>
<p>Mr. Keith always does such a fine job passing on notes on really important and
useful talks... he gets &quot;liked&quot; a <em>lot</em> in my instapaper.</p>
<blockquote>
<p>The reality is that design systems should be multi-disciplinary. That means
engineers but it also means other kinds of designers other than product
designers too: brand designers, content designers, and so on.</p>
<p>What you need is a hybrid, or unicorn: someone with complimentary skills. As
Jina has said, design systems themselves are hybrids. Design systems give
hybrids (people) a home. Hybrids help bring unity to an organization.</p>
</blockquote>
<p>Lots of great ideas that I'm going to have to return to in the coming months,
but I loved this one:</p>
<blockquote>
<p>Your design system is your pantry, not your cookbook.</p>
</blockquote>
<ul>
<li><a href="https://www.yeseniaperezcruz.com/">Yesenia</a></li>
</ul>
<p>So well said... and so much more. If nothing else, this is truth:</p>
<blockquote>
<p>Myth 3: a design system is a side project</p>
</blockquote>
<p><a href="https://adactio.com/journal/16210">Read more...</a></p>
<h4>
  <a href='https://anildash.com/2019/12/10/link-in-bio-is-how-they-tried-to-kill-the-web/'>“Link In Bio” is a slow knife</a>
</h4>
<blockquote>
<p>And the ultimate triumph of being anti-web is to make links scarce. The
smallest possible number of links a platform could allow is zero, so
Instagram gets as close to that theoretical limit as possible, and gives you…
one. You can have one link. Aren’t you grateful? One!</p>
</blockquote>
<p>This is true...</p>
<p><a href="https://anildash.com/2019/12/10/link-in-bio-is-how-they-tried-to-kill-the-web/">Read more...</a></p>
<h4>
  <a href='https://levelup.gitconnected.com/a-recap-of-frontend-development-in-2019-1e7d07966d6c'>A Recap of Frontend Development in 2019</a>
</h4>
<blockquote>
<p>The world of frontend development once again evolved at a rapid pace over the
past year, and this article recaps all the important events, news, and trends
from 2019.</p>
</blockquote>
<p>Very interesting look... I need to catch up.</p>
<p><a href="https://levelup.gitconnected.com/a-recap-of-frontend-development-in-2019-1e7d07966d6c">Read more...</a></p>
<h4>
  <a href='https://medium.com/@jmspool/the-thank-you-note-a-sketching-tool-for-ux-hiring-9fe30aed888f'>The Thank You Note — A Sketching Tool for UX Hiring</a>
</h4>
<blockquote>
<p>The first time we did it, it felt a bit weird. That’s because it is weird.
After all, we’re writing a thank you note to an employee we haven’t hired
yet.</p>
</blockquote>
<p>I'm going to have to steal this...</p>
<p><a href="https://medium.com/@jmspool/the-thank-you-note-a-sketching-tool-for-ux-hiring-9fe30aed888f">Read more...</a></p>
<h3><a href="#business" aria-hidden="true" class="anchor" id="business"></a>Business</h3>
<h4>
  <a href='http://www.paulgraham.com/lesson.html'>The Lesson to Unlearn</a>
</h4>
<blockquote>
<p>The most damaging thing you learned in school wasn't something youlearned in any specific class. It was learning to get good grades.
[...]
Why did founders tie themselves in knots doing the wrong things when the answer was right in front of them? Because that was what they'd been trained to do. Their education had taught them that the way to win was to hack the test. And without even telling them they were being trained to do this. The younger ones, the recent graduates, had never faced a non-artificial test. They thought this was just how the world worked: that the first thing you did, when facing any kind of challenge, was to figure out what the trick was for hacking the test. That's why the conversation would always start with how to raise money, because that read as the test. It came at the end of YC. It had numbers attached to it, and higher numbers seemed to be better. It must be the test.</p>
</blockquote>
<p>This describes directly a reality I’ve known but could not express. As wonderful and open as my education has been, I still struggle with this.</p>
<p><a href="http://www.paulgraham.com/lesson.html">Read more...</a></p>
<h4>
  <a href='https://www.nngroup.com/articles/service-blueprints-definition/'>Service Blueprints: Definition</a>
</h4>
<p>My friend Simo pointed me at this as a tool.</p>
<blockquote>
<p>Definition: A service blueprint is a diagram that visualizes the
relationships between different service components — people, props (physical
or digital evidence), and processes — that are directly tied to touchpoints
in a specific customer journey.</p>
<p>Think of service blueprints as a part two to customer journey maps. Similar
to customer-journey maps, blueprints are instrumental in complex scenarios
spanning many service-related offerings. Blueprinting is an ideal approach to
experiences that are omnichannel, involve multiple touchpoints, or require a
crossfunctional effort (that is, coordination of multiple departments).</p>
<p>A service blueprint corresponds to a specific customer journey and the
specific user goals associated to that journey. This journey can vary in
scope. Thus, for the same service, you may have multiple blueprints if there
are several different scenarios that it can accommodate. For example, with a
restaurant business, you may have separate service blueprints for the tasks
of ordering food for takeout versus dining in the restaurant.</p>
</blockquote>
<p>Ok Simo. You had my interest, now you have my attention.</p>
<p><a href="https://www.nngroup.com/articles/service-blueprints-definition/">Read more...</a></p>
<h4>
  <a href='https://seths.blog/2019/12/the-travel-agents-problem/'>The travel agent’s problem</a>
</h4>
<blockquote>
<p>Not just travel agents, but all agents. Information scarcity is disappearing.</p>
</blockquote>
<p>Fascinating idea.</p>
<p><a href="https://seths.blog/2019/12/the-travel-agents-problem/">Read more...</a></p>
<h4>
  <a href='https://medium.com/@kellan'>Five years, building a culture, and handing it off.</a>
</h4>
<blockquote>
<p>After 5 years, the time has come. This is my last week as Etsy’s CTO. Five years ago I joined a tiny site, with a struggling software product…</p>
</blockquote>
<p>Got to this article through the book Sense and Respond… lots of great thoughts.</p>
<blockquote>
<p>Theory 1: Nothing we “know” about software development should be assumed to be true.</p>
<p>Most of our tools, our mental models, and our practices are remnants of an era (possibly fictional) where software was written by solo practitioners, but modern software is a team sport.</p>
</blockquote>
<p><a href="https://medium.com/@kellan">Read more...</a></p>
<h4>
  <a href='https://marginalrevolution.com/marginalrevolution/2019/12/is-the-college-wealth-premium-zero.html'>Is the college wealth premium *zero*? - Marginal REVOLUTION</a>
</h4>
<blockquote>
<p>The college wealth premium (extra wealth) has declined more noticeably among all cohorts born after 1940. Among non-Hispanic white family heads born in the 1980s, the college wealth premium is at a historic low; among all other races and ethnicities, it is statistically indistinguishable from zero.</p>
</blockquote>
<p>Whoah.</p>
<p><a href="https://marginalrevolution.com/marginalrevolution/2019/12/is-the-college-wealth-premium-zero.html">Read more...</a></p>
<h4>
  <a href='http://hackeducation.com/2019/12/31/what-a-shitshow'>The 100 Worst Ed-Tech Debacles of the Decade</a>
</h4>
<p>(Content warning: Strong Language)</p>
<blockquote>
<p>85 min read For the past ten years, I have written a lengthy year-end series, documenting some of the dominant narratives and trends in education technology. I…</p>
</blockquote>
<p><a href="http://hackeducation.com/2019/12/31/what-a-shitshow">Read more...</a></p>
<h3><a href="#random" aria-hidden="true" class="anchor" id="random"></a>Random</h3>
<h4>
  <a href='https://leancrew.com/all-this/2019/11/galileo-and-failure/'>Galileo and failure - All this</a>
</h4>
<blockquote>
<p>Last week’s episode of the 99% Invisible podcast was about failure and the
problems that arise when we try to design safety systems to prevent failure.
I found myself disagreeing with a lot of what was said, but a particular
example struck me as flatly wrong. As I looked into it in more detail, I
learned that it was wrong for more reasons than I originally thought.
[...]
To be fair, I’ve been investigating failure professionally for three decades,
and it may be that no simplified journalistic approach to the topic of
failure would have satisfied me. But there is a line between justified
simplification and misleading oversimplification, and one of the show’s
examples went over that line.</p>
</blockquote>
<p>This is wonderful math nerdery of the highest order. I salute you Dr. Drang.</p>
<p><a href="https://leancrew.com/all-this/2019/11/galileo-and-failure/">Read more...</a></p>
<h4>
  <a href='https://jeffhuang.com/designed_to_last/'>This Page is Designed to Last: A Manifesto for Preserving Content on the Web</a>
</h4>
<blockquote>
<p>Bookmark after bookmark led to dead link after dead link. Vanished are
amazing pieces of writing on kuro5hin about tech culture, and a collection of
mathematical puzzles and their associated discussion by academics that my
father introduced me to; gone are Woodman's Reverse Engineering tutorials
from my high school years, where I first tasted the feeling of dominance over
software; even my most recent bookmark, a series of posts on Google+ exposing
usb-c chargers' non-compliance with the specification, disappeared.</p>
<p>This is more than just link rot, it's the increasing complexity of keeping
alive indie content on the web, leading to a reliance on platforms and
time-sorted publication formats (blogs, feeds, tweets).</p>
</blockquote>
<p><a href="https://jeffhuang.com/designed_to_last/">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=CfizQsGWOxI'>Brittany Howard - Stay High (Official Video) - YouTube</a>
</h4>
<figure>
  <iframe
    src="https://www.youtube.com/embed/CfizQsGWOxI"
    frameborder="0"
    allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
    allowfullscreen></iframe>
</figure>
<p>This makes me feel good. Small town vibes and values.</p>
<p><a href="https://www.youtube.com/watch?v=CfizQsGWOxI">Read more...</a></p>
<h4>
  <a href='https://superorganizers.substack.com/p/the-magically-unstructured-life-of'>The Magically Unstructured Life of a Crypto Baller</a>
</h4>
<blockquote>
<p>I schedule anti-procrastination slots with friends whenever I have to do
something that I know I’m going to be putting off.</p>
<p>That would be something like collecting all of the papers for my accountant
for taxes, which I hate doing. I’ll call a friend and say, “Hey, let’s get
together for two hours on Sunday and do all the things that neither of us
wants to do.”</p>
<p>It’s so good because everybody is dreading doing something, and if you do it
together it’s way less s----y. Misery loves company, so I think it's a good
way to do it. You end up just getting it done instead of worrying about it.</p>
</blockquote>
<p>I <em>love</em> this. I don't agree with everything she does, but I like this idea a
lot.</p>
<p><a href="https://superorganizers.substack.com/p/the-magically-unstructured-life-of">Read more...</a></p>
<h4>
  <a href='https://www.garynorth.com/public/20323.cfm'>Trump Unleashed</a>
</h4>
<p>I don’t know what is scarier, a world where impeachment is meaningless and
useless like this author describes, or a world like the one Al Mohler fears
where impeachment replaces the peaceful transferal of power <em>every</em> single
time.</p>
<p><a href="https://www.garynorth.com/public/20323.cfm">Read more...</a></p>
<h4>
  <a href='https://brettterpstra.com/2019/12/27/memories-post-scrapbook-pre-facebook/'>Memories post-scrapbook, pre-Facebook - BrettTerpstra.com</a>
</h4>
<blockquote>
<p>I recently stumbled upon a web project from about 17 years ago that really put into perspective how far certain technologies have come in the last couple of years…</p>
</blockquote>
<p>This is wonderful. I miss this era of web experimentation and macgyvering.</p>
<p><a href="https://brettterpstra.com/2019/12/27/memories-post-scrapbook-pre-facebook/">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Without Fear: Philippians 1</title>
       <link>http://evantravers.com/articles/2019/12/04/without-fear-phillipians-1/</link>
       <pubDate>Wed, 04 Dec 2019 15:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/12/04/without-fear-phillipians-1/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/12/sunset.jpeg"></p><blockquote>
<p>[27] Only let your manner of life be worthy(1) of the gospel of Christ, so
that whether I come and see you or am absent, I may hear of you that you are
standing firm in one spirit, with one mind striving side by side for the
faith of the gospel, [28] and not frightened in anything by your opponents.
This is a clear sign to them of their destruction, but of your salvation, and
that from God. [29] For it has been granted to you that for the sake of
Christ you should not only believe in him but also suffer for his sake, [30]
engaged in the same conflict that you saw I had and now hear that I still
have.</p>
</blockquote>
<p>As long as I have been reading and listening, I have heard the fear of the
faithful. As western culture continues to bite the hand that fed it, setting
fire to its own moral foundation, Christian bookstores and blogposts are filled
with nervous queries of &quot;how do we turn this around?&quot; &quot;What will we do?&quot; I
myself have lost sleep over this. I tussle my two-year old's tangled curls,
read the news, and wonder what world she will have to face in twenty years.</p>
<p>So I'm going to read her this… and pray for strength and humility to live it
out:</p>
<blockquote>
<p>For it has been granted to you that for the sake of Christ you should not
only believe in him but also suffer for his sake…</p>
</blockquote>
<p>We are called to live worthy of the gospel, standing firm in one spirit,
working as one with the faithful, <strong>not frightened</strong> in anything.</p>
<p>The battle is won already… but for a time we are to <em>bear</em> our cross, not just
wear it on a t-shirt. The team who is already one hundred points ahead on the
scoreboard with seconds to spare doesn't fear losing the ball. The final
outcome is decided. How will we play out our few moments on the world stage?</p>
<blockquote>
<p>Only let your manner of life be worthy, […] standing firm in one spirit, with
one mind striving side by side for the faith of the gospel, and not
frightened in anything […]. This is a clear sign to them […]. For it has been
granted to you that for the sake of Christ you should not only believe in him
but also suffer for his sake…</p>
</blockquote>
<p>Without fear. With unity. A witness, a clear sign. Living as victors in
eternity. The rest of Philippians instructs us how to live in unity, but for
this morning my mind is being transformed about what it means to no longer
fear.</p>
<p>As the body of Christ, we have a long way to go when it comes to working in
unity and living without fear, and it starts in my heart and my home, focusing
on an already victorious savior and glorying in an honor that has been granted
for a time and for a purpose.</p>
<p>Lord, grant us eyes fixed upon your glory. Hold our faces in your hands, speak
to us so that the waves around us and in us die down so that all we see is you.
Your perfect love drives out fear. Help us to live in unity and without fear.
In your precious name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Advent of Code 2019: Elixir @callback</title>
       <link>http://evantravers.com/articles/2019/12/03/advent-of-code-2019-elixir-callback/</link>
       <pubDate>Tue, 03 Dec 2019 18:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/12/03/advent-of-code-2019-elixir-callback/</guid>
       <description><![CDATA[ <p>It's <a href="https://adventofcode.com/">Advent of Code</a> season again! I can't believe
it's been three years since I started participating. It's such a fun time to
remember why I like programming in the first place. I use it to learn new
languages, hone skills and patterns, and just have fun.</p>
<p>I'm always obsessed with building tooling, so while the problems are easier I'm
having a great time defining a sort of test runner for my advent of code… I
think this is my second or third year trying in elixir, so I'm trying some new
things.</p>
<p>This year's (current) model is using <code>@callback</code> to define a sort of API that
all Advent problems have to solve:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">defmodule</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Advent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">moduledoc</span> <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;&quot;
</div><div class="line" data-line="3">  This is intended to be an importable module that defines some runners and
</div><div class="line" data-line="4">  conventions for advent of code problems.
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  Each &quot;day&quot; should contain the following methods...
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"></span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">  - </span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`setup/0` should setup a input object.
</div><div class="line" data-line="9">  </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`p1/1` and `p2/2` should take the input and solve the puzzle, returning the
</div><div class="line" data-line="10"></span>    <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">answer.
</div><div class="line" data-line="11"></span><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="12">  I want to define a test runner such that if you run mix &lt;day number&gt; it runs
</div><div class="line" data-line="13">  `setup/0` once and runs `p1/1` and/or `p2/1` when appropriate.
</div><div class="line" data-line="14">  &quot;&quot;&quot;</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">callback </span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">setup</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">term</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">callback </span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">term</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="18">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">callback </span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Map</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">t</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">::</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:ok</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">term</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="19"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>If you look at the whole file
<a href="https://github.com/evantravers/adventofcode/blob/master/2019/elixir/lib/advent.ex">here</a>,
it also defines some timing functions as a mix task, which is fun. There's a
crazy challenge for solving all puzzles under a certain time limit… I think
this year I'll have to settle for just solving all puzzles.</p>
<p>This pattern really became really fun for today's puzzle (<a href="https://adventofcode.com/2019/day/3">Day
3</a>). As I started into part 2, more of p1
moved up into <code>setup/0</code> so that <code>p1/1</code> and <code>p2/1</code> are <em>just</em> the specific
solutions to their part.</p>
<p>For instance:</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">min_by</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">x</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">y</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">abs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">x</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">abs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">y</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">x</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">y</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">abs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">x</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">abs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">y</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>and</p>
<pre class="lumis"><code class="language-elixir" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wires: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wire1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wire2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections: </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">intersections</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fn</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">coord</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-&gt;</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_index</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reverse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wire1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">coord</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find_index</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reverse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wire2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">coord</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|&gt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Enum</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">min</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>You can see my <a href="https://github.com/evantravers/adventofcode/blob/master/2019/elixir/lib/day03/crossed_wires.ex">full day 3 solution
here</a>.
Let me know if you have a better way of managing the problems, this is my
favorite so far.</p> ]]></description>
    </item>
    <item>
       <title>Things.app: 12+ months</title>
       <link>http://evantravers.com/articles/2019/11/27/things-app-12-months/</link>
       <pubDate>Wed, 27 Nov 2019 20:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/27/things-app-12-months/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/things_header.jpg"></p><p>A little over a year ago, I <a href="http://evantravers.com/articles/2018/07/31/bullet-journal/">was happily using my Bullet
Journal</a> to track
<em>everything</em> in my life. In early October of 2018, I was juggling five
research/design projects whose deadlines were shifting rapidly because of an
unstable roadmap. The resulting chaos of &quot;which thing is due when&quot; and
consequently &quot;what should I do first?&quot; became very overwhelming. On a whim, I
installed Things, moved the date-intensive Tasks over, set new due dates… I
could feel myself physically relax.</p>
<p>I have now employed Things alongside my journal for a year. I had tried the
trial month sometime the summer before last, but I did not yet have the review
habits needed to be successful. This particular attempt has left me quite
pleased with the software and with
<a href="http://twitter.com/culturedcode">@culturedcode</a> in general. While I am still
not an expert, I have learned a few tricks and gotchas that may help you.</p>
<p>I will never do as complete a job as the <a href="https://thesweetsetup.com/apps/best-personal-gtd-app-suite/">excellent review at The Sweet
Setup</a>. That is
the right link<sup class="footnote-ref"><a href="#fn-tss" id="fnref-tss" data-footnote-ref>1</a></sup> if want to know all about Things' feature set and
differentiators, this will be a more focused conversation about my personal
experience<sup class="footnote-ref"><a href="#fn-experience" id="fnref-experience" data-footnote-ref>2</a></sup>.</p>
<h2><a href="#the-good" aria-hidden="true" class="anchor" id="the-good"></a>The Good</h2>
<p>Things.app has many features that are shared with other Task apps… due dates,
lists, etc. Here are some of the differentiating features that attracted me.</p>
<h3><a href="#the-forgetful-task-app" aria-hidden="true" class="anchor" id="the-forgetful-task-app"></a>The &quot;forgetful Task app&quot;</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/quick_add.png" alt="" /></p>
<p><a href="https://thesweetsetup.com/things/">Shawn</a> of course has the best quote here:</p>
<blockquote>
<p>I need a place to dump all the ideas, projects, and to-do items that come my
way so I can happily live in the here-and-now rather than in the
what’s-to-come. And Things’ ability to handle vast amounts of Tasks while
keeping them in order with lists and notes is better than any other app I’ve
used.</p>
</blockquote>
<p>While living in the here and now is something I struggle with, this is the
reason I am still in Things. I can dump a fragment of an idea, a link to a
page I need to read, or a Task I need to complete to the Inbox and forget
about it.  Eventually, I can file the Task in its proper place, and trust the
system to bring it back at the right time.</p>
<p>Ideally, I would only empty the Inbox once a day at the end of the day… but I
am still struggling with an hourly impulse to drive to &quot;Inbox Zero<sup class="footnote-ref"><a href="#fn-zero" id="fnref-zero" data-footnote-ref>3</a></sup>&quot;. I
am finding a <em>ton</em> of value of putting any distraction into the inbox,
especially during hyper-scheduling focus sessions. I have even experimented
with logging &quot;things I want to google&quot; and &quot;questions I am going to ask on
Slack&quot; while doing a pomodoro-style focus session. It is surprising how many
questions and Tasks get deleted out of my Things Inbox because they were
really never needed… and that distraction could have dragged me off a
different direction.</p>
<h3><a href="#today--evening" aria-hidden="true" class="anchor" id="today--evening"></a>Today / Evening</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/evening.png" alt="" /></p>
<p>This is a simple idea, but very helpful for me. I even stole it for my Bullet
Journal after the first time I used Things.</p>
<p>By being able to see what I have for the day separated by Today and Evening, I
can get a more accurate picture of the day than if they were on separate
lists/contexts of Work and Home. This is especially helpful when connected to
the calendar view above.</p>
<h3><a href="#context-notes-for-projects" aria-hidden="true" class="anchor" id="context-notes-for-projects"></a>Context notes for Projects</h3>
<p>This is one of the <strong>main</strong> reasons to try Things. By making notes first-class
citizens of both a Task and a Project, Things becomes a little more than a Task
Manager.</p>
<p>Here are some pieces of context I have placed in the context note of a
Project:</p>
<ul>
<li>notes from the meeting that spawned the Project.</li>
<li>URLs to Trello/JIRA where all the collaborative work is stored.</li>
<li>&quot;links&quot; to bullet journal pages with notes or diagrams related to this
Project.</li>
<li>names of stakeholders in this Project.</li>
</ul>
<h4><a href="#feature-request-context-notes-for-areas" aria-hidden="true" class="anchor" id="feature-request-context-notes-for-areas"></a>Feature Request: Context notes for Areas</h4>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/launchcenterpro_tasks.png" alt="">
  <figcaption>
    Here's an example of how I use Launch Center Pro to store "saved filters"
    for common searches of Tasks in Things.app
  </figcaption>
</figure>
<p>I would love to be able to store links to Things URLs for search in the Areas.
I have URLs for searching for Tasks by type and urgency, and it would be nice
for those to live in Things. Currently, I maintain them on my phone using
Launch Center Pro and on my laptop using Alfred. Having a way to store
searches in Things means one less thing, and would be very powerful for me.</p>
<h2><a href="#the-bad" aria-hidden="true" class="anchor" id="the-bad"></a>The Bad</h2>
<h3><a href="#troubles-with-with-tags" aria-hidden="true" class="anchor" id="troubles-with-with-tags"></a>Troubles with with Tags</h3>
<p>In Things.app, all filtering is by Tags. Areas and Projects are just views or
lists. If you want to have a search that includes work things, you need to add
a Tag to the Area or Project to search by. This results in me making a Tag for
each Area. Consistent, but weird. There are times I'm grateful for it, because
I can search across Areas, but it tripped me up at first.</p>
<p>One thing Omnifocus has that Things doesn't is the ability to search for Tasks
that <strong>don't</strong> have a Tag. This would let me do things like create a filter for
Tasks that are not estimated. (Basically a review filter.) There is no way that
I know of to do that in Things 3. <a href="https://twitter.com/culturedcode/status/1159690868942614528">It's on their
list</a>, but no word
of when.</p>
<p>I also wish I could search for a Tag, but not its children. For instance, I Tag
things related to my team as &quot;@Team UX&quot;, and my teammates' Tags are children of
that Tag. I'd like to be able to search for the team Tag and not see the
children's Tasks too. (I'll often have Tasks tagged Agenda for the team and for
one on one meetings… I'd prefer them to be separate.)</p>
<p>I understand Omnifocus has concepts related to sequencing and automating by
location or time that makes surfacing the right Tasks easier. I've hacked some
of this in using Launch Center Pro… it prompts me to open a search for Tasks
tagged &quot;errands&quot; when I leave my house.</p>
<p>Omnifocus also has the concept of Status on Tags. The biggest use is to say
that this Tag is &quot;blocked,&quot; allowing you to hide Tasks that depend on a
colleague on vacation for instance… I guess I could manually change the name of
the Tag or move it in the hierarchy to a category of Blocked, but eh.</p>
<h4><a href="#mass-add" aria-hidden="true" class="anchor" id="mass-add"></a>Mass-add</h4>
<p>I really wish you could mass add Tags easily on desktop. You can use keyboard
shortcuts, but only on a case by case basis. <a href="https://twitter.com/culturedcode/status/1116672653534875651?s=20">There's a ticket for multi select
and add…</a>
which is especially weird because it works on mobile and iPad.</p>
<p>I have to imagine that with catalyst now in the wild, Cultured Code is
considering consolidating their code base, maybe we will see more consistent
interactions at that point.</p>
<h3><a href="#priority-and-scheduling" aria-hidden="true" class="anchor" id="priority-and-scheduling"></a>Priority and Scheduling</h3>
<p>The relationship of scheduling and priority is odd.</p>
<h4><a href="#priority-by-date-" aria-hidden="true" class="anchor" id="priority-by-date-"></a>Priority by Date? 🚫</h4>
<p>When I first got the app, I took my list of Tasks, assigned each and every one
of them to a day in the future, and started busting through them. At the time
this seemed awesome because Tasks automatically dropped into my Today list on
the scheduled day.</p>
<p>Don't do this.</p>
<p>Inevitably, you'll have some mild emergency which means that tomorrow you'll
either do two things (unlikely) or have to push <strong>all</strong> of your Tasks forward a
day.</p>
<p>Scheduling a Task is more about <em>deferring</em> the mental overhead of dealing with
this Task until later. This is clearer when you notice the option to hide Tasks
that are scheduled.</p>
<p>Now I put time blocks on my calendar by theme (email, design, communication) or
Project, then pull Tasks out of Things based on the block I've prioritized.
This has worked well for me.</p>
<p>The Due Date concept works as expected. It shows you how many days are left in
that Task or Project, and has an inherent &quot;scheduling&quot; feature where it'll show
up in your Today list in the days leading up to the Due Date.</p>
<p>So if priority in the dates, when is it?</p>
<h4><a href="#priority-by-order-maybe" aria-hidden="true" class="anchor" id="priority-by-order-maybe"></a>Priority by order? Maybe.</h4>
<p>Things definitely would prefer you to order your Tasks by priority. The way
Anytime hides all but the top few Tasks on each List definitely indicates that
you ought to order Tasks by priority. But some Projects… the priority isn't
always that clear. Sometimes I have just a collection of possible Tasks, and
some of them are important, and others aren't.</p>
<h2><a href="#tricks-and-tips" aria-hidden="true" class="anchor" id="tricks-and-tips"></a>Tricks and Tips</h2>
<h3><a href="#anytime-is-your-friend" aria-hidden="true" class="anchor" id="anytime-is-your-friend"></a>Anytime is your friend</h3>
<p>I was really stumped by Things for a while… the views in the sidebar (Today,
Upcoming, Anytime, Someday) all have to do with time, so this lead me down the
wrong path for a while until I learned the truth.</p>
<p>You can do most things just about Anytime. So Anytime is your best buddy.</p>
<p>Today is the home of Tasks and Projects I have committed to today. When I run
out of Tasks, I often reach into Anytime to identify the next things that I
need to do.</p>
<p>If you go to an Area, you'll see the Projects and Tasks for that Area… but you
won't see the Tasks inside the Projects in that Area, which is often the
information you need to decide what to spend time on next. Anytime can provide
that to you… especially if you use the search/filtering features.</p>
<p>Every single review, agenda, or fancy search that I have set up in Things is a
Tag filter of the Anytime view. It's the &quot;backlog&quot; of Things.</p>
<h3><a href="#create-recurring-tasks-for-rituals" aria-hidden="true" class="anchor" id="create-recurring-tasks-for-rituals"></a>Create recurring Tasks for rituals</h3>
<p>There is not a GTD-esque &quot;review&quot; view in Things.app. One way I found to make
these rituals a little easier is to use Things to prompt you to groom Tasks in
Things.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/repeating.png" alt="" /></p>
<p>While it is a helpful reminder for me, the real benefit is that you can put
URLs in the Checklist and Notes... walking me through the habit that I want to
build in my life. This is the only way I have found to implement the saved
searches in Things.app that I was talking about in <a href="#feature-request-context-notes-for-areas">the above
section</a>.</p>
<h2><a href="#summary" aria-hidden="true" class="anchor" id="summary"></a>Summary</h2>
<p>I really like Things. I have my quibbles, but honestly it's been more good
than bad, and it's beautiful design and context-centric view of task
management keeps me coming back. Like all task managers, you get out of it
what you put into it, and a couple good rituals and habits</p>
<p>I could see myself investing into Omnifocus at some point, but I honestly
haven't found too many problems I haven't been able to tackle with the simple
tools that Things provides, and as word-y and context-heavy as my Projects
are, Things seems to be the best tool for the job.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-tss">
<p>As of November 2019, that link recommends Things. As they have built a
whole course around it, I don't see that changing soon. <a href="#fnref-tss" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-experience">
<p>I have used Omnifocus only to play with the free trial. People I
follow discuss it a lot, so I do hear about its featureset… and I read all
its documentation while researching Tagging systems. I have also used
vimwiki, Taskpaper, todo.txt, trello, Todo.app, wunderlist, and of course
bullet journaling. <a href="#fnref-experience" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-zero">
<p>Nothing intrinsically wrong with <a href="https://www.lifehack.org/articles/lifehack/ultimate-way-inbox-zero.html">inbox
zero</a>,
I just want to avoid the context shift. I stop thinking about focused work
when I'm answering the question &quot;where does this go?&quot; <a href="#fnref-zero" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Making a Book Using Ruby</title>
       <link>http://evantravers.com/articles/2019/11/21/making-a-book-using-ruby/</link>
       <pubDate>Thu, 21 Nov 2019 02:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/21/making-a-book-using-ruby/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/book_photo.JPG"></p><p>When I realized my then-girlfriend was saving all her old cellphones to
preserve our texts and had print-outs of all our emails… I thought I could
surprise her and make an archival PDF of all our emails and texts.</p>
<p>And then some scope creep occurred… and I wound up writing the program that
provided me the most joy and satisfaction of <em>anything</em> I've ever made.</p>
<h2><a href="#mvp-a-combined-pdf" aria-hidden="true" class="anchor" id="mvp-a-combined-pdf"></a>MVP: A combined PDF.</h2>
<p>My first thought was simply to use gmail to print all our emails, and to use
<a href="https://www.ecamm.com/mac/phoneview/">ecamm's PhoneView</a> to export a PDF of
our texts, and then just use Preview.app to smush the two together.</p>
<p>This worked… but it doesn't read chronologically… first you get all the emails
and then you see all the texts. It was all there, but it didn't read like a
story.</p>
<p>PhoneView can export conversations in xml format. If I could get the emails in
a readable format, I could sort them by their date stamp and be able to read our
story in order!</p>
<p>The seed was planted, and scope grew… exponentially.</p>
<h2><a href="#v2-a-giant-webpage" aria-hidden="true" class="anchor" id="v2-a-giant-webpage"></a>v2: A giant webpage.</h2>
<p>I had to do some finagling… eventually found a roundabout way of downloading
the emails. I used OSX's Mail.app to connect to my gmail via IMAP, and
therefore downloaded all my email to my computer.</p>
<p>At first I was running this manually… eventually it became part of a makefile:</p>
<pre class="lumis"><code class="language-bash" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cd</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~/Library/Mail/V3/IMAP-evantravers@imap.gmail.com/</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ag</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-l</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;heremail@gmail.com&#39;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">xargs</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-I</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cp</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">~/src/bitbucket.org/evantravers/sarahsbook/src/story/email</span>
</div></code></pre>
<p>Pretty quickly… I had a really basic ruby script that crawled the SMS-oriented
xml file and email files, built some ruby objects, sorted by date, and printed
them to an HTML file. I could read an email, and read the texts that were a
response to the email. I could read our story!</p>
<p>Except… there were so many other artifacts that were mentioned in the
messages… songs added to our shared Spotify list, posts on our instagram
accounts… even my journal entries that Sarah hadn't read yet. What if I could
connect all these different pieces of story and read our relationship right
through time!</p>
<p>So I turned on <a href="https://lolcommits.github.io/">lolcommits</a> so I'd have a record
of my working, and kept hacking away.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/lolcommits.png" alt="">
  <figcaption>Lolcommits are seriously underrated... and eventually made it into the final book.</figcaption>
</figure>
<p>I wrote a simple class that all my different media classes could inherit
from… it just implemented Comparable so that all different objects could
display historically.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Media</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Comparable</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attr_accessor</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:from</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:to</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;=&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">media</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">media</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">elsif</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">self</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">media</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>The heart of the story-building ruby script became quite simple looking...
process all the sources of media, sort by time, and away we go!</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">collect_the_story</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sms</span>      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">process_sms</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">process_emails</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notebook</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">process_images</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">music</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">process_music</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insta</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">process_instagram</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">history</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sms</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notebook</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">music</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">insta</span>
</div><div class="line" data-line="9">
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">history</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort!</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Over time, the classes that inherited from <code>Media</code> fell into a semblance of
order. There was some setup, some helper classes, a <code>to_s</code> method for debugging
and a <code>to_html</code> method for writing itself into the &quot;story.&quot; Here's what the
<code>Instapost</code> class looks like, which wound up being one of the simplest.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">redcloth</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">htmlentities</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">require_relative</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">media</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Instapost</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Media</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attr_accessor</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:message</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">initialize</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">likes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@date</span>    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@id</span>      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">id</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@message</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@author</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author</span>
</div><div class="line" data-line="13">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@likes</span>   <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">likes</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filtered_message</span>
</div><div class="line" data-line="17">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Gemojione</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">replace_unicode_moji_with_images</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="18">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\uFE0F</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u&lbrace;1F3FF&rbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u&lbrace;1F3FB&rbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u&lbrace;1F3FC&rbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u&lbrace;1F3FE&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">RedCloth</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_html</span>
</div><div class="line" data-line="20">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">HTMLEntities</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">decode</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="21">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="22">
</div><div class="line" data-line="23">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">def</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_html</span>
</div><div class="line" data-line="24">    <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%Q&lbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">
</div><div class="line" data-line="25">      &lt;div class=&quot;media  instapost&quot;&gt;
</div><div class="line" data-line="26">        &lt;div class=&quot;instapost--author&quot;&gt;&lt;img class=&quot;instapost--profile&quot; src=&quot;../src/story/instagram/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@author</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.png&quot; alt=&quot;&quot;&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@author</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/div&gt;
</div><div class="line" data-line="27">        &lt;img class=&quot;instapost--image&quot; src=&quot;../src/story/instagram/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@id</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.png&quot;&gt;
</div><div class="line" data-line="28">        &lt;div class=&quot;instapost--likes&quot;&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@likes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> likes&lt;/div&gt;
</div><div class="line" data-line="29">        &lt;div class=&quot;instapost--caption&quot;&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filtered_message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/div&gt;
</div><div class="line" data-line="30">      &lt;/div&gt;
</div><div class="line" data-line="31">    </span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="32">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="33"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<h3><a href="#the-hardest-problem-emails" aria-hidden="true" class="anchor" id="the-hardest-problem-emails"></a>The Hardest Problem: Emails</h3>
<p>Instagram, Spotify, lolcommits, and scans from my journal were relatively
simple to import and include in the story. They had at least some kind of
understandable API that I could query, organize, and import.</p>
<p>Emails… emails were <em>hard</em>. Sarah used multiple email accounts in our
conversations. She replied from different phones and different operating
systems.</p>
<h4><a href="#replies" aria-hidden="true" class="anchor" id="replies"></a>Replies</h4>
<p>The first big problem is that <del>every</del> most email replies include the full
content of every email and attachment before it… and Sarah and I hit reply a
lot. I guess we didn't want to let the email conversation die? Whatever.</p>
<p>After much travail and experimentation, (made easier thanks to the <code>to_s</code>
method and <a href="https://pryrepl.org/">pry</a>) I wound up with this monstrosity.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">On </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">A</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Z</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">z</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">z</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wrote:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">---------- Forwarded message ---------</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Sent from my iPhone</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt; On</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">wrote:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">From:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># handle fwds?</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">next</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil?</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">length</span>
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># this is to remove the first character. :P</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">..</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">bodyend</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rstrip!</span>
</div></code></pre>
<p>The main trick was covering all the different ways our email client's
represented the end of a reply and the beginning of the email to which we were
replying. I pretty much kept adding to the regex as I read through our history,
covering new case after new case.</p>
<p>However, replies weren't done with me yet.</p>
<h4><a href="#attachments" aria-hidden="true" class="anchor" id="attachments"></a>Attachments</h4>
<p>Attachments were worse. In terms of reading the story, the reader just cares
about the first time an image was sent.</p>
<p>After a while, I came up with this.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># email_collection is all the emails and all their attachments</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email_collection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort!</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># unique all the attachments by date</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email_collection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachments</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">empty?</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email_attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subject</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">||=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Set</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">known_images</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email_attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">subject</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachments</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="12">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">known_images</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="13">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachments</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachments</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">known_images</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;&lt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="18"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="19">
</div><div class="line" data-line="20"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">email_collection</span>
</div></code></pre>
<p>I probably could have used some smarter code, but this made sure that only the
first occurrence of an attachment made it to the final HTML. (This cut down
several <em>hundred</em> pages worth of space!!!)</p>
<h2><a href="#intermission-architecture" aria-hidden="true" class="anchor" id="intermission-architecture"></a>Intermission: Architecture</h2>
<p><img src="https://images.evantravers.com/articles/2019/11/arch.png" alt="architecture" /></p>
<p>This thing is <em>still</em> a sprawling, very customized script, but there is some
method to the madness.</p>
<p>There is basically a three step process… mostly driven by the makefile.</p>
<h3><a href="#get-the-data" aria-hidden="true" class="anchor" id="get-the-data"></a>Get the data</h3>
<p>This is a combination of PhoneView's SMS export, my
makefile and ruby scripts for getting all the emails out of Mail.app's file
store, and some simple ruby API calls to get data from Spotify and
Instagram.</p>
<p>The scripts included things like imagemagick calls to clean up the scans of my
journals and notebooks that I was photographing with my phone.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/journals.png" alt="">
  <figcaption>
    As you can see, it became an obsessive quest to capture the "whole story".
    I used scanbot to grab jpgs of my journals, then cropped manually to the
    sections about our relationship, and used <code>mogrify -colorspace Gray
    -level 20%,75% -sharpen 0x1 *.jpg</code> to normalize them.
  </figcaption>
</figure>
<h3><a href="#clean-the-data" aria-hidden="true" class="anchor" id="clean-the-data"></a>Clean the data</h3>
<p>The simple API calls produced very clean data, but the Email and SMS data is
filled with duplications and gotchas. A lot of those &quot;fixes&quot; are found in <a href="#addendum-hacks">at
the end of this article</a>.</p>
<h3><a href="#build-the-book" aria-hidden="true" class="anchor" id="build-the-book"></a>Build the book</h3>
<p>Now that we have data in a clean format, we can pull it in, sort it, and we are
good to go!</p>
<p>All through this, I was honing the presentation of the &quot;webpage&quot; using CSS. I
had written some BEM style classes to style everything, and it was <em>really</em> fun
to emulate things like the iMessage format and the way Gmail displays emails.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/multiple_things.png" alt="">
  <figcaption>
    The more I worked, the more excited I became. It was a really fun project.
  </figcaption>
</figure>
<p>I kept adding little features... date stamps that only appeared when there
wasn't a new message for an hour, pink and blue bubbles for messages from me to
her, new styling for attachments and emails... I was having a <strong>blast</strong>.</p>
<h2><a href="#v4-printing-a-program" aria-hidden="true" class="anchor" id="v4-printing-a-program"></a>v4: Printing a program.</h2>
<p>At this point, my goal was still a PDF that we could read on our phones. I
could generate some HTML, style it with CSS, and print to PDF. While I was
originally just going to use Chrome's Print to PDF, I had found <a href="https://www.princexml.com/">Prince
PDF</a>.</p>
<p>While reading Prince's documentation, I found special &quot;CSS&quot; rules for preparing
your PDF for professional printing. I started learning about bleed, about the
weird ways I would have to re-order the pages in order to be printed on a
professional printer…</p>
<p>What if I could <em>hold</em> this book? Time had been flying by, and I was starting
to plan my proposal to Sarah… what if I could hand her a copy of our story on
the day I ask her to marry me? Suddenly I had new goals, and a new deadline.</p>
<p>One problem… the book was over 900 pages long. I guess we texted a <em>lot</em>. :P</p>
<p>After some massaging the font size and making the messages run two columns per
page, I was able to bring the page count under 600 pages, but that was still
<em>way</em> out of range of most self-publishing options. Blurb and its ilk limits
you to 200 pages… there isn't an amateur self-publishing option I could find
that would do a huge, cookbook-sized 600 page book.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/book_size.JPG" alt="">
  <figcaption>It's a monster book, here's an iPhone for scale.</figcaption>
</figure>
<p>So I turned to professional options. After searching and talking to a lot of
folks I found <a href="https://www.bookbaby.com/">BookBaby</a>. I was desperate at this
point… and was willing to pay for a run of 25 just to have one.</p>
<p>While talking with their team about what I was trying to do, they were
<em>incredibly</em> kind. It turns out a lot of people like to help young people in
love. When the first &quot;proof&quot; arrived damage, they replaced it for free and they
even rushed production and overnighted it to me so that I'd have it in time for
The Big Day.</p>
<blockquote>
<p>Genevieve… I had chatted with Mike Taylor earlier and he had assured me that
it would be shipping by today… I am proposing to my girlfriend the 29th,
using this book… I waited on Mike to order it and now I'm a liiiiittle
distraught at the moment. Is there <em>any</em> way to get it to my door before the
29th?</p>
<p>Evan</p>
</blockquote>
<blockquote>
<hr />
<p>Genevieve (BookBaby)</p>
<p>Let me check with our production team for this. Hang tight and I'll follow up
shortly.
Thank you,
Genevieve</p>
<hr />
<p>Hi Evan - I just heard back from our production team. It looks like this
order was actually able to ship out today. (woohoo!)</p>
<p>Here is the tracking number:
1ZA5R4620102748342</p>
<p>It might take a few hours to refresh (it's usually around 8PM EST that the
tracking will update by if it's shipping out of the West Coast facility).</p>
<p>Take care and good luck!
Thank you,
Genevieve</p>
<hr />
<p>Praise the Lord!! Thank you so much!</p>
</blockquote>
<p>Mike, John, and Genevieve, if you ever read this, thank you.</p>
<h2><a href="#holding-the-hack" aria-hidden="true" class="anchor" id="holding-the-hack"></a>Holding the hack</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/holdingthehack.jpg" alt="">
  <figcaption>
    This is within seconds of me tearing the book out of its wrapping...
  </figcaption>
</figure>
<p>I will <em>never</em> forget the feeling of unwrapping the first proof and holding the
results of my labor in my hands. <strong>It actually worked</strong>. It was beautiful. I had
gotten all the weird printing-specific CSS and measured all the bleeds right,
and now I was holding a hard-cover copy of my silly little love story, just in
time to present it to Sarah.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/book_open.JPG" alt="book open" /></p>
<p>Just the other night we opened it again and read through it together, just to
remind ourselves of what we were like four years ago. It'll hopefully be here
to remind us of what God has done for years to come.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/frontpiece.JPG" alt="">
  <figcaption>Piper's vision for the logo was effortless and perfect.</figcaption>
</figure>
<p>I owe so much to those who helped me with the book: friends like Tom and Ben
that encouraged me and helped me debug some of the intricacies of dealing with
email replies, the amazing <a href="http://www.piperismy.name/">Piper Weaver</a> who
designed an <em>incredible</em> logo for the cover, and the kind folks at BookBaby who
overnighted a proof for a fictional run of books so that a tired programmer
could propose.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/book_quote.JPG" alt="" /></p>
<p>It's a treasure.</p>
<hr />
<h2><a href="#addendum-hacks" aria-hidden="true" class="anchor" id="addendum-hacks"></a>Addendum: Hacks</h2>
<p>It's been a while since I looked through this code… here are some weird gotchas
I noticed while I was researching for this article.</p>
<p>I'm not proud of this. In my defense, I wasn't sleeping much.</p>
<h3><a href="#ive-seen-this-before" aria-hidden="true" class="anchor" id="ive-seen-this-before"></a>I've seen this before</h3>
<p>You know that thing when a text decides to send itself twice? Sarah's phone did
that constantly for months, and it really made the book ugly. So…</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># check for duplicates</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">thisisaduplicate</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sms_collection</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">last</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">3</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prev_message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prev_message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">empty?</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prev_message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">thisisaduplicate</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">true</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">empty?</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">||</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachment</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">thisisaduplicate</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sms_collection</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;&lt;</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Sms</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachment</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<h3><a href="#you-can-bring-a-plus-one" aria-hidden="true" class="anchor" id="you-can-bring-a-plus-one"></a>You can bring a plus one</h3>
<p>PhoneView had a naive solution for handling duplicate SMS attachment
filenames… it just incremented the last digit of the file name.</p>
<p>This means I had to handle this in my code.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jpg</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">jpeg</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">png</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">JPG</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># stupid test case</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># if the image has the same name, the SMS export</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># incremented the last digit of the file name</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">global_sms_attachments</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include?</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-1.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">join</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="12">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">while</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">global_sms_attachments</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">include?</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">gsub!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(?</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\d</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(?</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span>
</div><div class="line" data-line="14">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">to_i</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="16">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div><div class="line" data-line="18">
</div><div class="line" data-line="19">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attachment</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span>
</div><div class="line" data-line="20">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">global_sms_attachments</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;&lt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">file</span>
</div><div class="line" data-line="21"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<p>Cringey.</p>
<h3><a href="#cheating-on-attachments" aria-hidden="true" class="anchor" id="cheating-on-attachments"></a>Cheating on attachments</h3>
<p>I had some emails that were missing attachments after import… but if I searched
my whole computer for the filename, I'd find it in some random folder buried in
the filesystem. I don't rightly know why… I suspect that Mail.app was caching
them.</p>
<p>Rather than figure out what was going on... I wrote this. Not very performant.</p>
<pre class="lumis"><code class="language-ruby" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">nil?</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">||</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">decoded</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># time to cheat! Find the saved file in the mailbox</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cheated_file_path</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="4">    <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;my user path&gt;/Library/Mail/V3/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">select</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">item</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">first</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=~</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># FileUtils.cp(cheated_file_path, image_path)</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">puts</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cheated_file_path</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">read</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cheated_file_path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">auto_orient!</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image_path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">File</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">open</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">image_path</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">w+b</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0644</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">f</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">attch</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">body</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">decoded</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span>
</div></code></pre>
<h3><a href="#naughty-list" aria-hidden="true" class="anchor" id="naughty-list"></a>Naughty list…</h3>
<p>In my makefile, I used a imagemagick command to re-orient all my images… but
had to make a special case for this <em>one</em> image that never would behave.</p>
<pre class="lumis"><code class="language-make" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fix</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>
</div><div class="line" data-line="2">	<span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"># fix that one bad one</span>
</div><div class="line" data-line="3">	<span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mv</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src/story/SMS/Christmas.png</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src/story/SMS/Christmas.bak</span>
</div><div class="line" data-line="4">	<span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">cd</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src/story/SMS/</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&amp;&amp;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mogrify</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-auto-orient</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*.</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">JPG,jpg,gif,jpeg,png</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="5">	<span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mv</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src/story/SMS/Christmas.bak</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src/story/SMS/Christmas.png</span>
</div></code></pre> ]]></description>
    </item>
    <item>
       <title>More Fantastical 2 Tips and Tricks</title>
       <link>http://evantravers.com/articles/2019/11/18/more-fantastical-2-tips-and-tricks/</link>
       <pubDate>Mon, 18 Nov 2019 17:02:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/18/more-fantastical-2-tips-and-tricks/</guid>
       <description><![CDATA[ <p>After some in-person and Slack responses to my quick post on Fantastical 2, I
found myself dispensing more of the random things that I can't live without.</p>
<p>Here's four tricks that I can't do without using Fantastical 2.</p>
<h2><a href="#targeting-a-calendar" aria-hidden="true" class="anchor" id="targeting-a-calendar"></a>Targeting a calendar</h2>
<p>I use lots of different calendars. I have a personal calendar for my own
appointments, a work calendar for meetings, a couple work calendars I use to
block off focus time, and a two family calendars (one for commitments for both
my wife and I, and one as an &quot;inbox&quot; for things we <em>might</em> do.)</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/calendartarget.png" alt="">
  <figcaption>
    Here, I'm using <code>/evan</code> to target my personal calendar rather than
    my default work calendar.
  </figcaption>
</figure>
<p>Using Fantastical's natural language input, if you end a string with
<code>/&lt;substring of calendar name&gt;</code> you can target a desired calendar.</p>
<h2><a href="#working-with-people" aria-hidden="true" class="anchor" id="working-with-people"></a>Working with people</h2>
<p>I really value keyboard shortcuts, so finding Fantastical's keyboard-centric
workflow for inviting people to meetings.</p>
<p>If in your natural language input you say something like &quot;Hangout with John
Smith at 3p&quot;, you'll see a little gray box appear around the names of people.</p>
<figure>
  <video src="https://images.evantravers.com/articles/2019/11/invitingpeople.mov"
         controls=controls
         poster="https://images.evantravers.com/articles/2019/11/invitingpeople.png"></video>
  <figcaption>
    Using `⌘⇧+I` to add people.
  </figcaption>
</figure>
<p>If you press <code>⌘⇧+I</code>, you'll get a dialog that lets you pick which emails to
which you want the invitation to the event sent.</p>
<p>If you are worried about the availability, then press <code>⌘⇧+A</code>, and you'll
trigger the Availability picker. I'm not aware of any keyboard shortcuts for
the availability picker, but there it is.</p>
<h2><a href="#duplicate-and-mass-edit-of-events" aria-hidden="true" class="anchor" id="duplicate-and-mass-edit-of-events"></a>Duplicate and mass-edit of events</h2>
<p>I've been experimenting with <a href="https://www.macsparky.com/blog/2018/2/hyper-scheduling-mechanics">hyper
scheduling</a>
for a bit… there's a lot of reasons to try it, but the big takeaway I have at
the moment is that I'm <em>very</em> aware of just how little time I have to focus and
do my job. This work week after lunches, meetings, and breaks, I have 10 hours
to achieve my goals.</p>
<figure>
  <video src="https://images.evantravers.com/articles/2019/11/duplicateevents.mov"
         controls=controls
         poster="https://images.evantravers.com/articles/2019/11/duplicateevents.png"></video>
  <figcaption>
    Selecting multiple events and <code>⌥+drag</code> to duplicate them between
    days!
  </figcaption>
</figure>
<p>Fantastical makes blocking off my whole work week a breeze because I can select
multiple events <em>on multiple calendars</em> and holding ⌥+drag them around to make
duplicates.</p>
<h2><a href="#working-with-search" aria-hidden="true" class="anchor" id="working-with-search"></a>Working with search</h2>
<p><img src="https://images.evantravers.com/articles/2019/11/focussearch.png" alt="searching for events named &quot;Focus&quot;" /></p>
<p>I used to do this a lot more before I learned about the duplication trick
above, but you can select and modify events from the search bar.</p>
<p>At my last job, we used exchange instead of gmail. I would search for all the
events named &quot;Focus : &quot; and select them all for a week, and change their
category just to get the color-coding that I find valuable to understand my
week. Now that I'm on g-suite without calendar categories, I just create them
in the calendar that I created to group similar events. It's not perfect, but
it works.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://flexibits.com/fantastical/help">Fantastical's Documentation</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Viewing Two Weeks in Fantastical 2</title>
       <link>http://evantravers.com/articles/2019/11/14/viewing-two-weeks-in-fantastical2/</link>
       <pubDate>Thu, 14 Nov 2019 15:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/14/viewing-two-weeks-in-fantastical2/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/censored_calendar.png"></p><p>Recently I learned from the <a href="https://www.relay.fm/focused/85">calendar episode of the Focused
podcast</a> that my favorite calendar app,
<a href="https://flexibits.com/fantastical">Fantastical 2</a>, can show 2 weeks in a week
view.</p>
<p>It took me a minute to find the setting... it's under &quot;Days per week&quot;.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/fantastical_setting.png" alt="calendar settings" /></p>
<p>The result has been fairly life-changing really quickly. I have so often booked
a week chock-a-block full… forgetting I have another insane week coming up
right after the weekend. Having that extra visibility is really <em>really</em>
wonderful.</p> ]]></description>
    </item>
    <item>
       <title>Indieweb Webmentions on Middleman or Jekyll</title>
       <link>http://evantravers.com/articles/2019/11/14/indieweb-webmentions-on-middleman-or-jekyll/</link>
       <pubDate>Thu, 14 Nov 2019 00:53:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/14/indieweb-webmentions-on-middleman-or-jekyll/</guid>
       <description><![CDATA[ <p>Recently, <a href="https://twitter.com/ttscoff">@ttscoff</a> asked a little bit about how
I'm including twitter replies to a blog post on my site. I like building and
hacking on stuff on my site… so one of my experiments is &quot;joining the
indieweb.&quot;</p>
<p>There isn't a right way to implement this stuff… one of the beautiful and
bewildering things about the indieweb is how open it is… this is just the way
that I have it working for now.</p>
<h2><a href="#what-is-the-indieweb" aria-hidden="true" class="anchor" id="what-is-the-indieweb"></a>What is the Indieweb?</h2>
<blockquote>
<p>When you post something on the web, it should belong to you, not a
corporation. Too many companies have gone out of business and lost all of
their users’ data. By joining the IndieWeb, your content stays yours and in
your control.</p>
<p>— <a href="https://indieweb.org/">indieweb.org</a></p>
</blockquote>
<p>I've missed the old days of exciting, self-built social networks, web-rings,
and such, and as with all new tech… I like the idea of owning my own content,
but still being connected and part of a network. I like the idea of not being
beholden to some social giant to connect me and steal all my data.</p>
<p>At the moment, indieweb development is a really fun, rowdy, neat group of
developers experimenting and connecting mostly on the indieweb wiki and IRC.
There is a slack mirror of the IRC if that's your jam.</p>
<p>To learn more, check out <a href="https://indieweb.org/">indieweb.org</a> or the <a href="https://indieweb.org/Getting_Started">Getting
Started page</a> on the wiki.</p>
<h2><a href="#tech-details" aria-hidden="true" class="anchor" id="tech-details"></a>Tech Details</h2>
<p>My blog uses <a href="https://middlemanapp.com">middleman</a> for static-site generation.
I'm sure this process should also work for Jekyll, or any other <a href="http://staticgen.com">static
websites</a>.</p>
<p>Using a static site means that all you see is sitting as a static file on S3.
That means that I don't have a server to respond to queries and requests or do
the &quot;thinking&quot; for my website… so for the moment I'm going to have to lean on
some others.</p>
<p>I think that other folks like Keith Grant are using webmentions and micropub to
make their blog more responsive as they move around the web… I may look into
making that work for me. Seems like a fun use case for elixir… but that's
later. For now, it's a ruby build script, and some javascript talking to other
tools to connect everything. More on that.</p>
<p>While working on getting everything configured correctly, I used several tools
to debug my setup. Probably the most helpful was
<a href="https://indiewebify.me/">indiewebify.me</a>. I did experience problems with
several of the tools because I was <a href="https://middlemanapp.com/advanced/file-size-optimization/">compressing files on S3 using
gzip</a> and it was
interfering somehow with the scraper. Once I turned that off everything went a
lot smoother.</p>
<h2><a href="#identity-setting-up-your-indieweb-profile" aria-hidden="true" class="anchor" id="identity-setting-up-your-indieweb-profile"></a>Identity: setting up your indieweb profile</h2>
<p>When you set up a social network… first you set up your profile. It's the same
for the indieweb!</p>
<h3><a href="#webmentionio" aria-hidden="true" class="anchor" id="webmentionio"></a>webmention.io</h3>
<p>My static site can't respond to anything… so someone else has to do the
listening for me. I'm using <a href="http://webmention.io">http://webmention.io</a> after
finding it either in a guide or on the wiki.</p>
<p>I first authenticated my site on <a href="http://webmention.io">webmention.io</a> using a
twitter link… it uses another service called indielogin.com to identify people
by the services they list on their website.</p>
<p>Basically: I can login to twitter. My twitter links to my website and vice
versa. If I can log into my twitter, I can oauth and identify me as the person
who owns my website. Cool!</p>
<p>The install guide on webmention.io walked me through adding the &quot;pingback
URLs&quot;… this means that if someone wants to comment on this website, that's
where they should send their webmention.</p>
<h3><a href="#h-card" aria-hidden="true" class="anchor" id="h-card"></a>h-card</h3>
<p>I also had provide information about myself on my site. Using
<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/microformats">microformats</a>
on an element classed <code>.h-card</code>, you can describe and specify details. If you
send someone a webmention, their service will look at your homepage to find
information about you.</p>
<p>Here's the current <code>h-card</code> from my home page:</p>
<pre class="lumis"><code class="language-html" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">h-card  p-author  u-author  hidden</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">img</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">u-photo</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http://evantravers.comhttps://images.evantravers.com/avatar.jpg</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alt</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p-note</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4">    I make tools and tell stories. In love with the grace I have found, and
</div><div class="line" data-line="5">    finding myself currently in <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">span</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p-locality</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>Birmingham, AL<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">span</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>.
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">http://evantravers.com/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">u-url  u-uid  p-name</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rel</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">me</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>Evan Travers<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="8">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mailto:evantravers@gmail.com</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rel</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">me</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">u-email</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>evantravers@gmail.com<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="9"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">div</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
<p>It's pretty simple… it's a structured document with some additional microformat
markup to tell other programs how the fields are classified.</p>
<p>At the moment, it's invisible from view, which isn't the best thing to do. The
<code>h-card</code> on <a href="http://adactio.com">Jeremy Keith's blog Adactio</a> is a lot
classier.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/adactio.com_.png" alt="image of the h-card on Adactio.com" /></p>
<p>You can see the results of my <code>h-card</code> by visiting this <a href="http://pin13.net/mf2/?url=http%3A%2F%2Fevantravers.com%2Farticles%2F2019%2F11%2F12%2Fshell-game-trying-out-fish%2F">microformats
parser</a>.</p>
<p>There's a little confusion here… if you read on the <a href="http://microformats.org/wiki/h-card#Backward_Compatibility">microformats
wiki</a>, you'll find
that there's another format called <code>vcard</code> that you can add for backwards
compatibility. There was also debate as to what fields should be included
where… There's a lot of change and iteration as people experiment and let
experiments die… just part of the indieweb world I guess. The IRC at #indieweb
or <a href="https://chat.indieweb.org/slack">slack channel</a> is really helpful here.</p>
<h2><a href="#connecting-the-dots" aria-hidden="true" class="anchor" id="connecting-the-dots"></a>Connecting the dots</h2>
<p>Now someone who scrapes my site can see who I am and what accounts on other
sites I'm associated with… and webmention.io is listening on my behalf for any
webmentions that might be sent my way… time to start posting and talking!</p>
<h3><a href="#listening-twitter-conversations" aria-hidden="true" class="anchor" id="listening-twitter-conversations"></a>Listening: Twitter Conversations</h3>
<p>For connecting my site to others, I'm using <a href="https://brid.gy/">brid.gy</a>.</p>
<p><img src="https://images.evantravers.com/articles/2019/11/bridgy.png" alt="screenshot of brid.gy's home page" /></p>
<blockquote>
<p>Bridgy connects your web site to social media. Likes, retweets, mentions,
cross-posting, and more...</p>
</blockquote>
<p>I hooked up my twitter to bridgy, so it's trolling my twitter periodically and
sending webmentions for me! The result of this is if I post a tweet containing
a link to a page on my website, brid.gy is listening and sends a webmention
back to my URL. This even works for replies, likes, and retweets… you can
interact with my content on other services, and it all comes back to my
personal site.</p>
<p>The indieweb calls this <a href="https://indieweb.org/POSSE">POSSE, for Publish (on your) Own Site, Syndicate
Elsewhere</a>.</p>
<p>Ideally… I'll eventually set it up so that some script automatically posts my
posts to twitter so that people can interact with it there, but for now I'm
syndicating manually.</p>
<h2><a href="#broadcasting" aria-hidden="true" class="anchor" id="broadcasting"></a>Broadcasting</h2>
<p>Sending webmentions is also a manual process. When I post a blog post, I'll
manually run the published URL through the <a href="https://rubygems.org/gems/webmention/versions/1.0.2">webmention
gem</a>. In the future, I
plan to include the POSSE syndication to twitter and medium and webmention
sending somehow in the build step.</p>
<p>I generate a link post every month of all I read, generated from Instapaper
links. Unfortunately I was listing every link as a <code>reply-to</code> using my
link-post generator… resulting in several nice blogs getting spamm'd by a
<em>giant</em> comment that shouldn't have been sent them. Sorry Jeremy<sup class="footnote-ref"><a href="#fn-sorry" id="fnref-sorry" data-footnote-ref>1</a></sup>. :(</p>
<p>I now just list the link which results in a webmention… I haven't had a good
reason to use the <a href="https://indieweb.org/in-reply-to"><code>reply-to</code> verb</a> since I
realized I was doing it wrong. Sorry everyone.</p>
<h2><a href="#displaying-the-results" aria-hidden="true" class="anchor" id="displaying-the-results"></a>Displaying the results</h2>
<p>When I got everything hooked up I could navigate to webmention.io,
authenticate, and use the API link to manually view the json of replies. Yay!
Time to display them.</p>
<p>I wrote a <em>very</em> naive component in Vue.js to get the mentions for a given page
and display them at the bottom of the page. Right after I wrote it, <a href="http://evantravers.com/articles/2019/09/24/world-of-textfiles-meeting-notes/">the blog
post I had written about meeting
notes</a>
got a few kind likes on twitter (thanks to a retweet from
<a href="http://twitter.com/draftsapp">@draftsapp</a>, so you can see all the lovely
people who liked my post or made a comment to it by replying to it on twitter.</p>
<p>The js is relatively simple, and looks like this:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Vue</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;vue&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">import</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Axios</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">from</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;axios&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Vue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">component</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mention-author&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">props</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;author&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`
</div><div class="line" data-line="8">      &lt;span class=&quot;webmention__author&quot;&gt;
</div><div class="line" data-line="9">        &lt;a :href=&quot;author.url&quot;&gt;
</div><div class="line" data-line="10">          &lt;img v-if=&quot;author.photo != &#39;&#39;&quot; :src=&quot;author.photo&quot; alt=&quot;author.name&quot;&gt;
</div><div class="line" data-line="11">          &lbrace;&lbrace; author.name &rbrace;&rbrace;
</div><div class="line" data-line="12">        &lt;/a&gt;
</div><div class="line" data-line="13">      &lt;/span&gt;
</div><div class="line" data-line="14">    `</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">
</div><div class="line" data-line="17">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Vue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">component</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;blog-webmention&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="18">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">props</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;mention&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`
</div><div class="line" data-line="20">      &lt;div class=&quot;blog__webmention&quot;&gt;
</div><div class="line" data-line="21">        &lt;div v-if=&quot;mention[&#39;wm-property&#39;] == &#39;like-of&#39;&quot;&gt;
</div><div class="line" data-line="22">          &lt;a :href=&quot;mention.url&quot;&gt;#&lt;/a&gt; 👍&#39;d by &lt;mention-author :author=&quot;mention.author&quot;&gt;&lt;/mention-author&gt;
</div><div class="line" data-line="23">        &lt;/div&gt;
</div><div class="line" data-line="24">        &lt;div v-if=&quot;mention[&#39;wm-property&#39;] == &#39;repost-of&#39;&quot;&gt;
</div><div class="line" data-line="25">          &lt;a :href=&quot;mention.url&quot;&gt;#&lt;/a&gt; 🔁&#39;d by &lt;mention-author :author=&quot;mention.author&quot;&gt;&lt;/mention-author&gt;
</div><div class="line" data-line="26">        &lt;/div&gt;
</div><div class="line" data-line="27">        &lt;div v-if=&quot;mention[&#39;wm-property&#39;] == &#39;bookmark-of&#39;&quot;&gt;
</div><div class="line" data-line="28">          &lt;a :href=&quot;mention.url&quot;&gt;#&lt;/a&gt; 🔖&#39;d by &lt;mention-author :author=&quot;mention.author&quot;&gt;&lt;/mention-author&gt;
</div><div class="line" data-line="29">        &lt;/div&gt;
</div><div class="line" data-line="30">        &lt;div v-if=&quot;mention[&#39;wm-property&#39;] == &#39;in-reply-to&#39;&quot;&gt;
</div><div class="line" data-line="31">          &lt;p&gt;&lbrace;&lbrace; mention.content.text &rbrace;&rbrace;&lt;/p&gt;
</div><div class="line" data-line="32">          &lt;a :href=&quot;mention.url&quot;&gt;#&lt;/a&gt; 💬&#39;d to by &lt;mention-author :author=&quot;mention.author&quot;&gt;&lt;/mention-author&gt;
</div><div class="line" data-line="33">        &lt;/div&gt;
</div><div class="line" data-line="34">      &lt;/div&gt;
</div><div class="line" data-line="35">    `</span>
</div><div class="line" data-line="36">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="37">
</div><div class="line" data-line="38">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">webmentions</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Vue</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="39">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">el</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#webmentions&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="40">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="41">      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mentions</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="42">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="43">    <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mounted</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="44">      <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Axios</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">get</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;https://webmention.io/api/links.jf2?target=&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">window</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">location</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="45">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">then</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">response</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">this</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">mentions</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">response</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">children</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="46">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="47">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="48"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Nothing terribly clever here… there's some associated css that styles the
avatars and such, but other than that, that's it. I've been meaning to package
it up as a web component on NPM, but I have not made the time.</p>
<h2><a href="#where-to-now" aria-hidden="true" class="anchor" id="where-to-now"></a>Where to now?</h2>
<h3><a href="#automate-syndication-and-webmentioning" aria-hidden="true" class="anchor" id="automate-syndication-and-webmentioning"></a>Automate syndication and webmentioning</h3>
<p>I mentioned it earlier, but it seems like the obvious step so that I don't
forget anything when I'm posting. It's what automation is for.</p>
<h3><a href="#caching-webmentions" aria-hidden="true" class="anchor" id="caching-webmentions"></a>Caching webmentions</h3>
<p>I'd like to pull down all my webmentions from webmention.io on a static
build… cache it in a file and have the js show only the new ones. Hopefully
that'll reduce the load on webmention.io and I like the idea of being able to
keep those comments and likes in my filesystem.</p>
<h3><a href="#comment-directly-on-the-site" aria-hidden="true" class="anchor" id="comment-directly-on-the-site"></a>Comment directly on the site</h3>
<p>I think it'd be nice to have a way for people to authenticate and comment right
on the site… no clue how to do that yet, but I'm sure someone in the indieweb
network is working on it.</p>
<h2><a href="#its-fun" aria-hidden="true" class="anchor" id="its-fun"></a>It's fun!</h2>
<p>I will say… all this is the most fun I've had learning and messing around on my
site in a <em>long</em> time. It's fun to figure out, nice people to learn from, and
it feels like a tiny step towards a healthier me and healthier web ecosystem.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References:</h2>
<ul>
<li><a href="https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/">Adding web mention support to a static site</a></li>
<li><a href="https://github.com/indieweb/webmention-client-ruby">indieweb/webmention-client-ruby</a></li>
<li><a href="https://aaronparecki.com/2018/06/30/11/your-first-webmention">Your first webmention</a></li>
<li><a href="https://keithjgrant.com/posts/2019/01/low-friction-workflow-for-notes/">Low Friction Workflow for Notes</a></li>
</ul>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-sorry">
<p>I'm sorry Jeremy Keith. I really didn't mean to do <a href="https://adactio.com/journal/15260#comment76774">this</a>. <a href="#fnref-sorry" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Shell Game: Trying out Fish</title>
       <link>http://evantravers.com/articles/2019/11/12/shell-game-trying-out-fish/</link>
       <pubDate>Tue, 12 Nov 2019 01:54:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/12/shell-game-trying-out-fish/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/gruvbox.png"></p><p>Largely prompted<sup class="footnote-ref"><a href="#fn-prompt" id="fnref-prompt" data-footnote-ref>1</a></sup> by <a href="https://brettterpstra.com/2019/10/11/branching-out-from-bash-fishing-expedition/">Brett Terpstra's post on trying
fish</a>,
I decided to give this whimsical shell another try.</p>
<p>I've been messing with shell configurations for a long while now. It looks like
I <a href="https://github.com/evantravers/polka/commit/1ca597188a79573b2904d6bb000901520cf38b9e#diff-ec20fb240e117fea7b0049c21edf1ef3">switched to zsh in
2013</a>
in Polka<sup class="footnote-ref"><a href="#fn-polka" id="fnref-polka" data-footnote-ref>2</a></sup>.</p>
<p>I think that it's been a couple of versions since I tried fish… I
think that I was initially turned off by the fact that I couldn't
figure out how to configure it, and it was just so… chatty. Having
been used to the terseness of bash and zsh, the extra messaging and
completions seemed juvenile. Here's another swing at it.</p>
<h2><a href="#good-configuration" aria-hidden="true" class="anchor" id="good-configuration"></a>Good: Configuration</h2>
<p>I've slimmed down my <a href="https://github.com/evantravers/dotfiles/blob/63127e4cec072f1d9ff058e6e6877e91442d69d1/zsh/.zshrc">zsh
config</a> to be
basically five things:</p>
<ul>
<li>Sensible config. The bare minimum to get path, history, etc.)</li>
<li>Prompt. I want some information about where I am on the system, including VCS
info.<sup class="footnote-ref"><a href="#fn-status" id="fnref-status" data-footnote-ref>3</a></sup></li>
<li><a href="https://github.com/asdf-vm/asdf">asdf</a>. I use asdf to install all my
languages and packages.</li>
<li><a href="https://github.com/clvv/fasd">fasd</a>. Jumping between folders and such. Not
to be confused with asdf, I've become utterly reliant on fasd to move around
quickly.</li>
<li><a href="https://github.com/junegunn/fzf/">FZF</a>. Pretty similar to fasd, but I use it
a good bit.</li>
</ul>
<p>My fish install is… really short. I'm using
<a href="https://github.com/jorgebucaran/fisher">fisher</a> to install packages, and then
using a fishfile to configure four out of the five.</p>
<pre class="lumis"><code class="language-fish" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">danhper/fish-asdf</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">rafaelrinaldi/pure</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fishgretel/fasd</span>
</div></code></pre>
<p>That is really pretty much it. I kind of like that.</p>
<h2><a href="#weird-colors" aria-hidden="true" class="anchor" id="weird-colors"></a>Weird: Colors</h2>
<p>Fish has a distinction between colors and prompt theme that I still don't
really understand.</p>
<p>I found in github's code search some poor soul on the same quest as I, <a href="https://github.com/jemag/dotfiles/blob/8e902e92e70906f1c057f5655040365cfe24c788/fish/.config/fish/fish_variables">who
hardcoded gruvbox's
colors</a>
into fish <code>fish_variables</code> file, which you can also configure via a GUI when
you run <code>fish_config colors</code>. It's pretty close.</p>
<p>I suppose there's some way to just remove the colors and have them inherit from
the terminal, although it is nice that you can use whatever color you want.</p>
<h2><a href="#weird-but-good-functions-and-variables" aria-hidden="true" class="anchor" id="weird-but-good-functions-and-variables"></a>Weird (but good): Functions and Variables</h2>
<p>I like what little I know about how fish loads functions when it needs them
rather than on startup… my fish setup seems to be a lot faster than my zsh so
far.</p>
<p>I do have problems with plugins putting user/computer specific information into
the <code>fish_variables</code> file. I would prefer my config to be fairly transferrable
between computers. As it is, I've just uninstalled such plugins, including the
one for FZF. We'll see if I miss it.</p>
<p>Ironically, fish's ability to hotload from functions leads to weird behavior...
I removed a plugin from one pane in tmux, then switching to another pane in
tmux caused parts of the files to be rewritten and reloaded. Just something to
keep in mind.</p>
<p>As I write, <a href="https://brettterpstra.com/2019/11/11/fish-further-exploration/">Brett has decided to stick with
it</a> and so will
I. It anecdotally seems faster than my (admittedly naive) zsh setup, and it's
fun trying something new. I do trip up not getting access to FZF's history
search and bash/zsh's <code>!$</code> syntax for accessing the last token... but maybe not
having those crutches will lead me down new paths.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-prompt">
<p>See what I did there? <a href="#fnref-prompt" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
<li id="fn-polka">
<p>Polka is the old version of my dotfiles, currently not being kept up
to date <a href="#fnref-polka" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="2" aria-label="Back to reference 2">↩</a></p>
</li>
<li id="fn-status">
<p>Getting the current git status and more is often the hardest
part… <code>git status</code> can be surprisingly slow. <a href="#fnref-status" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="3" aria-label="Back to reference 3">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Using git to generate a changelog for your blog</title>
       <link>http://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/</link>
       <pubDate>Fri, 08 Nov 2019 19:59:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/08/using-git-to-generate-a-changelog-for-your-blog/</guid>
       <description><![CDATA[ <blockquote>
<p>Unrelated, but what did you do to set up the <code>changelog</code> at the bottom of
your posts?</p>
</blockquote>
<p>— <a href="http://twitter.com/adamyonk">@adamyonk</a></p>
<p>A long time ago, <a href="http://twitter.com/tbmiller">Tom Miller</a> talked about how
frustrating it is when you come back to a blog page and there's something...
missing or changed. We elaborated into how cool it would be to have a living
document for different topics on your blog, instead of posting a new git
manifesto every year, just have a URL with the latest copy and all the changes.</p>
<p>I haven't gone all the way that direction yet... I've got a couple private
mini-essays I'll link around, but I did implement the following. My blog uses
<a href="http://middlemanapp.com">middleman</a>, so every file and every blog post has a
git history. I use the Git gem to pull the git commits, and use the
simple_format ActionView helper to display it.</p>
<pre class="lumis"><code class="language-erb" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span>
</div><div class="line" data-line="2">  @git = Git.open(&#39;./&#39;).log.object(file)
</div><div class="line" data-line="3">  if @git.size &gt; 1
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">details</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__changes</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">summary</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>Changelog<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">summary</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">@git</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">each</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">do</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="9">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="10">          <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">blog__changes__date</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">author_date</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="11">          <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">simple_format</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">commit</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="12">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">li</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="13">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div><div class="line" data-line="14">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ul</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="15">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">details</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="16"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;%</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">end</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">%&gt;</span>
</div></code></pre>
<p>There are some old pages where I don't use good git practices, and it hurts
that it shows, but by and large a reader can see what I've changed, whether I
added a new company to my <a href="/articles/2018/12/10/whats-in-my-bag/">EDC bag
post</a>, or fixed a typo in a prayer.</p>
<p>I'm pretty sure the basic concept will work with other file-based blog
systems... let me know if you use it!</p> ]]></description>
    </item>
    <item>
       <title>Thoughts on Sovereignty from Hebrews</title>
       <link>http://evantravers.com/articles/2019/11/08/thoughts-on-sovereignty-from-hebrews/</link>
       <pubDate>Fri, 08 Nov 2019 17:14:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/08/thoughts-on-sovereignty-from-hebrews/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/malibu.jpg"></p><h2><a href="#hebrews-25-9" aria-hidden="true" class="anchor" id="hebrews-25-9"></a>Hebrews 2:5-9</h2>
<blockquote>
<p>[5] For it was not to angels that God subjected the world to come, of which
we are speaking. [6] It has been testified somewhere,</p>
<p>“What is man, that you are mindful of him, or the son of man, that you care
for him?  [7] You made him for a little while lower than the angels; you
have crowned him with glory and honor,(1) [8]   putting everything in
subjection under his feet.”</p>
</blockquote>
<p>And now we come to the crux of the argument and the balm to my soul this
morning.</p>
<blockquote>
<p>Now in putting everything in subjection to him, he left nothing outside his
control.</p>
</blockquote>
<p>Here we have a simple tautology… but don't skip past its concise truth. It
arrested me this morning, finally skipping through my eye gate to set my mind
free.</p>
<p><strong>Nothing</strong> is left outside his control. Every rebellious heart, every
circumstance, every evil plan, all financial markets and wicked leaders,
weather and strung-out relationships… nothing is exempt. All is under Christ's
control. Hallelujah.</p>
<p>But what about all the bad we see?</p>
<blockquote>
<p>At present, we do not yet see everything in subjection to him.</p>
</blockquote>
<p>The author acknowledges that we do not yet see… but such careful use of words.
We see, but the <em>reality</em> described above is Christ reigning.</p>
<p>How do we know? Since we cannot see all under Christ yet, we are given
something else to see.</p>
<blockquote>
<p>[9] But we see him who for a little while was made lower than the angels,
namely Jesus, crowned with glory and honor because of the suffering of death,
so that by the grace of God he might taste death for everyone.</p>
</blockquote>
<p>We see Christ, fulfiller of promises and prophecies, prophet, priest and king
(as touched on in Chapter 1)<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>, risen and triumphant. While we can't see
everything in subjection, we can see Him, and like Peter walking towards the
Lord on the waves, we too can be upheld if we fix our eyes on Him.</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>Hebrew 1:1-4 has a beautiful introduction, and if you look carefully it's
split into three parts identifying Christ's offices. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Obsession Log: Keyboards</title>
       <link>http://evantravers.com/articles/2019/11/08/obsession-log-keyboards/</link>
       <pubDate>Fri, 08 Nov 2019 01:32:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/11/08/obsession-log-keyboards/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/11/pokerii-dark.jpg"></p><p>As you can tell, I enjoy messing with tools. Perhaps too much. For those who care (<em>cough</em>, <a href="http://megalithic.io">@megalithic</a> <em>cough</em>,) here's the story so far.</p>
<h3><a href="#apple-standard-keyboard-m0116" aria-hidden="true" class="anchor" id="apple-standard-keyboard-m0116"></a>Apple Standard Keyboard (M0116)</h3>
<p>The first computer I learned to type on was an Apple Performa II… I'm not 100% sure, but I think it's the board known as the <a href="https://www.google.com/search?q=M0116&amp;tbm=isch">M0116</a>. It's probably in goodwill or my parents garage now… I probably need to harvest those vintage orange alps switches and sell them on eBay. :P</p>
<h3><a href="#random-keyboards-from-garages-and-compusa" aria-hidden="true" class="anchor" id="random-keyboards-from-garages-and-compusa"></a>Random keyboards from garages and CompUSA</h3>
<p>Somewhere in high school my uncle built a computer with me. That probably is the source of pretty much… all the other foolishness on this site. Cameras, programming, unix tools, all mostly point back to that glowing blue case. I used whatever Dell keyboards we had lying around, eventually picking up a low profile Corsair keyboard to fit my shallow keyboard tray.</p>
<h3><a href="#microsoft-natural-ergonomic-4000" aria-hidden="true" class="anchor" id="microsoft-natural-ergonomic-4000"></a>Microsoft Natural Ergonomic 4000</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/microsoft-ergonomic.jpg">
  <figcaption>I don't think this is that original one, but one I found in 2017.</figcaption>
</figure>
<p>When I got my first job I was just typing on my laptop, which was then a glowing gamer-green Asus. I found a Microsoft ergonomic board in the supply closet and the owner let me keep it. I think I just relished the challenge and weirdness of learning to type on the pseudo-split, but it started to teach me that there was a world of usefulness beyond just glowing gamer lights.</p>
<p><a href="https://blog.codinghorror.com/keyboarding-microsoft-natural-ergonomic-4000/">Related and awesome… codinghorror's review of the Natural 4000 from
2005.</a></p>
<h3><a href="#kbc-poker-ii-with-cherry-blues-2011" aria-hidden="true" class="anchor" id="kbc-poker-ii-with-cherry-blues-2011"></a>KBC Poker II with Cherry Blues (2011)</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/poker-ii-desk.jpg" alt="kbc poker ii" /></p>
<p>I bought this after seeing my friend Tom's HHKB. It was small portable enough to come with me to school and work… and loud. Still one of my favorite boards, taught me that I didn't need all the keys and that putting things behind layers was possible and awesome. I won a <a href="https://starcraft2.blizzard.com/en-gb/profile/1/1/671641">lot of Starcraft 2 games on this board</a>.</p>
<h3><a href="#wasd-full-size-with-cherry-blues-2012" aria-hidden="true" class="anchor" id="wasd-full-size-with-cherry-blues-2012"></a>WASD Full-size with Cherry Blues (2012)</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/wasd-blues-filter.jpg" alt="" /></p>
<p>Inspired by the <a href="https://i.redd.it/x7lhzgzotjk21.jpg">keyboards from the video game Portal</a>, I bought a WASD full sized keyboard with blank keycaps. Eschewing labels on the keycaps was the first big jump towards learning to type properly. Unfortunately, I wasn't very good at not bottoming out, so my coworkers told me I had to get rid of it. Too noisy.  :P</p>
<p>I sold this board to buy…</p>
<h3><a href="#wasd-70-with-cherry-browns-2013" aria-hidden="true" class="anchor" id="wasd-70-with-cherry-browns-2013"></a>WASD 70% with Cherry Browns (2013)</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/wasd-browns.jpg" alt="" /></p>
<p>Nearly the exact same board with Cherry Browns. This became my board for quite a while. I think I sold it to my friend Billy, who later sold it to some other developer in Birmingham. Pretty sure it's floating around Cayenne Creative now.</p>
<p>This was my work board for a long time until I sold this board to buy… (seeing a pattern?)</p>
<h3><a href="#jd40-with-cherry-blues-2014" aria-hidden="true" class="anchor" id="jd40-with-cherry-blues-2014"></a>JD40 with Cherry Blues (2014)</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/jd40.jpg" alt="JD40 Top, pictured with switched up Poker II">
  <figcaption>
    Top: switched up Poker II. Bottom: JD40 with DSA Deep Space (wish I had
    bought more of that!)
  </figcaption>
</figure>
<p>I bought this in 2014 (first experience with long wait group buys!)… immediately dismissed it as being too small. Eventually, after I discovered the re-sell value of keyboards, I sold it on reddit to /u/chrisswires, who <a href="https://www.reddit.com/r/MechanicalKeyboards/comments/7svg2l/photos_katakana_on_granite_on_steel/">made this out of it</a>.</p>
<h3><a href="#pok3r-with-cherry-clears-2015" aria-hidden="true" class="anchor" id="pok3r-with-cherry-clears-2015"></a>POK3R with Cherry Clears (2015)</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/poker3-pre1976.jpg" alt="">
  <figcaption>Just before I started messing around with it...</figcaption>
</figure>
<p>I had read about MX Clear at some point… and decided to upgrade my trusty Poker so that I could have one at work and one at home.</p>
<p>This one taught me that having separate keymaps for different boards was super annoying. (The arrow keys and others moved between the Poker II and Pok3r.) It also showed me how nice it was to type on a keyboard with a heavy plate and case. I also became convinced I didn't need a full size keyboard.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/11/pok3r-sa1976.jpg" alt="">
  <figcaption>
    After installing SA 1976 R1. I later ordered a wooden case took a year to
    arrive and was broken on arrival with no replacement. :(
  </figcaption>
</figure>
<p>It also kicked off my customizing boards when I ordered SA 1976 for it (which I later sold for <em>way</em> more than I paid for it… to pay for more keyboards. :P)</p>
<p>MX Clear was the first switch where I could type without bottoming out and it was more quiet than a clicky. This became my main board for a <em>long</em> time. I modified the older poker II over the years, new case and such… and then…</p>
<h3><a href="#planck-light-with-kailh-burnt-orange-chocs" aria-hidden="true" class="anchor" id="planck-light-with-kailh-burnt-orange-chocs"></a>Planck Light with Kailh Burnt Orange Chocs</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/planck-light.jpg" alt="planck light" /></p>
<p>I'd been eyeing the Planck concept for a while. I had already been thinking that if the JD40 had a few more keys, I'd be able to use it, and this seemed to be a good way to try it. I also had been convinced by my Ergodox and Kinesis using friends that ortholinear would be nice.</p>
<p>I <strong>loved</strong> it. I thought it was going to be just a neat toy, but it became my main keyboard for six months or so. I liked the small form factor, I liked the layer system, I loved having custom firmware I could change myself, and I honestly saw ergonomic and typing speed benefits.</p>
<p>I sold the poker II, the pok3r, and the staggered style keycaps to pay for the next wave of boards… the rise of the ortho. :P</p>
<p>(Every time I look at it, I do miss it though!)</p>
<h3><a href="#lets-split-eh-with-zealio-v1-67g" aria-hidden="true" class="anchor" id="lets-split-eh-with-zealio-v1-67g"></a>Let's Split Eh with Zealio v1 67g</h3>
<p><img src="https://images.evantravers.com/articles/2018/09/keyboard1.jpg" alt="picture of split keyboard" /></p>
<p>This one convinced me that split keyboards were going to be the best for me and my uses. My first build, my first split, my first fancy-switch keyboard… and still the one that I'm typing this article on today.</p>
<p>It's moved to wearing MDA Big Bang, which is a <em>great</em> keyset for this board.</p>
<p><a href="/articles/2018/09/12/i-built-a-keyboard/">I wrote a lot more about this board here</a>.</p>
<h3><a href="#massdrop-olkb-preonic-with-zealio-v2-67g" aria-hidden="true" class="anchor" id="massdrop-olkb-preonic-with-zealio-v2-67g"></a>Massdrop (OLKB) Preonic with Zealio v2 67g</h3>
<p><img src="https://images.evantravers.com/articles/2019/04/keyboard.jpg" alt="" /></p>
<p>Soon after I had put in my order for parts for the Let's Split… Massdrop released a drop for their version of the Preonic. At the time, I still wasn't convinced that I didn't need a number-row… and it's pretty. I really enjoyed it, but discovered by that point that the Planck Light and the Let's Split Eh had taught me to type without the number row… so eventually it was sold to fund more splits.</p>
<p>I excused this shameful behavior by the amount that I was able to sell the SA 1976 set for… thankfully right before they did another run and the value plummeted. Buy low, sell high right?</p>
<p>I thought at first that the v2 Zealio was going to be the endgame switch… but over time I realized that I typed <em>much</em> better (no bottoming out, less strain) on the v1 Zealio… so now that started a new quest of trying to find a replacement switch.</p>
<h3><a href="#olkb-planck-with-originative-mod-m-tactile" aria-hidden="true" class="anchor" id="olkb-planck-with-originative-mod-m-tactile"></a>OLKB Planck with Originative MOD-M Tactile</h3>
<p><img src="https://images.evantravers.com/articles/2019/04/sa_ice.jpg" alt="Planck with matte white high pro case and SA Ice keycaps" />
It's currently wearing XDA Canvas R2 on Originative's Mod-M Tactile switches.  While not as smooth as the Zealio v2 67g, they are a serviceable successor given that the v1 zeals aren't made anymore. I do miss the quietness of the zilents, but ultimately it's about typing. If I could find a hoard of v1 67g zilents, I'd buy 'em all. Oh well.  <code>¯\(°_o)/¯</code></p>
<p>I'll probably keep this one around for coffeeshop use and for the hotswap ability.</p>
<h3><a href="#keebio-nyquist-in-sp-50-case-with-originative-mod-m-tactile" aria-hidden="true" class="anchor" id="keebio-nyquist-in-sp-50-case-with-originative-mod-m-tactile"></a>Keebio Nyquist in SP-50 case with Originative MOD-M Tactile</h3>
<p><img src="https://images.evantravers.com/articles/2019/11/nyquist.jpg" alt="nyquist" /></p>
<p>I like splits, but I like fancy cases. There are not many nice aluminum cases for ortho split keyboards… <a href="http://keebio.com">keebio</a> designed a PCB that fit another board's case and would support my favorite QMK firmware.</p>
<p>It's heavy, but it has its problems… you can't reach the reset button easily. I also had to file the case slightly to get everything to fit, but it's lovely and works. It's wearing my new vilebloom SA set… as is half of /r/olkb these days.</p>
<h3><a href="#kyria-low-profile-from-splitkbcom" aria-hidden="true" class="anchor" id="kyria-low-profile-from-splitkbcom"></a>Kyria Low Profile from splitkb.com</h3>
<p><img src="https://images.evantravers.com/articles/2020/10/kyria.png" alt="kyria" /></p>
<p>I wanted to dip my toe into the world of &quot;staggered columnar&quot; keyboards. The popular options in this world had either too many keys (like the Ergodox or the Iris) or what I considered to be too few (like the Corne.)</p>
<p>The Kyria's design caught my eye as the curve of the hand looked to be really comfy, and there were lots of options for the thumb cluster. I sold my planck light, and started planning my build.</p>
<p>I built it out with my beloved Burnt Orange Novelkeys chocs, and quickly realized that I would yet again want to transition all my boards from straight ortholinear to staggered columnar. I sold my remaining MX planck to put in an order for the Keyboardio Atreus, and started developing a layout that would be compact enought to be a subset of every keyboard I had on order. Eventually I added the amazing MBK caps, and it's a nice board.</p>
<h3><a href="#corne-lp-from-boardsourcexyz" aria-hidden="true" class="anchor" id="corne-lp-from-boardsourcexyz"></a>Corne LP from boardsource.xyz</h3>
<p><img src="https://images.evantravers.com/articles/2020/10/corne.png" alt="corne" /></p>
<p>While I loved the feel of the Kyria's finger curve and thumb cluster, I still love the feeling of a good metal case on a keyboard. A lot of the staggered columnar options tend to be proudly &quot;janky&quot; with PCB sandwich cases.</p>
<p>I had told myself that the first staggered columnar split that came along with a good case, I'd sell the Nyquist and buy it... and this was the first to the door. Pretty much after I ordered this, <a href="/articles/2020/09/02/follow-up-customizing-a-keyboard-layout/">I started planning how to modify my layout even smaller</a>.</p>
<p>I outfitted it with MBK keycaps from <a href="https://mkultra.click/">mkultra</a> (<em>totally</em> worth the wait!) and the very strange gchoc modded choc switches from <a href="https://www.gboards.ca/">gheavy</a>. They are 20g linears. They don't feel like anything else, and I really like them. It took some time to get used to them, but if the only thing they have taught me is how to not bottom out on normal keys, they are worth it.</p>
<p>It's a <a href="/articles/2020/09/14/hard-travel-case-for-corne-lp/">nearly perfect mobile keyboard</a>, but I am very tempted to desolder the elite-c chips on this board and rebuild it with the new bluetooth enabled nice!nano chips... but that would also require rebuilding my layout in new ZMK firmware.</p>
<h3><a href="#keyboardio-atreus" aria-hidden="true" class="anchor" id="keyboardio-atreus"></a>Keyboardio Atreus</h3>
<p><img src="https://images.evantravers.com/articles/2020/10/atreus.png" alt="atreus" /></p>
<p>When the keyboardio kickstarter for the Atreus was announced, I immediately sold my MX planck to fund it. I knew that I still wanted a monolithic board for typing on my lap or travel, and this looked like basically a perfect replacement. I do miss the metal case of the planck, it was solid.</p>
<p>I'm probably going to do a full write-up of this board at some point, it just arrived, and I flashed QMK and my layout onto it. It's still wearing the Kailh Speed Copper switches it came with, and they are pretty nice and I may just leave them. It is perfect for being a more capable and ergonomic &quot;laptop&quot; keyboard<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>, and I'm using it to type this right now. :)</p>
<section class="footnotes" data-footnotes>
<ol>
<li id="fn-1">
<p>I disable the onboard keyboard and lay my keyboard on top of it. <a href="#fnref-1" class="footnote-backref" data-footnote-backref data-footnote-backref-idx="1" aria-label="Back to reference 1">↩</a></p>
</li>
</ol>
</section> ]]></description>
    </item>
    <item>
       <title>Books and Links: October</title>
       <link>http://evantravers.com/articles/2019/10/31/books-and-links-october/</link>
       <pubDate>Thu, 31 Oct 2019 15:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/10/31/books-and-links-october/</guid>
       <description><![CDATA[ <p>As of this month, this makes <a href="http://evantravers.com/articles/2018/11/13/what-i-m-reading-octoberish/">one
year</a>
of doing monthly link posts. I've been reading some stuff about the indieweb,
and my format may have to change to support the microformats, but I'm kind of
pleased that I've made it this far.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#ancillary-mercy-by-ann-leckie" aria-hidden="true" class="anchor" id="ancillary-mercy-by-ann-leckie"></a>Ancillary Mercy by Ann Leckie</h3>
<p>Thoroughly enjoyed it. Better than the first two. Great series.</p>
<p>This was the first of the three books I listened to rather than read on the
kindle. I thought the narrarator did a fantastic job. I giggled often at her
reading of Presger Translator Zayat.</p>
<p>The manners and high-seas politics of the Radch continue in this book. The
newly appointed Fleet Captain Breq continues her private war against the Lord
of the Radchaai while juggling the alien Presger and various issues with her
crew. Very fun, and weirdly sweet.</p>
<h3><a href="#the-three-body-problem-by-cixin-liu" aria-hidden="true" class="anchor" id="the-three-body-problem-by-cixin-liu"></a>The Three-Body Problem by Cixin Liu</h3>
<p>I heard good things about this one, and it didn't take very long to get totally
onboard now. Read 30% of it in the first sitting. Read the whole thing in
basically two days.</p>
<p>I found it very compelling and thrilling, some light language issues, but other
than a very gripping and fascinating book.</p>
<blockquote>
<p>Is it possible that the relationship between humanity and evil is similar to
the relationship between the ocean and an iceberg floating on its surface?
Both the ocean and the iceberg are made of the same material. That the
iceberg seems separate is only because it is in a different form. In reality,
it is but a part of the vast ocean.… It was impossible to expect a moral
awakening from humankind itself, just like it was impossible to expect humans
to lift off the earth by pulling up on their own hair. To achieve moral
awakening required a force outside the human race.</p>
</blockquote>
<p>This argument is very familiar... and odd to hear it being about aliens rather
than about God.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#design" aria-hidden="true" class="anchor" id="design"></a>Design</h3>
<h4>
  <a href='https://uxdesign.cc/ux-has-pretty-bad-ux-fd2702e5c22a'>UX has bad UX</a>
</h4>
<p>I think this article is intended to start a flamewar (and I'm sure it has...)
but I think it brings up some <em>very</em> good points.</p>
<blockquote>
<p>We’ve become so entangled in our processes that we forget to stop and think
about how useful our design really is.</p>
</blockquote>
<p>I think that this is especially possible as you scale the development complex
up to enterprise stages, it's easier to stay grounded in smaller teams.</p>
<p><a href="https://uxdesign.cc/ux-has-pretty-bad-ux-fd2702e5c22a">Read more...</a></p>
<h4>
  <a href='https://webaim.org/projects/screenreadersurvey8/'>WebAIM: Screen Reader User Survey #8 Results</a>
</h4>
<p>Some real surprises in here for me, although I was pretty happy to read:</p>
<blockquote>
<p>For the first time since 2009, JAWS is not the most common primary screen
reader reported, with NVDA now having slightly higher usage.</p>
</blockquote>
<p><a href="https://webaim.org/projects/screenreadersurvey8/">Read more...</a></p>
<h4>
  <a href='https://medium.com/figma-design/figmas-new-finger-tips-b463bfdf14d7'>Figma’s new finger tips</a>
</h4>
<blockquote>
<p>One Monday afternoon fifty years ago, on a stage by San Francisco’s Civic
Center, computer pioneer Douglas Engelbart gave a demonstration that forever
altered…</p>
</blockquote>
<p>I really like the small affordance of showing the user which shortcuts they've
already discovered. That's very neat!</p>
<p><a href="https://medium.com/figma-design/figmas-new-finger-tips-b463bfdf14d7">Read more...</a></p>
<h4>
  <a href='https://www.intercom.com/blog/the-full-stack-design-system/'>The full stack design system | Inside Intercom</a>
</h4>
<blockquote>
<p>Here’s a little mystery. Why is it that – a bit like hangovers and pop music
– most products somehow seem to get worse with age?</p>
<p>You’d think the opposite should be true: that having a great team spend many
years iterating on a product should eventually result in some immaculately
perfect finished product. Instead after ten years it’s suddenly harder to
unlock your phone. Why?</p>
</blockquote>
<p><a href="https://www.intercom.com/blog/the-full-stack-design-system/">Read more...</a></p>
<h4>
  <a href='https://marker.medium.com/warby-parker-soulcycle-goldman-sachs-and-wework-are-learning-leadership-secrets-from-a-13151b138e55'>Why Warby Parker and SoulCycle Are Flocking to This Tiny Conference By Foodies</a>
</h4>
<blockquote>
<p>The conference approaches hospitality in a philosophical sense; the focus has
never been on the mechanics of restaurant service, but rather the alchemy
involved in creating and sustaining a broader ethic of warmth, generosity,
and human connection that can apply to any commercial interaction, whether
it’s preparing a latte or examining a dental patient.</p>
</blockquote>
<p>I really like the spirit of this... and thanks to my friend Bianka, it turns
out they have some videos online! <a href="https://welcomeconference.org/">View them
here</a></p>
<p><a href="https://marker.medium.com/warby-parker-soulcycle-goldman-sachs-and-wework-are-learning-leadership-secrets-from-a-13151b138e55">Read more...</a></p>
<h3><a href="#code" aria-hidden="true" class="anchor" id="code"></a>Code</h3>
<h4>
  <a href='https://cloudfour.com/thinks/feeling-sassy-again/'>Feeling Sassy Again</a>
</h4>
<blockquote>
<p>I think for our next project we’ll probably try using Sass for compiled,
proprietary features that require some direct authorship… variables, mixins,
loops, etc. Then we’ll use PostCSS for automatic transformations,
optimizations and polyfills… Preset Env, FOFT Classes, Autoprefixer,
minification, etc.</p>
</blockquote>
<p><a href="https://cloudfour.com/thinks/feeling-sassy-again/">Read more...</a></p>
<h4>
  <a href='https://vuejs.org/v2/style-guide/'>Style Guide — Vue.js</a>
</h4>
<p>I have been enjoying my foray through vue, and I really appreciate that they
have a style guide with guidance for common problems, like form validation.</p>
<p><a href="https://vuejs.org/v2/style-guide/">Read more...</a></p>
<h4>
  <a href='https://hankchizljaw.com/wrote/create-a-user-controlled-dark-or-light-mode/'>Create a user controlled dark or light mode - Andy Bell</a>
</h4>
<blockquote>
<p>It’s important to not make presumptions in design if you can help it, so I’m
going to show you a quick and easy way to honour the user’s operating system
preference by default, but also give them a toggle button to change their
preference, manually.</p>
</blockquote>
<p>Great article... very cool use of CSS <code>:root</code>.</p>
<p><a href="https://hankchizljaw.com/wrote/create-a-user-controlled-dark-or-light-mode/">Read more...</a></p>
<h4>
  <a href='https://hankchizljaw.com/wrote/create-a-semantic-breakout-button-to-make-an-entire-element-clickable/'>Create a semantic “breakout” button to make an entire element clickable - Andy Bell</a>
</h4>
<blockquote>
<p>A common design pattern is to have something like a “card” element that has
to be fully clickable. This is usually because it links to another page or
triggers a JavaScript action.</p>
</blockquote>
<blockquote>
<p>In this article, we’re going to remedy this common crime by instead using the
magic of CSS to give us the desired fully clickable element effect, while
also using proper semantic elements and JavaScript and as an enhancement.</p>
</blockquote>
<p>Great article... I'm definitely going to have the need for this before too
long.</p>
<p><a href="https://hankchizljaw.com/wrote/create-a-semantic-breakout-button-to-make-an-entire-element-clickable/">Read more...</a></p>
<h3><a href="#random" aria-hidden="true" class="anchor" id="random"></a>Random</h3>
<h4>
  <a href='http://paulkirtley.co.uk/2013/how-to-make-fantastic-feathersticks/'>How To Make Fantastic Feathersticks</a>
</h4>
<blockquote>
<p>Feathersticks are extremely useful under certain circumstances. Yet many
people who enjoy bushcraft, survival skills and outdoor life are not
particularly well practised in the skill of making them.</p>
<p>Many books, particularly those involved with survival training, contain
images of what are often referred to as “fuzz-sticks”. These are little more
than twigs with a few short, shallow knife cuts made around them.</p>
<p>On the other hand, feathersticks – when made properly – provide a very
certain way of establishing a fire in otherwise potentially difficult
circumstances.</p>
</blockquote>
<p><a href="http://paulkirtley.co.uk/2013/how-to-make-fantastic-feathersticks/">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=jZLkCmw67ZY'>Русский Ковчег (2002 г.) - YouTube</a>
</h4>
<figure>
  <iframe src="https://www.youtube.com/embed/jZLkCmw67ZY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>
<p>A while back I learned about Russian Ark, an insane dream-history of Russia in
<em>one continuous shot</em>. It's a breathtaking achievement, an unblinking miasma of
historical imagery swimming in front of the viewer as dreamer.</p>
<p>It's worth checking out a little bit... the effect of watching minute after
minute of film without a single perceivable cut is very strange. You feel like
you don't have room to blink.</p>
<p><a href="https://www.youtube.com/watch?v=jZLkCmw67ZY">Read more...</a></p>
<h4>
  <a href='http://jerkingthetrigger.com/category/the-edc-tool-roll/'>The EDC Tool Roll | Jerking the Trigger</a>
</h4>
<p><img src="https://jerkingthetrigger.com/wp-content/uploads/2019/03/IMG_3379.jpg" alt="the tool roll" /></p>
<p>While talking with <a href="http://megalithic.io">@megalithic</a>, he mentioned wanting to
put together a tool roll... and I reached for this useful blogpost series.</p>
<p><a href="http://jerkingthetrigger.com/category/the-edc-tool-roll/">Read more...</a></p>
<h4>
  <a href='https://slatestarcodex.com/2019/10/16/is-enlightenment-compatible-with-sex-scandals/'>Is Enlightenment Compatible With Sex Scandals?</a>
</h4>
<blockquote>
<p>Last year I reviewed The Mind Illuminated, a meditation guide by Buddhist
teacher Upasaka Culadasa. Last month, Culudasa’s Buddhist community accused
him of cheating on his wife with prostitutes for many years. Culadasa doesn’t
seem to agree with the exact details of the accusations, but he also doesn’t
seem to deny that there was something in that general category of thing. What
can this teach us about enlightenment?</p>
<p>[...]</p>
<p>I don’t think many modern teachers say enlightenment makes you morally
perfect. But I think at least some of them say it makes you free from craving
or desire. And repeatedly cheating on your wife doesn’t seem like the action
of someone who’s free from desire. It doesn’t even seem like someone whose
desire has been moderately decreased. It sounds like the action of someone
who has at least as much desire as anyone else.</p>
</blockquote>
<p>While it's easy to scoff and laugh, there's a truth about the universe
contained in this question. Certainly christianity isn't immune from leaders
committing heinous acts... the author may be right and it may have to do more
with fame than with the alleged enlightenment.</p>
<p>I was surprised to see some admissions that the process of obtaining
enlightenment also reduces your inhibitions. It fits my worlview's
understanding of &quot;enlightenment,&quot; but I didn't expect to read it here.</p>
<p><a href="https://slatestarcodex.com/2019/10/16/is-enlightenment-compatible-with-sex-scandals/">Read more...</a></p>
<h4>
  <a href='https://medium.com/dunia-media/the-nightmare-of-valves-self-organizing-utopia-6d32d329ecdb'>The Nightmare of Valve’s self-organizing “utopia”</a>
</h4>
<p>I used to dream of getting to work at a place that self-organzied life Valve.
I'm sure it was once really great... but now that I'm a little older, reading
these horror stories don't surprise me at all.</p>
<blockquote>
<p>Turns out, flat simply means the hierarchies hide beneath the surface. To
survive you have to take sides or risk being taken down by a rival
development team. You learn to code defensively, never reveal vulnerable
personal information about yourself to coworkers, never ask for help unless
it’s absolutely necessary, and to seek the patronage of a powerful baron.</p>
</blockquote>
<p>Yikes. I'm sure that this is only one perspective and there were really good
times, but it does seem like one of Cave Johnson's own experiments gone
horribly awry.</p>
<p><a href="https://medium.com/dunia-media/the-nightmare-of-valves-self-organizing-utopia-6d32d329ecdb">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=f2rkstacMlg'>John Reilly & Friends: NPR Music Tiny Desk Concert</a>
</h4>
<blockquote>
<p>It might be easy to dismiss a music project from actor John Reilly, but that
would be a huge mistake: Reilly is a fine singer...</p>
</blockquote>
<p><a href="https://www.youtube.com/watch?v=f2rkstacMlg">Read more...</a></p>
<h4>
  <a href='https://indiewebify.me/'>IndieWebify.Me - a guide to getting you on the IndieWeb</a>
</h4>
<p>I'm really interested in implementing the indieweb stuff on my blog, and this
article is pretty helpful.</p>
<p><a href="https://indiewebify.me/">Read more...</a></p>
<h4>
  <a href='http://adrianroselli.com/2019/09/an-html-element-potentially-worth-18m-to-indiegogo-campaigns.html'>An HTML Element Potentially Worth $18M to Indiegogo Campaigns</a>
</h4>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Where <a href="https://twitter.com/grigs?ref_src=twsrc%5Etfw">@grigs</a> shows how a simple HTML fix can get a 0.5% increase in transactions worth $4.4M:<a href="https://t.co/JZAr7weeoL">https://t.co/JZAr7weeoL</a><br>Now let’s do one where a simple accessibility fix increases your market by up to 20%.</p>&mdash; Adrian Roselli 🗯 (@aardrian) <a href="https://twitter.com/aardrian/status/1175399118929371141?ref_src=twsrc%5Etfw">September 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p><a href="http://adrianroselli.com/2019/09/an-html-element-potentially-worth-18m-to-indiegogo-campaigns.html">Read more...</a></p>
<h4>
  <a href='https://www.carryology.com/bags/bag-reviews/best-used-gear-guide/'>Our Beginners Guide to the Best Used Gear on the Planet I Carryology</a>
</h4>
<p>Amazing guide to finding second-hand gear... definitely going to be a link I
use to answer the questions I occasionally get... as well as an enabler for my
search for the perfect carry. :P</p>
<p><a href="https://www.carryology.com/bags/bag-reviews/best-used-gear-guide/">Read more...</a></p>
<h4>
  <a href='https://tv.avclub.com/how-did-i-get-here-documentary-now-s-little-talkin-1798252937'>“How did I get here?”: Documentary Now!’s little Talking Heads tribute that could</a>
</h4>
<blockquote>
<p>There’s an oft-repeated Lorne Michaels adage about Saturday Night Live: “The
show doesn’t go on because it’s ready. It goes on because it’s 11:30.”</p>
</blockquote>
<p>This seems like such a labor of love to an amazing concert movie... I can't
wait to watch it.</p>
<p><a href="https://tv.avclub.com/how-did-i-get-here-documentary-now-s-little-talkin-1798252937">Read more...</a></p>
<h4>
  <a href='https://songexploder.net/cat-power'>Episode 145: Cat Power</a>
</h4>
<p>I’m a sucker for learning about people’s creative processes, and therefore I’ve
been really enjoying Song Exploder, and this episode really grabbed me. I’ve
always enjoyed Cat Power thanks to my friend Joy, but hearing Chan Marshall
talk through her process… I love the way she talked through the textures she
layers into the song. Wonderful.</p>
<p><a href="https://songexploder.net/cat-power">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Focusing Browser Tab Using JXA and Hammerspoon</title>
       <link>http://evantravers.com/articles/2019/10/31/focusing-browser-tab-using-jxa-and-hammerspoon/</link>
       <pubDate>Thu, 31 Oct 2019 14:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/10/31/focusing-browser-tab-using-jxa-and-hammerspoon/</guid>
       <description><![CDATA[ <p>I recently started using Google Hangouts as my main computer calling method.
Very quickly, the tab with the (often muted) call gets lost in all my other
windows. I used to be able to just focus Zoom.app using hammerspoon with a
keypress, but focusing a tab in a browser is a little tricker than focusing an
application.</p>
<p>I found <a href="https://liuhao.im/english/2017/06/02/macos-automation-and-shortcuts-with-hammerspoon.html#id-open-a-certain-chrome-tab-with-alt--">this blog
post</a>
which totally worked, but I thought the JXA javascript could be cleaned up just
a touch.</p>
<p><img src="https://images.evantravers.com/articles/2019/10/dictionary.png" alt="Brave's Scripting Dictionary... mostly equivalent to Chrome." /></p>
<p>It's really hard to find docs for JXA... there's a <em>ton</em> of broken links to the
Apple Developer Docs. The <a href="https://github.com/JXA-Cookbook/JXA-Cookbook/wiki">JXA
Cookbook</a> is handy, and
after I realized that most of the applescript could be camelCased into a JXA
equivalent things went more smoothly. If you open the Script Editor and open an
app's dictionary, you can switch the language to Javascript and things make a
little more sense.</p>
<p>Here's what I ended up with:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Application</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Brave&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">of</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">brave</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">windows</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tabIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tabs</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">findIndex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tab</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tab</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">url</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">meet</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">google</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">com</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tabIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">activeTabIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">tabIndex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">win</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="11">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>It's pretty straightforward. The API for switching tabs is a little limited and
frustrating, but it works. By wrapping this in a Hammerspoon function tied to
my hyper key layer, I can trigger this at any point (see that
<a href="https://github.com/evantravers/hammerspoon-config/blob/513a30ff35d0043dce3219454b58045953a6f045/init.lua#L99-L117">here</a>).</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://github.com/JXA-Cookbook/JXA-Cookbook/">The JXA Cookbook</a></li>
<li><a href="https://liuhao.im/english/2017/06/02/macos-automation-and-shortcuts-with-hammerspoon.html#id-open-a-certain-chrome-tab-with-alt--">the original post that got me started</a></li>
<li><a href="https://github.com/evantravers/hammerspoon-config/blob/513a30ff35d0043dce3219454b58045953a6f045/init.lua#L99-L117">the current iteration</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>World of Textfiles: Emoji-based Summaries</title>
       <link>http://evantravers.com/articles/2019/10/22/world-of-textfiles-emoji-based-summaries/</link>
       <pubDate>Tue, 22 Oct 2019 02:05:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/10/22/world-of-textfiles-emoji-based-summaries/</guid>
       <description><![CDATA[ <p>(Thanks to
<a href="https://twitter.com/mikeormerod/status/1185921289099366400">@mikeormerod</a> for
reminding me to finish this post!)</p>
<p>One thing I've found myself doing a bunch recently is highlighting interesting
lines in meeting or booknotes. I suppose you could do whatever you want, but
I've been using ⭐️ for importance/insight, ❗️for actions, and ❓for questions.
They just jump off the page as I am scrolling through my notes, and they are
still just plain text!</p>
<p>After my last major study booknote on <a href="/articles/2019/07/31/books-and-links-july/">Lean
UX</a>, I wanted to be prepped for the
upcoming class. I wanted all my questions easily accessible, so I used
<a href="https://docs.getdrafts.com/docs/editor/arrangemode.html">Drafts's arrange
mode</a> to copy and move
all the questions to the top of the page. This gave me a great little overview
of the whole book note, and a resource for asking questions during the class.</p>
<p>I found it so valuable, I started adding similar markup to other notes... and
wrote a Drafts Action. It finds any line that begins with an emoji and a colon
&quot;⭐️:&quot; and copies them and groups them by emoji at the top. This lets me be free
to be creative with my emoji &quot;tags,&quot; and decide what to do with them later.</p>
<p>Here's a walk-through, but you can download the whole js <a href="https://gist.github.com/40ffcd1597dcaa4d06bbb208cd5c2b68">here on
gist</a>.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// Pull all lines with &quot;&lt;emoji&gt; :&quot; together, create headers with a &quot;## &lt;emoji&gt;&quot;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// and list the grepped lines after.</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// this is the heading the summary will appear under.</span>
</div><div class="line" data-line="5"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// use something uncommon.</span>
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magic_header</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Auto Summary&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji_regex</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(?:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">- </span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u00a9</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u00ae</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u2000</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\u3300</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud83c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud000</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\udfff</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud83d</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud000</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\udfff</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud83e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\ud000</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\udfff</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">: </span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">?</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>I'm pretty sure I got this emoji regex from somewhere on StackOverflow, there's
no way I just magicked that out of nowhere. It does cover <em>all</em> emoji,
including curly quotes and ellipsis (<code>…</code>), something we'll cover later.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji_regex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">exec</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>Setting up some more variables... the main thing here is that we'll be storing
the matches in an object called <code>highlights</code>, each emoji will be stored as the
key mapping to an array of matching strings. To do this we'll need a function…</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pushNew</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">typeof</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">===</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">typeof</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">undefined</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">obj</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">key</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">push</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">string</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="7"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>This function checks to see if there's a key already declared... if it exists,
it just appends (<code>push()</code>) to that array, otherwise it creates the key with an
array with the single match.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">automateHighlights</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">## &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magic_header</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">…</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">“</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">”</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">|</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">’</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">/</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;### &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">for</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">in</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;- &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">index</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="10">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span>
</div><div class="line" data-line="11">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="13">
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>This last function is for the very end. <code>highlights</code> is the object. We iterate
over its keys, and for each key we iterate over the values of
<code>highlights[emoji]</code>… unless it's a few emojis that I don't care to match. I'm
sure there may be others you may not want to match, you can add them to this
&quot;blocked&quot; list here. (Might be a good little thing to refactor!)</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">while</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">null</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">pushNew</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">2</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">emoji_regex</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">exec</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>With all the hard work done… here's the meat. While there are matches to be
made, push a new match to the <code>highlights</code> object, and move the search forward.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">match</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;## &quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">magic_header</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">console</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">log</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;already ran!&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">processTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;[[title]]&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="6">                      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">automateHighlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">highlights</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="7">                      <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">processTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;[[body]]&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>It doesn't yet have an update function… so if you run it twice it'll match that
it's already been run by looking for <code>magic_header</code> and you'll just get a
message in the console. I suppose I could write some kind of begin and end
marker to allow myself to delete and rebuild the index, but I haven't spent
enough time on it.</p>
<p>If it hasn't been run, we protect the title, insert our new matching highlights
template in the middle, and put the body underneath. It looks a little like
this.</p>
<figure class="">
  <video controls="controls" poster="https://images.evantravers.com/articles/2019/10/emojisummary.png">
    <source src="https://images.evantravers.com/articles/2019/10/emojisummary.mov">
  </video>
  <figcaption>Here's what it looks like in action.</figcaption>
</figure>
<p>I've also considered making a custom set of actions to add these highlight/tags
to a line as a custom set of Keyboard Actions in Drafts, but I haven't really
needed it so far.</p>
<p>Hope this is helpful! Let me know via my contact form or
<a href="http://twitter.com/evantravers">twitter</a> if you do something similar.</p> ]]></description>
    </item>
    <item>
       <title>Sisyphus and the Focus Boulder</title>
       <link>http://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/</link>
       <pubDate>Wed, 09 Oct 2019 10:17:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/10/09/sisyphus-and-the-focus-boulder/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/10/sisyphus_up.png"></p><p>Here's a story for you…</p>
<hr />
<blockquote>
<p>Try to work.</p>
<p>There's too much to remember.</p>
<p>Make a list.</p>
<p>The list is overwhelming.</p>
<p>Throw away the list. You don't need it.</p>
<p>Try to work.</p>
<p>Too much to remember again.</p>
<p>Make a new list.</p>
<p>The new list is overwhelming.</p>
<p>Prioritize the list.</p>
<p>Try to work.</p>
<p>Your highest priorities are hard.</p>
<p>You realize out that you are ignoring hard priorities, and only finishing
easy work.</p>
<p>The highest priorities build up until they become overwhelming.</p>
<p>Throw away the list.</p>
<p>Try to work.</p>
<p>There's too much to remember…</p>
</blockquote>
<p><img src="https://images.evantravers.com/articles/2019/10/sisyphus_down.png" alt="sisyphus" /></p>
<p>Sound familiar?</p>
<h2><a href="#finding-rest-in-the-work" aria-hidden="true" class="anchor" id="finding-rest-in-the-work"></a>Finding rest in the work</h2>
<p>I've been pushing this boulder back up the hill for over ten years, and in the
last year or so, I think I'm getting pretty close to finally defeating the
frustration boulder. I believe there are three levels to productivity Hades,
and three correlating skills to help you escape:</p>
<p>Universal capture so you don’t forget anything. Contextual prioritization so
you focus on what's important. Time stewardship so you invest in what is
important.</p>
<p>You have to build a system to remember things for you, and <strong>you have to be
able to trust it</strong>.</p>
<h3><a href="#universal-capture" aria-hidden="true" class="anchor" id="universal-capture"></a>Universal Capture</h3>
<p><img src="https://images.evantravers.com/articles/2019/10/inbox.png" alt="inbox" /></p>
<p>The first principle is universal capture. If you can't remember everything,
build a system that can remember everything for you.</p>
<p>Our poor Sisyphus was faced with too much to remember, so let's build a system
that remembers for him.</p>
<h4><a href="#i-do-mean-everything" aria-hidden="true" class="anchor" id="i-do-mean-everything"></a>I do mean everything</h4>
<blockquote>
<p>Everything you own in the box to your left.<br />
– Beyoncé</p>
</blockquote>
<p>In my first job, I had an email inbox. Work came into that inbox, I finished
the work, and I deleted the email.</p>
<p>It wasn't a bad pattern.</p>
<p>As my career grew, so did the sources of work and noise. Google Chat. Basecamp.
Trello. Slack. Client meetings. Jira. Paper folders. In my current role, I
think I counted at <em>least</em> seven different ways work arrives at my desk… and
all those channels expect the work to return the way it came. Mostly.</p>
<p>While I look back with fondness at the simplicity of the Inbox Zero world I
used to live in, it still wasn't perfect… email is a todo list where <strong>anyone</strong>
can re-adjust your priorities and add work.</p>
<p>The first step to beating the boulder is to bring all your work into one place.
That way you can have a full view of your tasks, establish priorities, evaluate
tradeoffs, and choose to say no to what's not important. Whether it is a list
on the back of an envelope or software costing hundreds of dollars, it needs to
all be in one place.</p>
<p>I've used paper lists on the backs of giant sticky notes, trello, bullet
journals, Apple Reminders, and I'm presently using
<a href="https://culturedcode.com">Things</a>. Whatever works for you.</p>
<h4><a href="#easy" aria-hidden="true" class="anchor" id="easy"></a>Easy</h4>
<blockquote>
<p>Make it so easy you can't say no.<br />
– Leo Babauta</p>
</blockquote>
<p>You must have rituals for placing the things that you capture.</p>
<p>You have to make it easy to put things on your list. You can leave your bullet
journal open on your desk. You can use Siri to quickly add things to your
inbox. You can email things to yourself. I don't care. Just find a ritual that
fits your system that you can do subconsciously as work enters your world.</p>
<p>My system heavily uses Things's Quick Entry with Autofill to bring work from
other applications and websites into my system.</p>
<h3><a href="#contextual-prioritization" aria-hidden="true" class="anchor" id="contextual-prioritization"></a>Contextual Prioritization</h3>
<p><img src="https://images.evantravers.com/articles/2019/10/context.png" alt="context" /></p>
<blockquote>
<p>You'll find it just where you left it.</p>
</blockquote>
<p>Once you have designed a system to remember for you, you have to be able to
trust it to bring the right information to you at the right time. If you can
not trust your system to remind you, you will end up anxiously re-reading your
list for the umpteenth time, desperately trying to remember that task you feel
is missing… instead of doing your best work in peace.</p>
<p>After you've captured everything that is coming through your life, you have to
put it in a place that makes sense.</p>
<p>A skilled craftsman places his tools where he can easily reach them while he is
working… he knows that after he finishes cutting the dovetail joints for a
drawer he's going to need to sand and file the angles until they are perfect.
Therefore, he will learn to put that saw and that file near each other.</p>
<p>David Allen calls these &quot;contexts&quot;… saying it is &quot;what you need to be able to
carry out an action.&quot; This could be a place, good morale, access to a computer,
time left undisturbed to focus… the longer you think about designing your
system the more possible kinds of context you will find.</p>
<p>Some interesting contexts I've used or encountered:</p>
<ul>
<li>In college, I kept the todo list for each class on a giant sticky note
attached to the textbook. I always had it in the class so it was easy to add
to, and when I opened the textbook to study, that's when I was greeted with
the terms I needed to research or tests I needed to prepare for. Context here
is a book as a proxy for a place or time to study.</li>
<li>For a while, I used separate emails for home and work. This naturally created
two contexts depending on which one I opened up. Email addresses as a proxy
for which sphere of life I was operating in.</li>
<li>While planning our wedding, my now-wife and I made a <em>giant</em> list of all the
decisions that need to be made. We tagged ones that only she could do (I
can't try on the wedding dress, it turns out!) and I started tackling all the
rest. Here, we separated contexts based on who could perform this action to
make a giant list more manageable.</li>
<li>I currently am playing with a tag in my task manager for how much focus the
work defines, aligning it roughly along the lines described in <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep
Work</a>. Based on how
much time I have in front of me, I can filter my tasks to either Low or High
focus tasks.</li>
</ul>
<p>It is tempting to over-engineer your contexts, to figure out every possible way
to categorize and separate your tasks. Please don't.</p>
<p>When your system gets overwhelming and you find yourself reading the list over
and over, then think carefully and discover contexts to make the list more
manageable. The key to contexts is less about &quot;where does this item belong?&quot;
and more about &quot;what is important to me here and now?&quot;</p>
<p>I don't need to see my house cleaning tasks while I'm at work. I don't need to
see my evening tasks in the morning. I don't need to see the tasks for any
other project while I'm deeply focused on the most important.</p>
<p>You don't need many contexts… but you probably need a few.</p>
<h4><a href="#reminders" aria-hidden="true" class="anchor" id="reminders"></a>Reminders</h4>
<p>You have to build into your system some kind of ritual or reminder to bring
things automatically into your attention when you are in that context. In the
story from my college years, that ritual was looking at the sticky notes
attached to my textbooks. For a while, I was using Apple's Reminders lists as
contexts, making use of the alerts by location to prompt me when I got to work
or got home. Today, that is switching Areas in Things.app, and using searches
on the labels that I have. (I'll make a post about that eventually.)</p>
<p>Probably the most basic alert is based on time… if I am going to travel this
weekend, I need to pack my bags by Friday. That's usually enough for a lot of
productive life, but as you start to learn and listen to yourself, you might
find others. I have an &quot;Errands&quot; tag in Things for stuff that I do when I'm out
and about, and it automatically triggers every time I leave my home. I have
searches for people and needs for when I'm in a meeting with that person... if
that person asks me &quot;do you have anything for me?&quot; I can ask my system if I
have anything for them.</p>
<h4><a href="#grooming-and-priority" aria-hidden="true" class="anchor" id="grooming-and-priority"></a>Grooming and Priority</h4>
<blockquote>
<p>To work, you must know the right thing to do. You must do that thing, and
nothing else.</p>
</blockquote>
<p>Once your system has given you the right list of tasks for your current
context, you still need to start working on the right thing. You need to
identify which thing is most important right now.</p>
<p>You need to maintain your lists and contexts periodically. I recommend
scheduling time with yourself on a daily basis to evaluate what is most
important for tomorrow, and monthly to review everything in your system to see
if some things are no longer important. Do not be afraid to delete or archive
things that keep getting de-prioritized or skipped… maybe it is not that
important.</p>
<p>If this seems overwhelming… simply take 5 minutes each evening to identify the
<strong>one</strong> most important thing for tomorrow, and commit to doing that thing. (H/T
to the amazing Shawn Blanc for his <a href="https://shawnblanc.net/2015/06/the-note/">writing on The
Note</a>)</p>
<h3><a href="#time-stewardship" aria-hidden="true" class="anchor" id="time-stewardship"></a>Time Stewardship</h3>
<blockquote>
<p>&quot;Dost thou love life? Then do not squander time, for that is the stuff life
is made of.&quot; – Benjamin Franklin</p>
</blockquote>
<p>The last step is follow through. You have remembered all the things, you have
focused on the most important thing, now you have to commit and execute.</p>
<p>Because you have remembered everything, and separated out that which you don't
need to see by contexts and prioritization, at this point you know what you
have to do.</p>
<p>Now you have to do it.</p>
<p>This is much harder than it seems… you are going to encounter a lot of the
&quot;Resistance&quot; that Steven Pressfield preaches against in The War of Art. I've
been wrestling with this for a couple of years though, and the strongest
victories I've achieved have to do with making time for that which I've decided
is most important.</p>
<p>This investing of time is deeply personal and dependent on your personality and
gifting. For me, I've seen a lot of success using some kind of time-blocking
technique like <a href="https://en.wikipedia.org/wiki/Pomodoro_Technique">pomodoro</a> or
<a href="https://www.macsparky.com/blog/2018/2/hyper-scheduling-mechanics">hyper
scheduling</a>.
I schedule time for all kinds of meetings and things that aren't really
important to me and somehow they get done… I've found more success achieving my
highest priorities within a context if I've made time for them. Sometimes I
just make a block of a couple of hours named &quot;Focus: Highest Priorities,&quot; and
spend it on the task at the top of my list.</p>
<p>Whatever works for you is fine with me. Some people strategically pressure
themselves out with deadlines so that they feel compelled to work against their
goals. Some people when faced with a deadline freeze and procrastinate
endlessly. Know thyself, and improve thyself.</p>
<h2><a href="#boulder-begone" aria-hidden="true" class="anchor" id="boulder-begone"></a>Boulder begone</h2>
<p><img src="https://images.evantravers.com/articles/2019/10/sisyphus_top.png" alt="sisyphus" /></p>
<p>There are endless books and conferences and seminars about all this stuff. I'm
just parroting things I have learned. I think the only insight to be gained
here is the idea of three progressive skills to master... it's changed the way
I counsel myself and others when I realize they may not need <em>everything</em> that
works for me, just whatever tool or technique to help them get to the next rung
on the ladder. There may be more levels of &quot;enlightenment&quot; to achieve that I
haven't even perceived yet, but hopefully following along on my battle with
focus and productivity will help you in your fight with your personal boulder.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://shawnblanc.net/">Shawn Blanc's work on focus</a></li>
<li><a href="https://www.relay.fm/focused/74">David Spark's Moving the needle</a></li>
<li><a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work by Cal Newport</a></li>
<li><a href="https://stevenpressfield.com/books/the-war-of-art/">The War of Art by Steven Pressfield</a> (I don't agree with everything Mr. Pressfield says, but it has invaluable advice on Doing Hard Things.)</li>
<li><a href="https://www.relay.fm/cortex">The Cortex Podcast</a></li>
<li><a href="https://www.relay.fm/focused">The Relay.FM Podcast</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Books and Links: September</title>
       <link>http://evantravers.com/articles/2019/09/30/books-and-links-september/</link>
       <pubDate>Mon, 30 Sep 2019 13:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/30/books-and-links-september/</guid>
       <description><![CDATA[ <h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#artemis-by-andy-weir" aria-hidden="true" class="anchor" id="artemis-by-andy-weir"></a>Artemis by Andy Weir</h3>
<p>(Strong language warning.)</p>
<p>It's pretty good. It doesn't have the breathless energy that The Martian did,
but it's a good YA romp. As usual, I wish that the sarcastic fleabag main
character would realize that her problems come from her own choices… just when
the book starts to point to her criminality being the source of her sorrow, the
story serves up a &quot;well, it's helping babies and orphans, so…&quot; I'm not sure
that's a helpful fiction for youth.</p>
<p>It was however enjoyable… maybe a B-?.</p>
<h3><a href="#101-skills-you-need-to-survive-in-the-woods-by-kevin-estela" aria-hidden="true" class="anchor" id="101-skills-you-need-to-survive-in-the-woods-by-kevin-estela"></a>101 Skills You Need to Survive in the Woods by Kevin Estela</h3>
<p>I appreciated that he doesn't want me to be like him… or adopt his religion.
Some of the Tom Brown material I've read is a little hard to swallow, and this
was a nice contrast.</p>
<p>I really like the Sayoc readiness trigram: awareness, preparedness, willingness
= ready.</p>
<blockquote>
<p>In an emergency, water, shelter, fire may be your one concern. In survival,
all of them are your concern.</p>
</blockquote>
<p>Great read... I need to go through it again as a curriculum and try the
exercises though.</p>
<h3><a href="#ancillary-justice-by-ann-leckie" aria-hidden="true" class="anchor" id="ancillary-justice-by-ann-leckie"></a>Ancillary Justice by Ann Leckie</h3>
<p>(Strong language warning.)</p>
<p>I think this is the one my friend Errin has told me about a few times... it's
pretty good. I recommend not spoiling it for yourself.</p>
<p>I weirdly find multiple-perspective single-character stories to be not that
confusing… Maybe reading so much of Ian M. Banks prepared me for this.</p>
<p>The pace changes so dramatically once you find out what is really going on, why
Eck One is on the lam. It's <em>really</em> tense for a book that revolves so much
around fashion and tea ceremonies.</p>
<p>A good quote:</p>
<blockquote>
<p>here’s the truth: luxury always comes at someone else’s expense. One of the
many advantages of civilization is that one doesn’t generally have to see
that, if one doesn’t wish. You’re free to enjoy its benefits without
troubling your conscience.”</p>
</blockquote>
<h3><a href="#ancillary-sword-by-ann-leckie" aria-hidden="true" class="anchor" id="ancillary-sword-by-ann-leckie"></a>Ancillary Sword by Ann Leckie</h3>
<p>Kind of a master and commander vibe to this one.</p>
<p>The manners drama of Ancillary Justice is turned up to 11.</p>
<p>There is <strong>so</strong> much going on in this book! So many threads going on at once…</p>
<p>A great quote:</p>
<blockquote>
<p>Things will seem better after you’ve eaten and slept.” “Really?” she asked.
Bitter and challenging. “Well, not necessarily,” I admitted. “But it’s easier
to deal with things when you’ve had some rest and some breakfast.”</p>
</blockquote>
<h3><a href="#your-family-gods-way-by-wayne-mack" aria-hidden="true" class="anchor" id="your-family-gods-way-by-wayne-mack"></a>Your Family God's Way by Wayne Mack</h3>
<p>This is not my first read through this book, but we've been going through it as
a small group and I've been taking more time to study. <strong>Highly</strong> recommended.
I'll post a more thorough review at some juncture.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h3><a href="#design" aria-hidden="true" class="anchor" id="design"></a>Design</h3>
<h4>
  <a href='https://ericwbailey.design/writing/truths-about-digital-accessibility.html' class='u-in-reply-to' rel='in-reply-to'>Truths about digital accessibility</a>
</h4>
<p>Some great reminders about working with accessibility. Worth it even for the
last point: &quot;Your ego may be the biggest barrier.&quot;</p>
<p><a href="https://ericwbailey.design/writing/truths-about-digital-accessibility.html">Read more...</a></p>
<h4>
  <a href='https://uxdesign.cc/the-no-handoff-method-bridging-design-and-code-19291bf52cdb' class='u-in-reply-to' rel='in-reply-to'>The no-handoff method: bridging design and code</a>
</h4>
<p>I thought this was a very helpful way of thinking about the Lean UX method.</p>
<p><a href="https://uxdesign.cc/the-no-handoff-method-bridging-design-and-code-19291bf52cdb">Read more...</a></p>
<h4>
  <a href='https://medium.com/@tsharon' class='u-in-reply-to' rel='in-reply-to'>The atomic unit of a research insight</a>
</h4>
<blockquote>
<p>In an organization where multiple research studies are conducted every week,
month, or year by a variety of researchers, these reports pile up quickly.
Then, when a team member, executive, or client asks a question about a
certain topic (e.g., what do we know about how our users book conference
rooms?), there’s a need to rely on the long-term memory of researchers who
happened to conduct related studies. In other cases, people mine through long
reports trying to understand what was a meaningful insight. However, in other
cases, ‘non-researchers’ have observations about users every day that are not
necessarily documented.</p>
<p>My conclusion is that a report is not the atomic unit of a research insight.</p>
</blockquote>
<p>This lines up closely with the reviews and reports i've been reading about the
zettelkasten method... I'm excited to apply this in my personal and work life.</p>
<p>Thanks Lorelei B. for the link!</p>
<p><a href="https://medium.com/@tsharon">Read more...</a></p>
<h3><a href="#random-internet" aria-hidden="true" class="anchor" id="random-internet"></a>Random Internet</h3>
<h4>
  <a href='https://pudding.cool/2019/09/language-of-congress/' class='u-in-reply-to' rel='in-reply-to'>The Language of Congress</a>
</h4>
<blockquote>
<p>We fed thousands of Congressional tweets to a machine learning algorithm in
order to recognize political issues. We'll keep doing this every day of the
116th congress, from January 3 2019 through January 3, 2021.</p>
</blockquote>
<p>Very cool, and somewhat intriguing exploration of both what our representatives
are thinking about... and the dark mirror of what we are asking them to talk
about.</p>
<p><a href="https://pudding.cool/2019/09/language-of-congress/">Read more...</a></p>
<h4>
  <a href='https://takeonrules.com/2019/09/15/a-morning-walk-through-gray-skies-and-steady-rain/' class='u-in-reply-to' rel='in-reply-to'>A Morning Walk Through Gray Skies and Steady Rain</a>
</h4>
<blockquote>
<p>This preamble of a walk is like an orchestra tuning before they perform. It
is a necessary part of every walk.</p>
</blockquote>
<p>Once again, lovely prose from takeonrules.com.</p>
<p><a href="https://takeonrules.com/2019/09/15/a-morning-walk-through-gray-skies-and-steady-rain/">Read more...</a></p>
<h4>
  <a href='https://www.thethemesystem.com' class='u-in-reply-to' rel='in-reply-to'>The Theme System</a>
</h4>
<p>As someone always tweaking my focus system, and a fan of the Cortex podcast, I
am so excited to CGP and Myke's system fleshed out.</p>
<p><a href="https://www.thethemesystem.com">Read more...</a></p>
<h4>
  <a href='https://www.thelightphone.com/' class='u-in-reply-to' rel='in-reply-to'>The Light Phone</a>
</h4>
<p>I've always been curious about the lightphone. If they could lower the price to
150 USD, I'd be tempted. I'd also take a device with a lot less capability for
$30 or so.</p>
<p>Someone on Product Hunt pointed out <a href="https://www.producthunt.com/posts/fox-mini-1">this
device</a>. The price is right, but
it doesn't seem to be sold outside of India, although there are apparently some
on
<a href="https://www.aliexpress.com/item/AIEK-X6-M5-M3-Card-Mobile-Phone-Ultra-Thin-Pocket-Mini-Phone-languages-phone-FM-Aiek/32420257062.html?spm=a2g0s.9042311.0.0.Hahv15">aliexpress</a>.</p>
<p><a href="https://www.thelightphone.com/">Read more...</a></p>
<h4>
  <a href='https://cinephiliabeyond.org/aliens/' class='u-in-reply-to' rel='in-reply-to'>The Risk Always Lives: Words to Live by On the Set of James Cameron’s ‘Aliens’ • Cinephilia & Beyond</a>
</h4>
<figure class="sidebar">
  <img src="https://cinephiliabeyond.org/wp-content/uploads/2019/09/image.jpg" alt="">
</figure>
<p>(Content warning: violent images and language.)</p>
<p>I really appreciate the depth of detail that this blog puts into their
background information on some of the greatest films.</p>
<blockquote>
<p>“There are two things missing when I watch a lot of action these days,”
Cameron told Total Film. One is that I don’t care about the characters, and
there isn’t a lucidity to what’s happening—what is the goal, what are these
people trying to accomplish? It’s Narrative 101. The other thing that gets
ignored is the length of time it takes a virgin pair of eyeballs and visual
cortex to take in an image, assimilate it, relate it to images that have gone
before. Lots of action films these days have many small cuts in a sequence.
It’s just chopped salad.</p>
<p>I’ve found there’s a process by which the eye is already moving, ready for
the thing that is going to happen next after the cut. So what I do is—and I’m
giving away a little trick here—is I just flop the workprint in the projector
and watch the film in mirror image. You really see where your eyeballs have
been conditioned to look in a place, but now it’s happening over there, it’s
like, ‘Whoa!’”</p>
</blockquote>
<p>Great lesson for anyone working creatively. Occasionally, you need to create
some distance to experience your work as someone who is seeing it for the first
time. Cameron did this by flipping the image when he watched it. You can also
walk away for a little bit, watch someone else experience it with an open
mind...</p>
<p><a href="https://cinephiliabeyond.org/aliens/">Read more...</a></p>
<h4>
  <a href='https://www.theverge.com/2019/8/15/20806366/we-company-wework-ipo-adam-neumann' class='u-in-reply-to' rel='in-reply-to'>WeWork isn’t a tech company; it’s a soap opera</a>
</h4>
<p>(content warning: strong language)</p>
<blockquote>
<p>I don’t know, friends. I just don’t know. I have never seen anything like
this, and I cannot wait to see what the SEC has to say about loaning your
founder, CEO, and controlling shareholder money while also paying him rent.</p>
</blockquote>
<p>What a weird world we are in. I smell a bubble.</p>
<p><a href="https://www.theverge.com/2019/8/15/20806366/we-company-wework-ipo-adam-neumann">Read more...</a></p>
<h4>
  <a href='https://longreads.com/2019/09/13/remembering-daniel-johnston/' class='u-in-reply-to' rel='in-reply-to'>Remembering Daniel Johnston</a>
</h4>
<blockquote>
<p>Singer and songwriter Daniel Johnston was found dead at his home on the
morning of September 11. He was 58. He sang about good and evil, sex, and
true love.</p>
</blockquote>
<p>A weird and strange influence on modern music culture... and one that I was
barely aware of until his passing. I am inspired by his absolute dedication and
obsession with making music.</p>
<blockquote>
<p>He made more albums, recording his shaky voice and chord organ on a boombox
in his brother’s garage, and he gave the cassettes away to anyone who would
listen. Initially unable to duplicate the tapes, he simply recorded a new
version of an album every time someone asked for a copy.</p>
</blockquote>
<p>Inspiring.</p>
<p><a href="https://longreads.com/2019/09/13/remembering-daniel-johnston/">Read more...</a></p>
<h4>
  <a href='https://slatestarcodex.com/2019/09/18/too-much-dark-money-in-almonds/' class='u-in-reply-to' rel='in-reply-to'>Too Much Dark Money In Almonds</a>
</h4>
<blockquote>
<p>Everyone always talks about how much money there is in politics. This is the
wrong framing. The right framing is Ansolabehere et al’s: why is there so
little money in politics?</p>
</blockquote>
<p>Interesting thoughts... it's pretty interesting to compare the total budgets on
politics to quiet industries.c I wonder what the attention budget difference is
though? Surely we aren't spending that much time with our eyeballs on the
almonds industry as we do politics on social media?</p>
<blockquote>
<p>In this model, the difference between politics and almonds is that if you
spend $2 on almonds, you get $2 worth of almonds. In politics, if you spend
$2 on Bernie Sanders, you get nothing, unless millions of other people also
spend their $2 on him. People are great at spending money on direct
consumption goods, and terrible at spending money on coordination problems.</p>
</blockquote>
<p><a href="https://slatestarcodex.com/2019/09/18/too-much-dark-money-in-almonds/">Read more...</a></p>
<h4>
  <a href='https://www.thegospelcoalition.org/blogs/kevin-deyoung/enneagram-road-back-somewhere-else/' class='u-in-reply-to' rel='in-reply-to'>Enneagram: The Road Back to You, Or to Somewhere Else?</a>
</h4>
<p>A friend told me about Kevin DeYoung's discussion of the enneagram and the book
The Road Back to You. He does a <em>much</em> better job explaining the problems and
benefits of the book than I did.</p>
<blockquote>
<p>If you want to scrap most of the Enneagram history, therapeutic baggage, and
Catholic mysticism, I suppose you could still have a personality tool that
might open your eyes to a thing or two. But then I’d glean a few insights
quietly and distance myself from the seminars, the experts, the books, the
articles, and the nomenclature of the Enneagram. If the Enneagram were
another version of What Color Is Your Parachute? or Strengths Finder, that
would be fine. But it has been, from its inception (whenever that was),
infused with spiritual significance. And therein lies the danger.</p>
</blockquote>
<p><a href="https://www.thegospelcoalition.org/blogs/kevin-deyoung/enneagram-road-back-somewhere-else/">Read more...</a></p>
<h4>
  <a href='https://bittersoutherner.com/whos-country-ken-burns-country-music-rhiannon-giddens' class='u-in-reply-to' rel='in-reply-to'>Who’s Country? — THE BITTER SOUTHERNER</a>
</h4>
<p>(Content warning: Strong language.)</p>
<blockquote>
<p>“I think commerce and convenience categorizes country into its own silo,
imprisons it in its own silo for very understandable reasons,” Burns says.
“But what happens then, particularly in a world in which we're overloaded
with media, we assume that our conventional wisdom, our superficial
knowledge, is it. And that country music is just one thing. And of course, as
we know, everything is much more complicated than that. And nothing in
America is one thing. It's always a mix. It's always got many different
influences. And it's particularly true in country music, like jazz and blues
and rhythm and blues and folk and rock and pop and classical even. They're
all gospel, all sort of intertwined and interrelated. They're not siloed in
their own separate bin. And so I think we've particularly imprisoned country
music in that unfortunate situation. We make fun of it. You know, it's about
good old boys in pickup trucks and hound dogs and six packs of beer, when, in
fact, it is actually dealing in a very simple but very direct way with
universal human experiences. It deals with two four-letter words most of us
would rather ignore: love and loss. And so it's more convenient to say, oh,
it's just about this stuff, the good old boys in the pickup trucks.”</p>
</blockquote>
<p><a href="https://bittersoutherner.com/whos-country-ken-burns-country-music-rhiannon-giddens">Read more...</a></p>
<h4>
  <a href='http://movies2.nytimes.com/books/first/s/stanley-millionaire.html' class='u-in-reply-to' rel='in-reply-to'>The Millionaire Next Door</a>
</h4>
<blockquote>
<p>These people cannot be millionaires! They don't look like millionaires, they
don't dress like millionaires, they don't eat like millionaires, they don't
act like millionaires--they don't even have millionaire names. Where are the
millionaires who look like millionaires?</p>
</blockquote>
<p>I need to be more intentional with my money. :(</p>
<p><a href="http://movies2.nytimes.com/books/first/s/stanley-millionaire.html">Read more...</a></p>
<h4>
  <a href='https://sambleckley.com/writing/church-of-interruption.html' class='u-in-reply-to' rel='in-reply-to'>The Church of Interruption | Sam Bleckley</a>
</h4>
<blockquote>
<p>THE HOLY CREEDO OF THE CHURCH OF INTERRUPTION:</p>
<ul>
<li>Thou shalt interrupt when thou understand’st.</li>
<li>Thou shalt speak until I interrupt.</li>
<li>Thou shalt use physical cues to indicate when I ought continue talking.</li>
</ul>
</blockquote>
<p>Delightful little fiction... and very convicting. Passed through a couple of my
friends, but I think it came from Kevin B. originally. Thanks Kevin!</p>
<p><a href="https://sambleckley.com/writing/church-of-interruption.html">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>World of Textfiles: Daily Use</title>
       <link>http://evantravers.com/articles/2019/09/28/world-of-textfiles-daily-use/</link>
       <pubDate>Sat, 28 Sep 2019 18:57:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/28/world-of-textfiles-daily-use/</guid>
       <description><![CDATA[ <p>I think this blog post is only for me and a few people who want more about
taking notes, zettelkasten, Drafts.app, iOS Shortcuts, and vimwiki… but I need
practice writing so tally-ho!</p>
<p>This system works on a couple key principles:</p>
<ul>
<li>easy capture</li>
<li>automated organization</li>
<li>related recall</li>
</ul>
<p>A knowledge system is a body of information. It is <strong>also</strong> a system and
rituals for getting data into that system. I will not describe the way you
organize this information… I just will present some interesting strategies for
structured content into it and accessing that content.</p>
<h2><a href="#where-text-starts" aria-hidden="true" class="anchor" id="where-text-starts"></a>Where Text Starts</h2>
<div class="quote sidebar">
  More than half of everything I record just doesn’t matter longer than an hour. Do not waste time organizing things that aren’t important.
</div>
<p>As I move through my day… I take notes. Somewhat obsessively. some examples
from one day last week.</p>
<ul>
<li>Five or six meetings.</li>
<li>A particular problem or ticket that I'm researching.</li>
<li>A funny story I want to tell my wife when I get home.</li>
<li>The details of an important conversation with a friend.</li>
<li>Some notes/quotes on a book I'm reading.</li>
<li>A comment or summary for myself on a link I just read or a podcast I just
heard.</li>
</ul>
<p>Depending on when/where these moments occur, I could be at my laptop, writing
on my phone, or just <a href="/articles/tags/bullet-journal/">a bullet journal</a>. On
screens, I use <a href="http://getdrafts.com/">Drafts</a>. In my bullet journal, I have a
separate area for scattered notes rather than organization, using <a href="/articles/2018/07/31/bullet-journal/#record-it-all-focus-on-a-little">a clever
hack I learned from Matt
Ragland</a>.</p>
<p>Either digitally or physically, I have an unrestricted, lightweight inbox for
thoughts and notes. It doesn't have to be placed correctly or organized… yet. I
don't know when I'm writing it whether it's even going to be important. <strong>More
than half of everything I record just doesn't matter longer than an hour.</strong> Do
not waste time organizing things that aren't important.</p>
<h3><a href="#exceptionsyou-dont-always-need-an-inbox" aria-hidden="true" class="anchor" id="exceptionsyou-dont-always-need-an-inbox"></a>Exceptions… you don't always need an inbox</h3>
<p>If I'm sure I <strong>know</strong> where some content should live, or When I am editing an
existing document, I'll use a tool specific to that task. On desktop that is
frequently vim. Not <em>everything</em> needs to go through the inbox first.</p>
<p>For instance, I'm working on a research document for work. When I set time
aside to groom the personal wiki, do some reading on the topic, I'll often just
edit that document directly.</p>
<h2><a href="#where-text-ends" aria-hidden="true" class="anchor" id="where-text-ends"></a>Where Text Ends</h2>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/09/review.png" alt="">
  <figcaption>picture of my review</figcaption>
</figure>
<p>I am unfortunately an obsessive organizer. Left unchecked, I will waste hours
trying to find the <em>perfect</em> place to put a file. Because of this weakness, I
try to delay the processing till the end of the day so as to use my energy for
my best work.</p>
<p>I have a block of time set aside to review and plan for the following day/week.
At the end of the work day I take some time for gratitude, journaling moments
of joy, then I'll process my inboxes. I'll go through my slack and email,
adding tasks to <a href="https://culturedcode.com">Things</a> as I go. I'll block off time
the next day or two to address the most important things in my world. I'll also
go through my different inboxes:</p>
<ul>
<li>My bullet journal.</li>
<li>Drafts. (I have a workspace for this… it's essentially untagged drafts.)</li>
</ul>
<h3><a href="#booknotes" aria-hidden="true" class="anchor" id="booknotes"></a>Booknotes</h3>
<p>Booknotes are relatively straightforward… at the moment, the unfinished
booknote lives in Drafts as a file tagged &quot;booknote&quot; until it is completed. I
have a workspace in Drafts to easily see what books am currently reading. I'll
use this if I'm talking about a book to a friend, or just to catch up on what's
happened so far.</p>
<p><img src="https://images.evantravers.com/articles/2019/09/booknote_workspace.png" alt="booknotes workspace" /></p>
<p>As I read or listen to a book, I'll jot down or dictate fragments along the way
into Drafts. Just a small complete thought. Sometimes as I hit chapters I'll
record the chapter title too, so that when I merge everything together it has a
semblance of the book's outline.</p>
<p><img src="https://images.evantravers.com/articles/2019/09/booknote_select.png" alt="photo of the booknotes" /></p>
<p>At the end of a reading session, I'll often just run the Append to Booknote
action I've created to merge the fragment with the full booknote. It lets me
choose which of the current Drafts tagged &quot;booknote&quot; to which I want to append
this fragment. I therefore build up an stream of consciousness series of
thoughts on the reading experience.</p>
<p>If I haven't already handled them, I'll select and merge the draft fragments
and run the booknotes action at my review time.</p>
<p>When I finish the book, I'll pull my kindle highlights and notes using
<a href="https://readwise.io/bookcision">bookcision</a>, write an executive summary, and
trigger my Magic Wiki action. Because the draft has a &quot;booknote&quot; tag, Magic
Wiki parses the title line and saves it to a folder based on the current year.</p>
<p>Not every book gets an epic note taking treatment. More often than not it is a
single line of my gut impression and my favorite part of a sci-fi novel… just
so that I can find it again if I'm looking for it.</p>
<p>I probably should figure out a way to get it to
<a href="http://goodreads.com">goodreads.com</a> too.</p>
<h3><a href="#blogposts" aria-hidden="true" class="anchor" id="blogposts"></a>Blogposts</h3>
<p>Blogposts typically live in Drafts while in an outline and writing mode. (This
post has been lingering in that workspace for… two months now!) As with
booknotes, this is merely a draft tagged &quot;blog&quot; with an accompanying workspace.</p>
<p>As the blogpost approaches completion and it's time to edit… I'll typically
save it to Dropbox so that I can post it to my blog, or just copy it and paste
it into a vim buffer.</p>
<p>I am currently using <a href="https://leancrew.com/all-this/2019/05/drafts-and-dropbox-redux/">Dr. Drang's dbox
action</a> to
save the file directly to where I want it on Dropbox. I may in the future
adjust this, but that lets me work on the post on my phone and on my computer
in vim simultaneously. I can open my phone, reload from Dropbox, write and
rearrange prose on the go, and save back to Dropbox.</p>
<p>I may try to make something more automated eventually… but this works fine.</p>
<h3><a href="#meetings" aria-hidden="true" class="anchor" id="meetings"></a>Meetings</h3>
<p>I take notes during meetings as Field Notes says: &quot;not to remember it later,
but to remember it now.&quot;</p>
<p>To honor other people's time, I try to not bring my laptop to meetings, but if
the meeting is technical, large, or prone to action items I'm not above it.
Most of the time, it's just my bullet journal and my phone.</p>
<p>I take notes to engage my creativity and to remember important tasks or facts.
Sometimes, those notes are helpful just for connecting the speaker's thoughts
to my work, sometimes they record requests for me or tasks I need to complete.
When the meeting starts, I rarely know which it'll be.</p>
<p>In the moment, I just take notes. At the end of the meeting, these can become
the basis of a wrap-up email. On other occasions they turn into tickets to be
added to the backlog. Either way… I don't worry where it needs to go yet, I
just capture.</p>
<p>During my review of inboxes at the end of the day if there are meeting notes
that are valuable, I want to save them in a logical place. I extract any
critical ideas or references as zettel. I then want to save the note as a sort
of meeting minutes… so I can search for it later.</p>
<p>One of my principles is &quot;automated organization.&quot; In order to normalize the
format of my meeting notes, I run <a href="/articles/2019/09/24/world-of-textfiles-meeting-notes/">a drafts
action</a>. I can choose a
past meeting from my calendar, and it populates a template with all the details
from the meeting. This new draft is formatted, named, and tagged such that all
that is left is to merge my note fragment with the template and run my Magic
Wiki action.</p>
<p>Magic Wiki when it's run on a draft tagged &quot;Meeting&quot; assumes some formatting
such as a date in the title. It then saves the note in the Vimwiki diary
folder. Now I can search by name or tag for any meeting notes about UX… or see
a summary of my meetings generated in Vimwiki.</p>
<p>If the meeting notes are in my bullet journal, at the moment I just make a note
of it in the <a href="http://evantravers.com/articles/2019/09/03/bullet-journal-12-months/#what-am-i-doing-now">week index of my bullet
journal</a>.</p>
<h3><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h3>
<p>Links are still a work in process… it works very smoothly… 50% of the time.</p>
<p>If there's something worth reading, I pretty much always send it to
<a href="http://www.instapaper.com">Instapaper</a>. I have an
<a href="http://ifttt.com/">ifttt.com</a> automation that whenever I &quot;like&quot; a link on
instapaper, sends a file to a folder in my wiki on dropbox. I then can search
for it on my computer and add a comment, or on mobile I have an iOS shortcut
that lets me select and comment on it.</p>
<p>I use these links for reference when I need to remember that handy link later,
and to generate my monthly link posts.</p>
<p>The only thing that's not great about it is if I just find a link somewhere and
want to save it, I first have to save it to instapaper, like it, archive it,
then I can work with it. I need something more direct for if I'm just
searching/browsing the internet.</p>
<p>I think like most my automations, this will likely end up in Drafts eventually.</p>
<h2><a href="#what-i-like-about-my-system" aria-hidden="true" class="anchor" id="what-i-like-about-my-system"></a>What I like about my system.</h2>
<h3><a href="#ownership" aria-hidden="true" class="anchor" id="ownership"></a>Ownership.</h3>
<p>It's mine. I can control all aspects of it.</p>
<p>Because it's just plain files on a hard drive, it should last. If dropbox goes
out of business or I stop using macs, I don't lose access to my notes. I'll
just keep them with me as I move to the next thing.</p>
<h3><a href="#quick-capture" aria-hidden="true" class="anchor" id="quick-capture"></a>Quick Capture</h3>
<p>At the moment… it's very easy getting text into the system just because Drafts
is awesome.</p>
<h2><a href="#what-i-dont-like-about-my-system" aria-hidden="true" class="anchor" id="what-i-dont-like-about-my-system"></a>What I don't like about my system.</h2>
<h3><a href="#too-much-in-too-many-places" aria-hidden="true" class="anchor" id="too-much-in-too-many-places"></a>Too much in too many places.</h3>
<p>Life isn't that segmented… it's weird to have a two digital journals, a wiki, a
bullet journal, and a personal journal. It's slowly evolved a bit to make more
sense, but it's still… messy? I don't like it. I kind of want everything in a
stream where I can connect all my life and thoughts.</p>
<h3><a href="#brittle" aria-hidden="true" class="anchor" id="brittle"></a>Brittle.</h3>
<p>Because my automations don't really talk to each other, I can't change one
piece without changing all the other connecting pieces. I'm writing this
document partly as documentation to remind myself how all this works. :P</p>
<h3><a href="#rituals-are-hard" aria-hidden="true" class="anchor" id="rituals-are-hard"></a>Rituals are hard.</h3>
<p>I'm changing too much too fast… it's hard to stay on top of it a little bit.
Having Drafts be a digital plaintext inbox helps… the imperfect trick is
getting a document or thought into the zettelkasten permanently.</p>
<h3><a href="#i-havent-solved-search" aria-hidden="true" class="anchor" id="i-havent-solved-search"></a>I haven't solved search.</h3>
<p>A key part of the whole Zettelkasten idea is that before you file a settle, you
search to find out where it should live first. Dropbox lets me have full text
search of content and titles, but it's not perfect. On desktop I have a range
of search tools including <code>rg</code> and <code>ack</code>, but it's harder on mobile. As it is,
I typically place notes on desktop and record on mobile, and that works pretty
well.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>This is still a moving target. I still don't have a good way to manually file
something in my actual knowledge system. I've solved the temporal
stuff… meeting notes and random things, but I technically need to move those
things out of my diary and into my knowledge system. I've started a <a href="https://github.com/evantravers/dotfiles/blob/96875b09eb9985435d37739722e5fc8ca0990808/nvim/.config/nvim/init.vim#L241-L242">vim
command</a>
for transforming a vimwiki diary entry into a note, but it's not perfect yet.</p>
<h3><a href="#addendum-why-dont-you-use-vim-for-quick-capture-on-desktop" aria-hidden="true" class="anchor" id="addendum-why-dont-you-use-vim-for-quick-capture-on-desktop"></a>Addendum: Why don't you use vim for quick capture on desktop?</h3>
<p>I guess I could make a binding that makes a file based on the current unix time
stamp… this would guarantee that it's a unique file and I'm not going to incur
the buffer already open error. Draft's capture implementation is lightweight
and just for capture… that makes it easier for me at the moment.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References:</h2>
<ul>
<li><a href="https://zettelkasten.de/posts/zettelkasten-building-blocks/">The blog post that finally made zettelkesten make a little bit more sense to me</a></li>
<li><a href="https://zettelkasten.de/posts/when-start-new-note/">when to start a new note… the theory reminds me of good git commit practices</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>World of Textfiles: Meeting Notes</title>
       <link>http://evantravers.com/articles/2019/09/24/world-of-textfiles-meeting-notes/</link>
       <pubDate>Tue, 24 Sep 2019 13:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/24/world-of-textfiles-meeting-notes/</guid>
       <description><![CDATA[ <p>As I <a href="/articles/2019/07/01/my-world-in-textfiles/">wrote earlier</a>, I have been
experimenting with keeping my personal knowledge system on my own computers and
in plaintext.</p>
<p>I have been working on and off on a too large blogpost trying to explain every
part of it… but it is overwhelming.</p>
<p>I recently updated a part of the whole system, and I thought I'd show you
roughly how it works.</p>
<h2><a href="#where-text-starts-drafts" aria-hidden="true" class="anchor" id="where-text-starts-drafts"></a>Where Text Starts: Drafts</h2>
<p>If an idea starts to form and I'm taking notes, it often makes its way into
<a href="http://getdrafts.com">Drafts</a>. Often those notes are more associated with an
event on my calendar than any particular topic or area of knowledge. This is
where I use my Meeting Notes action.</p>
<p>It used to be a iOS Shortcut, but I recently rewrote it as a pure js action in
Drafts… annotated below. (If you just want to read the full source, click
<a href="https://gist.github.com/34367cdfb41650b60d94ce25ca721ac1">here</a>.)</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calendars</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;list&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;of&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;calendars&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;I&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;want&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;to&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;query&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">today</span>     <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yesterday</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">new</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Date</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">today</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">getTime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1000</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">60</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">60</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">*</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">24</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print_event</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`$&lbrace;</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">strftime</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">startDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;%R&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);"> - $&lbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">`</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">events</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">calendars</span>
</div><div class="line" data-line="9">             <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reduce</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">concat</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Calendar</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">c</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">events</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">yesterday</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">today</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">             <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sort</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">startDate</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">b</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">startDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="11">             <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">reverse</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="12">             <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filter</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">isAllDay</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div></code></pre>
<p>Here we are finding all the events on the calendars by name that we might want
to attach this note to. There's some cleverness in the
<code>Array.prototype.reduce</code>, but all it does is iterate through the calendar names
in <code>var calendars</code> and find the last 24 hours of calendar items.</p>
<p><code>print_event()</code> is a helper function we'll use both to create the menu, and
later to make sure we have the right event selected. It uses the new <a href="https://developers.google.com/web/updates/2015/01/ES6-Template-Strings">es6
template
strings</a>
which are pretty nifty.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event_template</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">MustacheTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">createWithTemplate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&lt;uuid of an appropriate template draft&gt;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div></code></pre>
<p>I'm pretty proud of this method… previously I had been doing a lot of
<code>String.prototype.replace</code> to fill in a template with the variables that I had
supplied… this is a lot simpler. The template itself is in another draft, and
looks like this:</p>
<pre class="lumis"><code class="language-markdown" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);"># &lbrace;&lbrace;title&rbrace;&rbrace; :: &lbrace;&lbrace;startDate&rbrace;&rbrace;
</div><div class="line" data-line="2"></span>
</div><div class="line" data-line="3"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Description
</div><div class="line" data-line="4"></span>
</div><div class="line" data-line="5">&lbrace;&lbrace;notes&rbrace;&rbrace;
</div><div class="line" data-line="6">
</div><div class="line" data-line="7"><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">## Notes
</div><div class="line" data-line="8"></span>
</div></code></pre>
<p>I have a several drafts that just store templates for other actions, they have
a tag of <code>template</code> and live in a Workspace just for Templates.</p>
<p>Returning to the script:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Prompt</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="2">
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Meeting Note&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">message</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Choose an event. the current draft will be appended to the template and tagged `meeting`.&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="5">
</div><div class="line" data-line="6"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">events</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="7">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event_names</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">events</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">map</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print_event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="8">
</div><div class="line" data-line="9">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addSelect</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;event&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Events&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event_names</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">false</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addButton</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Create Meeting Note&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">prompt</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">show</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="13">
</div></code></pre>
<p>This is a little messy… but I'm essentially setting up some UI bits to show the
user a list of events… that way we can choose which event to associate our
notes with!</p>
<p>We use that helper function we defined earlier <code>print_event()</code> to build the
select for the Prompt.</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">buttonPressed</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;Create Meeting Note&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">   <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">// process the event</span>
</div><div class="line" data-line="3">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">events</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">find</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=&gt;</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">print_event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">e</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">==</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">p</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">fieldValues</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;event&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">      <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="6">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;title&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;startDate&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">startDate</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">        <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;notes&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">notes</span>
</div><div class="line" data-line="9">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="10">
</div><div class="line" data-line="11">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">event_template</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">render</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">data</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">addTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;meeting&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">result</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(bold, bold); text-decoration: light-dark(none, none);">\n</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15">      <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">update</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="16">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="17"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>This is pretty much the rest of it. After we've selected a note, (comparing it
to the <code>print_event()</code> string since that's what we get from <code>p.fieldValues[]</code>),
get some values out of the event to make an object to pass to
<code>MustacheTemplate.render</code>, and prepend that template to the current draft.</p>
<p>In my actual version, I have a few more customizations. For instance, if the
event is coming from a work calendar, then I add some tags related to my work.</p>
<p>As it is, you'll have a nice little file with your notes, and all the pertinent
information about the event. I have a Workspace in drafts just for Meeting
Notes (tagged <code>meeting</code>), and it's a pretty great place to remember what was
said or decided.</p>
<h2><a href="#where-text-lives-my-wiki" aria-hidden="true" class="anchor" id="where-text-lives-my-wiki"></a>Where Text Lives: My wiki</h2>
<p>I'm currently using vimwiki out of dropbox to store and link my notes. To get
my note from Drafts to vimwiki, I use an updated version of <a href="/articles/2019/07/01/my-world-in-textfiles/#action">the action I
talked about in a previous
post</a>, but the basic
principle is the same. If a Draft has the tag of <code>meeting</code>, Magic Wiki
basically does this:</p>
<pre class="lumis"><code class="language-javascript" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hasTag</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;meeting&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path_fragment</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;diary&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3">
</div><div class="line" data-line="4">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>
</div><div class="line" data-line="5">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">draft</span>
</div><div class="line" data-line="6">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">title</span>
</div><div class="line" data-line="7">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">split</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;::&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="8">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">slice</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">-</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">0</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="9">    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">trim</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="11">	<span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/wiki/&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path_fragment</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filename</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;.md&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="12">
</div><div class="line" data-line="13">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">db</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#953800, #ffa657); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">Dropbox</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">create</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">var</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">check</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">db</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">.</span><span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">write</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">path</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;append&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="15"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>Since our template uses the &quot;::&quot; string to delimit the time, Magic Wiki will
make a new file in my diary folder by the name of the moment that it occurred.
Vimwiki automagically pulls up the name of the event by the first markdown
<code>&lt;h1&gt;</code> title in the document, and builds a nice little index of all the meeting
notes in the Diary view.</p>
<h2><a href="#plaintext-ftw" aria-hidden="true" class="anchor" id="plaintext-ftw"></a>Plaintext ftw.</h2>
<figure class="sidebar">
  <video controls="controls" poster="https://images.evantravers.com/articles/2019/09/meetingnote.png">
    <source src="https://images.evantravers.com/articles/2019/09/meetingnote.mov">
  </video>
  <figcaption>Here's what it looks like in action.</figcaption>
</figure>
<p>It's always a little bit in flux, but this makes it <em>really</em> easy to put
something in the &quot;right place&quot; for me to find it later. Even if I give up
vimwiki for something else, I've still got a bunch of markdown files named for
the time of the meeting and with all the pertinent information saved alongside
my notes.</p>
<p>If you have a cool trick, let me know. I'll probably clean this up and figure
out how to publish it to the <a href="https://actions.getdrafts.com/">Actions
Directory</a>.</p>
<h2><a href="#references-and-links" aria-hidden="true" class="anchor" id="references-and-links"></a>References and links</h2>
<ul>
<li><a href="https://gist.github.com/34367cdfb41650b60d94ce25ca721ac1">The complete action on gist</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Mechanical Keyboards Won&#39;t Fix Your RSI</title>
       <link>http://evantravers.com/articles/2019/09/09/mechanical-keyboards-won-t-fix-your-rsi/</link>
       <pubDate>Mon, 09 Sep 2019 13:50:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/09/mechanical-keyboards-won-t-fix-your-rsi/</guid>
       <description><![CDATA[ <p>I've started a #mechanicalkeyboards channel on… at least three slack
organizations? I'm a big fan of customizing your tools for your use, and it's
just a fun hobby.</p>
<p>Periodically, someone on a slack asks about mechanical keyboards and wrist
pain. As I have foolishly persuaded or coerced lots of people to spend money on
cool keyboards, my opinion may come as a surprise: by and large, cool keyboards
won't fix your RSI. Even though I have browser tabs up about cool new keyboards
and layouts… it's usually the <em>last</em> thing I would recommend.</p>
<h2><a href="#check-your-stance" aria-hidden="true" class="anchor" id="check-your-stance"></a>Check your stance.</h2>
<p>Cool keyboards honestly should be the last step in a campaign of better posture
and ergonomics. Take a picture of yourself at your desk (or have someone else
critically check your stance) and make sure that you aren’t sitting in a weird
way. You’d be surprised how much a difference elbow position makes in wrist
pain. Those tendons and sheaths are all connected. I think it's pretty
important to check yourself periodically… I've developed a habit to adjust
<em>every</em> time I come to my desk. First thing in the morning, after a meeting…
I'm always adjusting my desk height, monitor height, and keyboard distance.</p>
<h2><a href="#its-often-something-other-than-typing" aria-hidden="true" class="anchor" id="its-often-something-other-than-typing"></a>It's often something other than typing.</h2>
<p>I can’t emphasize this enough: the stress <strong>often</strong> comes from another activity
that you just notice while typing. Here are my normal triggers for RSI:</p>
<h3><a href="#-scrolling-on-touchscreens" aria-hidden="true" class="anchor" id="-scrolling-on-touchscreens"></a>💥 Scrolling on touchscreens.</h3>
<p><a href="https://maketime.blog/article/distractions-are-a-nuisance-but-infinity-pools-are-the-real-problem/">Infinite
pool</a>
feeds on my phone are the most damaging thing to my hands. Holding the phone
and moving my thumb to scroll is surprisingly damaging.</p>
<p>I’ll get worse symptoms after a long weekend of being lazy or especially a
vacation where I use social media more than I should.</p>
<h3><a href="#-using-laptop-trackpads" aria-hidden="true" class="anchor" id="-using-laptop-trackpads"></a>💥 Using laptop trackpads.</h3>
<p>Another common trigger for me is editing photos on my phone or
the trackpad on my laptop… that motion where I hold with my thumb and track
with my fingers is apparently <em>really</em> bad.</p>
<h3><a href="#-it-could-be-your-mouse" aria-hidden="true" class="anchor" id="-it-could-be-your-mouse"></a>💥 It could be your mouse.</h3>
<p>Examine more than just typing.</p>
<p>I experienced some relief from RSI when I bought my first mechanical keyboard,
a 60% poker without a numpad. I was elated.</p>
<p>It wasn't the keyboard. It was the mouse moving closer.</p>
<p>Over time, I became aware that I had started using a dual monitor layout with a
wide keyboard. That put my mouse far out to my right... and I discovered that I
was tweaking my wrist dramatically when I was using the mouse. I theorize that
subconciously, I was trying to point the mouse <em>at</em> the cursor on the screen.
This was creating crazy strain on my wrist. Using a smaller keyboard allowed me
to bring the mouse closer, reducing the strain.</p>
<p>The real answer: Bring the mouse in front of the keyboard at 12 o clock rather
than 3 o clock. I also re-trained myself to stop caring that the mouse was
pointed at the cursor... and that particular source of pain disappeared.</p>
<h2><a href="#strengthen-and-recover-through-exercise" aria-hidden="true" class="anchor" id="strengthen-and-recover-through-exercise"></a>Strengthen and recover through exercise.</h2>
<p>You can “warm up” and exercise those tendon sheaths and muscles using a guitar
trainer, stress ball, or a <a href="https://www.amazon.com/NSD-Essential-Strengthener-Exerciser-Blue/dp/B007GGCLK8/ref=sr_1_2?keywords=powerball&amp;qid=1568036032&amp;s=gateway&amp;sr=8-2">dyna flex
powerball</a>.
The last few times I’ve experienced pain symptoms, simply doing less on my
phone and using these devices for five minutes before and after the work day
helped <em>tremendously</em>.</p>
<h2><a href="#invest-in-typing-correctly" aria-hidden="true" class="anchor" id="invest-in-typing-correctly"></a>Invest in typing correctly</h2>
<p>I anecdotally have experienced better results learning to touch-type properly,
no longer hammering my fingers into the bottom of the keyboard, but I honestly
think there is not much to that.</p>
<p>I've also gotten some help from learning to use the opposite modifier than the
key press. If you type <code>A</code>, you are supposed to use your RH shift for the LH
keypress. I take that all the way to all of my modifiers, even for common
shortcuts.</p>
<p>There are still times where you have a hand on the mouse and a hand on the
keyboard... and that's honestly where a custom keyboard or firmware can help
reduce the weird finger-curling chords that can cause some RSI.</p>
<h2><a href="#finally-look-at-a-split-keyboard" aria-hidden="true" class="anchor" id="finally-look-at-a-split-keyboard"></a>Finally, look at a split keyboard.</h2>
<p>If all else fails, a keyboard <em>can</em> help. You aren’t going to get too much out
of just buying a DAS keyboard or whatever… except the desk shakeup and
readjustment of ergonomics that changing your tools can bring. You’ll get more
switching to a split keyboard with columnar layout like the
<a href="https://ergodox-ez.com/">Ergodox</a>, <a href="https://kinesis-ergo.com/shop/advantage2/">Kinesis
Advantage</a>, or
<a href="https://atreus.technomancy.us/">similar</a>
<a href="https://keeb.io/collections/frontpage/products/iris-rev-3-keyboard-pcbs">boards</a>.</p>
<p><a href="https://www.mayoclinic.org/healthy-lifestyle/adult-health/in-depth/office-ergonomics/art-20046169">Properly setting up my chair for my legs and
back</a>,
desk height for my torso and arm length, and getting a <a href="https://www.amazon.com/gp/product/B0036RDOT8/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1">monitor
arm</a>
to set the monitor at a height for my neck and back… that's been the best
investment. If I were to do it again, I'd buy the monitor arm first.</p>
<p>I enjoy a cool keyboard, but if you are experiencing pain… look at the rest of
your use of your wrists and fingers to see if there's other activities that
contribute. Commit to a small habit for exercise and rehabilitation for your
wrists. Set up your desk for maximum ergonomics… then consider dropping money
on a neat keyboard.</p> ]]></description>
    </item>
    <item>
       <title>Bullet Journal: 12+ Months</title>
       <link>http://evantravers.com/articles/2019/09/03/bullet-journal-12-months/</link>
       <pubDate>Tue, 03 Sep 2019 13:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/03/bullet-journal-12-months/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/09/bullet.jpg"></p><p>I have been using my bullet journal for over a year now. While the original
purpose for starting a journal has changed, I've continued to appreciate the
perspective and focus that I get from the practice of journaling and reflecting
on paper. Here are a few things I've learned in the past year:</p>
<h2><a href="#pick-it-back-up" aria-hidden="true" class="anchor" id="pick-it-back-up"></a>Pick it back up.</h2>
<p>Personally, I have found that when the going gets good, the journal stops
going. Try to keep the momentum… but if you do let your practice lapse, forgive
yourself, <strong>do not</strong> try to go back and fill in the gap… just start anew from
today.</p>
<p>At least twice in the past year I've let the practice lapse. In both times, I
realized that dropping the rituals and practice of journaling resulted in
higher stress and a sense of purposelessness. A major part of my journaling
practice is centered on recognizing what the Lord has accomplished in my life
during the past week and choosing the most essential things on which to focus
for the next week. Each time I let the journal drop, I tend to get caught up in
the whirl of urgent notifications and I miss that quiet sense of knowing my
place in time.</p>
<p>(That was <em>way</em> more zen sounding than I intended, but it is true!)</p>
<h2><a href="#evolve-to-your-needs" aria-hidden="true" class="anchor" id="evolve-to-your-needs"></a>Evolve to your needs.</h2>
<p>I've been scanning my old journals in an effort to have them accessible when
away from my desk. It has been pretty interesting to see how my particular
journal has changed and evolved over the past year.</p>
<p>A healthy reflection/retrospective session regularly with your journal helps
this… I would especially examine anything that you don't value or don't need
and <strong>drop it</strong>. It is way easier to keep a habit that is simple. Over time, my
&quot;spread&quot; has gone from a more structured design that needed a few minutes and a
ruler to draw to a humble pattern that I can set up in five seconds.</p>
<p>Here's a brief history of the changes I've made in the organizational side of
my notebook:</p>
<h3><a href="#early-2018" aria-hidden="true" class="anchor" id="early-2018"></a>Early 2018</h3>
<p>I was using it very irregularly. I had a simple month page with a calendar and
a monthly todo list and daily entries. I copied tasks from one day to the next.
For the first time in a long time, I was keeping track of what I needed to do,
and there was a place to store stuff I needed to do in the future, but copying
the tasks from day to day got tiresome quickly.</p>
<h3><a href="#mid-2018" aria-hidden="true" class="anchor" id="mid-2018"></a>Mid 2018</h3>
<figure class="">
  <img src="https://images.evantravers.com/articles/2018/07/notebook_2.JPG" alt="simple week spread">
  <figcaption>
    The mid 2018 weekly spread... required ruler shown to the left.
  </figcaption>
</figure>
<p>Because I didn't want to keep rewriting tasks, I continued with the monthly
spreads, but added a spread for weeks that gave me the ability to &quot;schedule&quot;
tasks for further in the week. This worked <em>wonderful</em> for quite a long time. I
could identify tasks at the end of a week, and schedule them out into the next
week. This is the style that is shown in <a href="/articles/2018/07/31/bullet-journal/">my original six month
post</a>.</p>
<h3><a href="#late-2018" aria-hidden="true" class="anchor" id="late-2018"></a>Late 2018</h3>
<p>The same system continued for a while with minor tweaks... I added a some small
details like a consistent gratitude rating system for my month... all mostly in
service of planning my month out.</p>
<p>Around November of last year, I was juggling 7-10 projects at work with
multiple due dates and time frames and four of them had to be shifted. At that
time, I decided to move some of the nitty-gritty details of todos and projects
into a digital format, and still track personal todos and goals in the journal.</p>
<p>As my tasks slowly migrated out of my journal into Things 3, the journaling
slowly started to lapse. I wasn't spending time in the journal on a daily basis
unless I was drawing or taking notes. Eventually, I realized I missed the sense
of purpose, and re-designed my weekly spread... which is still evolving. (More
details at the end of this post!)</p>
<h2><a href="#threading-is-incredible" aria-hidden="true" class="anchor" id="threading-is-incredible"></a>Threading is incredible.</h2>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/09/threading.jpg" alt="showing two numbers joined by a thread">
  <figcaption>
    I think the official documentation does it slightly differently...
  </figcaption>
</figure>
<p>The first journal and for half of the second, I didn't bother <em>ever</em> creating a
threaded spread just for a topic. After the first time I was required to pick
up an older project and found myself flipping through two books to reacquire
all the research and context, I started creating <a href="https://bulletjournal.com/blogs/bulletjournalist/threading">threaded
links</a> and
dedicated 2-page spreads for any topic that I suspect is going to go on for
more than a page: all-day events, multi-day projects, even buying a house.</p>
<p>Yes, I have occasionally wasted a page because a project that I thought was
going to take off got canceled, but the power of seeing all the related topics
together far outweighs any whitespace loss. It is an idea singly worth the
whole bullet journal idea just by itself. I can read the disparate thoughts
I've had on a project over a year just by flipping through a few pages.
Amazing.</p>
<h2><a href="#it-taught-me-good-rituals" aria-hidden="true" class="anchor" id="it-taught-me-good-rituals"></a>It taught me good rituals.</h2>
<p>When I first started using the bullet journal… I used it 100%. It was my
agenda, my todo list, my journal. To do this effectively required the
development of rituals. Each morning, the journal was the first thing I touched
and looked at, making sure that my plan for the day aligned with my goals. I
referred to it constantly throughout the day, updating context and marking
things as complete. At the end of the day, I reflected and set new intentions
for the following day. I got into a really solid rhythm, and it felt really
good.</p>
<p>I do not regret moving to what I believe Shawn Blanc calls a &quot;hybrid method.&quot;
(I honestly haven't taken his course on the subject, but from the surrounding
material I think I'm doing something similar.) While it took some tweaking, I
think I have a really good balance going at the moment. I still would advocate
trying the bullet journal method for a season if only because the physical
nature of the medium requires that you develop those valuable rituals for
maintaining your system. These little practices not only contribute to upkeep
of your journal, but they serve as little &quot;startup&quot; and &quot;shutdown&quot; markers. I
find that when I do my shut down routine including my journal, it helps my mind
close the book on work and leave it at my desk, ready for tomorrow. That leaves
me free to focus on my family.</p>
<p>For more information about shut down routines, check out <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep Work by Cal
Newport</a>.</p>
<h2><a href="#you-do-have-to-read-it" aria-hidden="true" class="anchor" id="you-do-have-to-read-it"></a>You do have to read it.</h2>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/09/doodle.jpg" alt="">
  <figcaption>
    It's also <b>very</b> important to doodle. Or not. You do you.
  </figcaption>
</figure>
<p>One of the biggest strengths of any journaling practice is not just recording,
it is reflecting. You need to set aside some time to spend in your journal,
reading and thinking on what has changed. The benefit can be simple gratitude
for an old goal that has been reached, or the more complex realization that
times of anxiety don't last as long as they feel they persist.</p>
<p>I actually look forward to finishing a notebook… I save the last few pages for
a summary/review of the book, things I learned, things I changed, high points
and low. With the size of <a href="https://www.baronfig.com/products/shopconfidant?variant=35638867020&amp;category=notebooks&amp;subset=classic%20editions">my favorite
notebook</a>,
this process happens about every six to nine months, which is a great
additional ritual for gaining some perspective and joy.</p>
<p>Even in the process of researching what I've done and changed over the past
year has been a blessing and boon… the Lord has been good and I've accomplished
a lot more than I remember!</p>
<h2><a href="#what-i-am-doing-now" aria-hidden="true" class="anchor" id="what-i-am-doing-now"></a>What I am doing now?</h2>
<p>I use <a href="https://culturedcode.com/things/">Things 3</a> for my task manager. All my
projects and tasks live in there. I try not to live in it all day, but it's
just easier to manage due dates and delays digitally.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/09/bujo-weekly.jpg" alt="">
  <figcaption>
    Last and this week's spreads. Refreshingly simple. No rulers or stencils
    required... and still evolving. (Changed my habit tracker from vertical to
    horizontal this week and added my new monthly theme.)
  </figcaption>
</figure>
<p>As before, I use my bullet journal for storing my scattered concepts and
thoughts on one side, <a href="/articles/2018/07/31/bullet-journal/#record-it-all-focus-on-a-little">with the organization side on the flip
side</a>. I
have a barebones weekly spread on the other side that contains notes, a simple
habit tracker, and my top three goals. These can be simple personal goals like
&quot;Have a distraction free date night,&quot; but more often than not they correspond
to a task or project that lives in Things. The main purpose for me is
identifying (and limiting!) my goals, and taking notes on the week to help me
plan the next one and work on gratitude.</p>
<p>My &quot;Future&quot; page lives in Things, and I don't track further out than a week in
the Bullet Journal because it is fed out of Things, so there's only a need for
a weekly spread to keep myself connected to my goals. So far it is working
great. My day starts without email or slack... just my calendar and my bullet
journal. I identify a goal that fits today, open Things to that project and
start my day. I still have 25 minutes blocked at the end of the day to review,
reflect, and schedule the next day based on the journal and what's left to do
in my task manager. The rituals are back in place, and it feels good.</p>
<p>I'm sure my tools will change in six months. With the Lord's help, the habits
and focus will only improve.</p> ]]></description>
    </item>
    <item>
       <title>Review: Essentialism by Greg McKeown</title>
       <link>http://evantravers.com/articles/2019/09/01/review-essentialism-by-greg-mckeown/</link>
       <pubDate>Sun, 01 Sep 2019 20:23:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/09/01/review-essentialism-by-greg-mckeown/</guid>
       <description><![CDATA[ <h2><a href="#a-life-designed-not-default" aria-hidden="true" class="anchor" id="a-life-designed-not-default"></a>A life designed, not default.</h2>
<p>Essentialism is one of those books that nearly every person I have been reading
recently has referenced, so with a surplus of audible credits I finally made
the time to listen to it. Succinctly put, you could sum the whole book up in
just a few words: Define your purpose in life, then save your &quot;yes&quot; for only
that which serves that essential purpose. To use Mr. McKeown's words, your life
should be &quot;designed, not default.&quot;</p>
<p>As someone who tends to drift through life and drafts in the wake of other
people's decisions, this book is a wake up call. I have not enjoyed making
decisions, saying no to people... these crucial skills I had abdicated saying
&quot;I just want to help&quot; or &quot;that's not my personality.&quot; This idea of &quot;design
rather than default&quot; challenges that laziness and hits me right in the gut.</p>
<p>The book begins by arguing that no matter what, we will face this quandary
through something the author calls &quot;The Paradox of Success.&quot; The more
successful we are, the more options we have. The more options we have, the more
we feel distracted from what would otherwise be our highest level of
contribution. The sheer momentum of success can carry us (by default) into a
situation where we are unable to be successful. This trap feels very familiar.</p>
<p>The book does a good job of mixing a mental framework with practical
suggestions. In a world where &quot;kondoing&quot; has become a verb, the act of cutting
down on what McKeown calls the &quot;trivial many&quot; may seem like old advice, but I
really like the way he handles thinking about cutting down on decisions and
opportunities. I learned that a choice is not a thing I possess, it's an action
I take. That small twist of mindset has set me free to stop hoarding my
&quot;choices&quot; and opportunities. By holding my cards too long, I often end up
letting the universe choose for me by default.</p>
<p>There's also some excellent counsel and discussion of the power of
discernment... especially on the topic of identifying trade-offs. McKeown says
that the faulty logic of what he dubs the &quot;non-essentialist&quot; claims that &quot;I can
always do both.&quot; This fallacy certainly is reflected in my calendar of late...
I don't choose, I just fly between commitment to commitment until I collapse.</p>
<p>There is also a stern warning in this section to leaders and businesses... if
you don't provide clarity in values and direction, your team won't be able to
discern what's important and can't make a decision as to what problem they
ought to &quot;go big on&quot;. You'll end up a thousand miles in every direction, and
making no progress.</p>
<p>There's a fair amount of discussion on creating margin to do these activities.
As McKeown says, &quot;If you are too busy to think, you are too busy.&quot; As such,
there follows advice on sleep, creating space to think, read, plan, and play.
Sleep deprivation is nearly identical in effect to blood alcohol content. We
would never say &quot;He's a great worker, he's drunk all day!&quot; however McKeown wryly
points out that it's not uncommon for people to brag about staying up all night
to finish an assignment. How is it different?</p>
<p>There's some excellent advice in the final section about how to live this life.
Setting boundaries for yourself to make &quot;no&quot; easy. Uncommitting yourself from
non-essentials that you have embroiled yourself in. Constantly analysing what
commitments and activities are in your life, and whether they line up with your
life purpose and values. Creating a maintainable routine to make execution
effortless. Padding your estimates to maintain margin... it's all great and I'm
sure I will revisit it over the next few years.</p>
<p>I <strong>really</strong> got a lot out of the section on routine and subconscious decision
making. The book references a study that claims we make 40% of all decisions
subconsciously. This is the real trojan horse of &quot;life by default.&quot; What gets
to decide that default? Our family history, the entertainment we subject our
minds to, the social pressures around us, our expectations of ourselves... so
much of our lives are driven by a world that doesn't value our values.</p>
<p>It seems to me that being intentional and designing our subconscious habits,
creating boundaries and routines that reinforce our highest values, is
incredibly important. In fact I'm starting to think it's a very practical way
to &quot;take every thought captive&quot; or &quot;demolish strongholds.&quot; Make it easy to do
what is of utmost importance.</p>
<p>There is a certain amount of &quot;zen&quot; philosophy in the book. The author seems to
take an almost religious satisfaction in living an essential life, comparing it
to great religious leaders in history. While I do agree that this sounds very
much like a purposeful and virtuous life, I don't think it'll give you purpose
and joy to the extent that the author claims.</p>
<h2><a href="#what-ive-changed" aria-hidden="true" class="anchor" id="what-ive-changed"></a>What I've changed.</h2>
<p>I only finished the book a week ago, but I've been reading it slowly for a few
months. Here's what I am trying out or committing to try:</p>
<p>I want to bring clarity to personal and family life with clearly stated goals.
I tend to set really broad, generic goals because it's easy. I want to set more
specific goals to set a vision for our family, so we can decide with ease
whether a commitment or activity moves us closer to those goals or not.</p>
<p>Less goals per week. I'm trying a thing in my bullet journal where I limit the
amount of big rocks to three a week. It could be three work things, two work
things and a big weekend... there's some freedom there, but so far it's been
very freeing and I'm actually getting more done.</p>
<p>Say no. Historically, I've been rubbish at saying no to things. I <em>love</em>
helping people, answering questions, being available to coach and cheer folks
on. This isn't a bad thing, but in my home my family need me to do my most
important things... not help random people on the internet. Same at work.</p>
<h2><a href="#the-essential-few" aria-hidden="true" class="anchor" id="the-essential-few"></a>The essential few.</h2>
<p>I think the book was quite worthwhile, and I'm probably going to have to
re-read it sometime in the future after more success or progress starts to
distract me from that which is most essential.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<p><a href="https://gist.github.com/evantravers/6e3d3a6b233879cfb1c1476fbdac5cc4">My full notes as I was listening</a></p> ]]></description>
    </item>
    <item>
       <title>Books and Links: August</title>
       <link>http://evantravers.com/articles/2019/08/31/books-and-links-august/</link>
       <pubDate>Sat, 31 Aug 2019 00:07:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/08/31/books-and-links-august/</guid>
       <description><![CDATA[ <h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#essentialism-by-greg-mckeown" aria-hidden="true" class="anchor" id="essentialism-by-greg-mckeown"></a>Essentialism by Greg McKeown</h3>
<p>I enjoyed Mr. McKeon's book very much, and was convicted about many of the ways
my life has been &quot;designed by default.&quot; I have tended to drift through life.
It's been fine for a while, but as an aspiring leader in my home and at work I
need to embrace more clarity and focus.</p>
<p>If 40% of my decisions are made subconsciously, and I realize that my
subconscious is largely influenced by the nudges and artifice of my digital
surroundings as well as social pressures. It's the great secret default key to
my behavior… and I have invested far too little in designing and protecting my
subconcious patterns. I now feel that this is part of &quot;taking every thought
captive&quot; and &quot;demolishing strongholds.&quot;</p>
<p>I would recommend this book, especially if you feel pulled in all directions by
many good things and you find the best things in life are suffering.</p>
<p>I'll probably muse on it a little longer and write a longer review soon.</p>
<p><a href="https://gist.github.com/evantravers/6e3d3a6b233879cfb1c1476fbdac5cc4">Link to my full notes</a></p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<h4>
  <a href='https://art19.com/shows/the-portal/episodes/6740c1c3-c9d2-4ecc-a3df-0ed32f0ddba0' class='u-in-reply-to' rel='in-reply-to'>1: Peter Thiel — The Portal — Overcast</a>
</h4>
<p>I've been meaning to listen to this for a while now, a long car ride to the
beach gave me an opportunity. The collective historical perspective of their
two minds is fascinating.</p>
<p>I'm slowly thinking through some of their assumptions… the revolution model of
scientific progress, that scientific progress of any kind is inherently good…
interesting.</p>
<p>Great discussion on the speed of progress (if you removed all the screens out
of a room, how would you tell that time had passed since the 70s,) the issues
with hyper-specialization of knowledge work, the self-destructive Malthusian
obsession with &quot;growth&quot; leading to a lack of discernment between “cancerous
growth” vs. true growth, the mass self-deception required for pretending your
way to success, the way tenure is massaging professors into never questioning
the university system… really intriguing conversation and ideas. I don't think
I've ever been tempted to re-listen to a three hour podcast before. Highly
recommended.</p>
<p><a href="https://art19.com/shows/the-portal/episodes/6740c1c3-c9d2-4ecc-a3df-0ed32f0ddba0">Read more...</a></p>
<h4>
  <a href='https://googleprojectzero.blogspot.com/2019/08/implant-teardown.html' class='u-in-reply-to' rel='in-reply-to'>Implant Teardown</a>
</h4>
<blockquote>
<p>The implant has access to almost all of the personal information available on
the device, which it is able to upload, unencrypted, to the attacker's
server. The implant binary does not persist on the device; if the phone is
rebooted then the implant will not run until the device is re-exploited when
the user visits a compromised site again. Given the breadth of information
stolen, the attackers may nevertheless be able to maintain persistent access
to various accounts and services by using the stolen authentication tokens
from the keychain, even after they lose access to the device.</p>
</blockquote>
<p>This is the tail-end of a long post about an iOS 0-day exploit that was in the
wild for a while.</p>
<p>Don't click on random URLs. Make sure you know who sends you stuff. Don't go
looking for pirated material on the internet. Not even your super-secure iPhone
is safe.</p>
<p><a href="https://googleprojectzero.blogspot.com/2019/08/implant-teardown.html">Read more...</a></p>
<h4>
  <a href='http://www.mophie.com/shop/powerstation-hub' class='u-in-reply-to' rel='in-reply-to'>mophie powerstation hub</a>
</h4>
<img src="http://cdn-media.mophie.com/shop/media/catalog/product/cache/3/image/9df78eab33525d08d6e5fb8d27136e95/p/s/ps-hub_3qtr_left_2000px_1.jpg">
<p>I'm always looking for neat ways to lighten the load in my bag... this may be a
cool way to combine a whole slew of chargers... and a built in battery.</p>
<p><a href="http://www.mophie.com/shop/powerstation-hub">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=7vfqkvwW2fs' class='u-in-reply-to' rel='in-reply-to'>The Marvel Symphonic Universe - YouTube</a>
</h4>
<figure>
  <iframe src="https://www.youtube.com/embed/7vfqkvwW2fs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>
<p>I'm continually sad that Every Frame a Painting is no longer making videos, but
this is one of my favorites... highly recommended if you haven't seen it
already.</p>
<p><a href="https://www.youtube.com/watch?v=7vfqkvwW2fs">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=xb_rgQ4IDS8' class='u-in-reply-to' rel='in-reply-to'>Inside a scam call center - YouTube</a>
</h4>
<figure>
  <iframe src="https://www.youtube.com/embed/xb_rgQ4IDS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>
<p>I've had several friends and family hit by this particular scam. Seeing how the
&quot;business&quot; is run and how easily they can get away with it is super
fascinating. The way they smoothly move from coaxing and coaching to
threatening is... anger-producing.</p>
<p>His sneaky ways to drain the bad guy's money and protect their victims had me
fist pumping in the air at my desk. He's like a quiet-voiced cyber <a href="https://en.wikipedia.org/wiki/Death_Wish_(1974_film)">Paul
Kersey</a>.</p>
<p><a href="https://www.youtube.com/watch?v=xb_rgQ4IDS8">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=MyxWDHy4ppY' class='u-in-reply-to' rel='in-reply-to'>Why the NEW Blender 2.8 is a BIG DEAL - YouTube</a>
</h4>
<figure>
  <iframe src="https://www.youtube.com/embed/MyxWDHy4ppY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>
<p>Once upon a time, little Evan <a href="https://vimeo.com/991698">really wanted to make
movies</a>. My brothers wouldn't act for me, so I did
stop motion animation on Legos and when I ran out of bricks... I started
looking at 3d animation.</p>
<p>I haven't looked at it since high school, but it's cool to see what amazing
improvements an OSS community has made to this amazing tool.</p>
<p><a href="https://www.youtube.com/watch?v=MyxWDHy4ppY">Read more...</a></p>
<h4>
  <a href='https://www.vitsoe.com/us/606' class='u-in-reply-to' rel='in-reply-to'>606 Universal Shelving System | Vitsœ</a>
</h4>
<video controls="controls" poster="https://d2lsod3xpjaepj.cloudfront.net/files/assets/1000/955/sizes/1050.jpg">
  <source src="https://d2lsod3xpjaepj.cloudfront.net/files/assets/1000/955/A_lifetime_with_Vitsoe.mp4">
</video>
<blockquote>
<p>606 Universal Shelving System Designed by Dieter Rams in 1960 and made by
Vitsœ ever since</p>
</blockquote>
<p>Heard about this company in Essentialism... the design is lovely although I
don't think I'll ever afford it.</p>
<p><a href="https://www.vitsoe.com/us/606">Read more...</a></p>
<h4>
  <a href='https://www.youtube.com/watch?v=hWOZiN1kaAc' class='u-in-reply-to' rel='in-reply-to'>The Beehive - Factorio 1.35kspm Megabase with 1-1 Trains</a>
</h4>
<blockquote>
<p>the output is written in braille because it’s the most compact alphabet I’m
aware of and I don’t want to make a bigger one.</p>
</blockquote>
<p>I've been playing <a href="https://factorio.com">factorio</a> and I'm amazed by the
creativity and passion of its community. It makes me excited to build complex
and interesting tools and automations at my actual job... I can't think of many
games that push my creativity the same way.</p>
<p><a href="https://www.youtube.com/watch?v=hWOZiN1kaAc">Read more...</a></p>
<h4>
  <a href='https://newadventuresconf.com/2019/coverage/ethan' class='u-in-reply-to' rel='in-reply-to'>Ethan Marcotte | The World-Wide Work</a>
</h4>
<figure>
  <iframe title="vimeo-player" src="https://player.vimeo.com/video/339383874" frameborder="0" allowfullscreen></iframe>
</figure>
<blockquote>
<p>It's all too easy to design something that excludes people.</p>
</blockquote>
<p><a href="https://adactio.com/journal/15260">Jeremy Keith</a> is right. Set aside time,
watch this now. I'm not sure how I feel about unionization, but I definitely
agree that we need to take personal responsibility for what we design.</p>
<p><a href="https://newadventuresconf.com/2019/coverage/ethan">Read more...</a></p>
<h4>
  <a href='https://intocascadia.com/2019/08/04/raush-clearwater-packraft-traverse/' class='u-in-reply-to' rel='in-reply-to'>Raush-Clearwater Packraft Traverse</a>
</h4>
<figure class="">
  <img src="https://dandurston.files.wordpress.com/2019/08/rausch-2.jpg" alt="">
</figure>
<blockquote>
<p>It’s an area so wild that what may be the largest cave in Canada with a
gaping 100m wide mouth was only discovered last year by a helicopter crew.
Hence – moreso than the other ranges – the Caribou’s still have unclimbed
peaks, unpaddled rivers and almost no trails – a situation Will wanted to
investigate.</p>
</blockquote>
<p>I have often lamented that I live past the days of grand exploration and
adventure. I guess I haven't looked hard enough.</p>
<p><a href="https://intocascadia.com/2019/08/04/raush-clearwater-packraft-traverse/">Read more...</a></p>
<h4>
  <a href='https://thesweetsetup.com/the-distraction-free-phone/' class='u-in-reply-to' rel='in-reply-to'>The Distraction-Free Phone – The Sweet Setup</a>
</h4>
<blockquote>
<p>It’s not hopeless though, and it’s not really the smartphone’s fault that we
succumb to the gravitational pull of apps like Facebook, Twitter, and
Instagram. It’s our own fault for allowing ourselves to get sucked in in the
first place.</p>
<p>But what can we do about it?</p>
</blockquote>
<p><a href="https://thesweetsetup.com/the-distraction-free-phone/">Read more...</a></p>
<h4>
  <a href='https://github.blog/2019-08-16-highlights-from-git-2-23/' class='u-in-reply-to' rel='in-reply-to'>Highlights from Git 2.23</a>
</h4>
<p>A pretty big release... <code>git switch</code> and <code>git restore</code> feel like sensible
additions to the porcelain. A lot easier to explain to be sure.</p>
<p><a href="https://github.blog/2019-08-16-highlights-from-git-2-23/">Read more...</a></p>
<h4>
  <a href='https://www.fastcompany.com/90391190/the-untold-story-of-americas-brilliant-national-parks-branding' class='u-in-reply-to' rel='in-reply-to'>The untold story of America’s brilliant national parks branding</a>
</h4>
<p><img src="https://images.fastcompany.net/image/upload/w_596,c_limit,q_auto:best,f_auto/wp-cms/uploads/2019/08/26-see-the-evolution-of-design-through-the-national-park.jpg" alt="unigrid system. photo courtesy of Standards Manual" /></p>
<blockquote>
<p>Vignelli came up with a framework called the Unigrid system that provided a
set of visual devices to streamline all of the NPS’s maps, pamphlets, and
posters. That meant that each title would now run vertically along a
brochure’s right side in Helvetica, and designers would work within a modular
grid system that dictated where they could place images and text.</p>
<p>It was a boon for the government financially and logistically. “One of the
good things about the Vignelli system is that it standardized paper sizes,
weights, and types, and it was a grid system where you knew roughly what it
was going to look like and how much text you had to have written and how many
images might fit,” Smyth says. “It streamlined things quite a lot, and in the
end they saved a lot of money from printing by buying things in bulk.”
Vignelli’s Unigrid was so successful for the NPS that it’s still in use
today.</p>
</blockquote>
<p>Great design. Would not mind adding Parks to my collection of books.</p>
<p><a href="https://www.fastcompany.com/90391190/the-untold-story-of-americas-brilliant-national-parks-branding">Read more...</a></p>
<h4>
  <a href='https://blog.codinghorror.com/electric-geek-transportation-systems/' class='u-in-reply-to' rel='in-reply-to'>Electric Geek Transportation Systems</a>
</h4>
<blockquote>
<p>As for me, I have seen the future, and it is absolutely, inexorably, and
unavoidably … electric. ⚡</p>
</blockquote>
<p>While I am excited about the prospect of electric vehicles, and this article
speaks to me when it comes to cars coming into my world as a programmer... I
wonder how long the value curve will take to reach me down here in &quot;I don't buy
new cars and I buy ten year old junkers&quot; land.</p>
<p><a href="https://blog.codinghorror.com/electric-geek-transportation-systems/">Read more...</a></p>
<h4>
  <a href='https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/' class='u-in-reply-to' rel='in-reply-to'>Adding Webmention Support to a Static Site</a>
</h4>
<p>In an effort to have something like a comments on this site, I have started
working on implementing webmentions. I’m excited to join the “IndieWeb,” and
have a presence that I own but is still connected.</p>
<p>I have not fully implemented it all... but I hope to soon show webmentions via
twitter or indieweb in each article.</p>
<p><a href="https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/">Read more...</a></p>
<h4>
  <a href='https://art19.com/shows/the-portal/episodes/fc8934df-0bbe-48c0-aed1-25a0c3674712' class='u-in-reply-to' rel='in-reply-to'>The Portal Podcast - 3: Werner Herzog</a>
</h4>
<blockquote>
<p>We shall technological utopias coming to an end in our century just as we saw sociological utopias coming to an end in the last century.
[…]
(speaking of mars colonization) this kind of illusion, this kind of technical utopia will come to an end in our century … we are going to die. That's what all of creation points to.</p>
</blockquote>
<p>– Werner Herzog</p>
<p>I've been finally catching up on this long form interview podcast… and was
delighted to see Herzog as a guest. I've always had a fascination for Herzog,
and this interview did not let me down.</p>
<p>I don't agree with his worldview, but I admire his sense of duty to his craft
and message. Get used to the bear behind you.</p>
<p>Some of his book recommendations in answer to a crowd question:</p>
<ul>
<li>Don't just read three. Read two thousand books. It's the constant practice
that makes a difference.</li>
<li>The Peregrine by JA Baker</li>
<li>The Discovery and Conquest of New Spain</li>
<li>A Guide for the Perplexed</li>
<li>The short stories of Joseph Conrad</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Adding ruby and elixir mappings for vim-sandwich</title>
       <link>http://evantravers.com/articles/2019/08/27/adding-ruby-and-elixir-mappings-for-vim-sandwich/</link>
       <pubDate>Tue, 27 Aug 2019 15:06:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/08/27/adding-ruby-and-elixir-mappings-for-vim-sandwich/</guid>
       <description><![CDATA[ <p>In <a href="/articles/2019/01/07/vim-sandwich-vs-vim-surround/">my earlier quick
review</a> of vim-sandwich I
noted that it didn't have integration with
<a href="https://github.com/tpope/vim-ragtag/blob/master/doc/ragtag.txt#L72-L80">ragtag.vim</a>'s useful bindings.</p>
<p><a href="https://github.com/gvaughn">@gvaughn</a> and I worked through the elixir ones,
the current version looks like this:</p>
<pre class="lumis"><code class="language-vim" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; vim-sandwich</span>
</div><div class="line" data-line="2"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sandwich#recipes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">deepcopy</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sandwich#default_recipes</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sandwich#recipes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="4">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="5">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;%&lbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&rbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;elixir&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="7">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span>   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;m&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="9">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="11">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;StructInput()&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;elixir&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="13">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;kind&#39;</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;add&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;replace&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;action&#39;</span>  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;add&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="15">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span>   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;M&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;listexpr&#39;</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="19">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="20">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;%\w\+&lbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&rbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="21">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;elixir&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="22">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span>   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;M&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="23">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="24">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;regex&#39;</span>   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="25">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="26">      \ <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="27">
</div><div class="line" data-line="28"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">function</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">StructInput</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">abort</span>
</div><div class="line" data-line="29">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">StructLast</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">input</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;Struct: &#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="30">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">if</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">StructLast</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">!=</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">#</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&#39;</span>
</div><div class="line" data-line="31">    <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">struct</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span> <span style="color: light-dark(#6639ba, #d2a8ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">printf</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;%%%s&lbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">s:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">StructLast</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span>
</div><div class="line" data-line="32">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">else</span>
</div><div class="line" data-line="33">    <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">throw</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;OperatorSandwichCancel&#39;</span>
</div><div class="line" data-line="34">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endif</span>
</div><div class="line" data-line="35">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">return</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">struct</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&rbrace;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div><div class="line" data-line="36"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">endfunction</span>
</div></code></pre>
<p>Most of it is pretty straightforward, but the Struct mapping needs a function
to take an input to name the struct.</p>
<p>In the below gif, I use the commands targeting inside the
parentheses to change the argument of this elixir function. Because this action
is repeatable through the repeat operator (<code>.</code>), you could imagine this would
make refactoring some random arguments to take a map or struct instead to be
very quick.</p>
<p><img src="https://camo.githubusercontent.com/a88ea68d1cb445ea05feda5d54b0f43f767e3566/68747470733a2f2f636c2e6c792f3831313963633933616166342f646f776e6c6f61642f677265672e737667" alt="gif showing the working" /></p>
<p>It works really well!</p>
<p>While working on some areas of this blog, I realized that I did miss having
sandwich buns that matched the vim-ragtag mappings, so I referenced the ragtag
help docs and whipped up a few more lines of viml.</p>
<pre class="lumis"><code class="language-vim" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">let</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">g:</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">sandwich#recipes</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">+=</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span>
</div><div class="line" data-line="2">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="3">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>     <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;%= &#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39; %&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="4">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;eruby&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="5">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;=&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="6">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="7">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="8">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="9">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>     <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;% &#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39; %&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="10">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;eruby&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="11">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;-&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="12">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="13">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="14">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="15">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;buns&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>     <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;&lt;%# &#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39; %&gt;&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="16">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;filetype&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;eruby&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="17">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;input&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>    <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;#&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">,</span>
</div><div class="line" data-line="18">      \     <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&#39;nesting&#39;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span>  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">1</span>
</div><div class="line" data-line="19">      \   <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div><div class="line" data-line="20">      \ <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span>
</div></code></pre>
<p>Even more simple than the elixir options, but just works. If you want both, you
can check my <a href="https://github.com/evantravers/dotfiles/blob/3973600af014fd037a116327212c467a6eda180c/nvim/.config/nvim/init.vim#L256-L309">full
config</a>
below.</p>
<p>References:</p>
<ul>
<li><a href="https://github.com/evantravers/dotfiles/blob/3973600af014fd037a116327212c467a6eda180c/nvim/.config/nvim/init.vim#L256-L309">Current vim-sandwich configuration</a></li>
<li><a href="https://github.com/evantravers/dotfiles/commit/3973600af014fd037a116327212c467a6eda180c">Commit: Adding ragtag mappings for vim-sandwich</a></li>
<li><a href="https://github.com/evantravers/dotfiles/commit/d0a46ab0738dd717ff1a07320999181b17ba5f75">Commit: Add buns for vim-sandwich to support elixir structs</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Let Me Remember My Song</title>
       <link>http://evantravers.com/articles/2019/08/26/let-me-remember-my-song/</link>
       <pubDate>Mon, 26 Aug 2019 12:27:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/08/26/let-me-remember-my-song/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/08/sunrise.jpg"></p><p>This morning I was reading Psalm 77, and it occurred to me that this chapter
<strong>is</strong> the counsel I am so often looking for… especially as my wrestling with
God stretches into the quiet watches of the night.</p>
<blockquote>
<p>In the Day of Trouble I Seek the Lord</p>
<p>To the choirmaster: according to Jeduthun. A Psalm of Asaph.</p>
<p>[1] I cry aloud to God,<br />
aloud to God, and he will hear me.<br />
[2] In the day of my trouble I seek the Lord;<br />
in the night my hand is stretched out without wearying;<br />
my soul refuses to be comforted.<br />
[3] When I remember God, I moan;<br />
when I meditate, my spirit faints. Selah</p>
</blockquote>
<p>In Asaph's words I can taste the edge of the bitterness and anxiety that comes
from feeling disconnected from God. I remember…The answer I have been praying
for hasn't come. The opportunity I was counting on has slipped away. It's been
weeks or months without healing. That relationship on which I pin my future is
in jeopardy. The heavens are silent even as I beat on the gates with every
quiet moment and every hour that ought to be sleep.</p>
<p>God is even a painful thought… Asaph can't meditate or concentrate, it's too
much.</p>
<p>He's just tired.</p>
<p>Familiar to you too? Let's read on.</p>
<blockquote>
<p>[4] You hold my eyelids open;<br />
I am so troubled that I cannot speak.<br />
[5] I consider the days of old,<br />
the years long ago.<br />
[6] I said,(1) “Let me remember my song in the night;<br />
let me meditate in my heart.”</p>
</blockquote>
<p>I love how the psalmist, even as he feels so distant and unheard, acknowledges
that even his sleeplessness is part of God's sovereign plan. &quot;You hold my
eyelids open.&quot;</p>
<p>Here in verse 5, the psalm takes the turn. Asaph considers history… years long
ago, and <em>his</em> own song. I have been considering what this means. Is he
speaking of a psalm he wrote, a prayer of worship and joy? Does &quot;his song&quot; mean
his own story or testimony? Either way, he is considering and dwelling on God's
love and faithfulness in history and his own experience.</p>
<p>Not only is he bringing it to mind, he is meditating on it. The
transcendentalist eastern-style meditation currently in vogue is not what is
spoken of here, but it does have one similarity: to put out of your mind that
which distracts. I can almost hear Asaph take a deep slow breath as the fear
and doubt that has brought tears and sleeplessness are <a href="https://biblehub.com/2_corinthians/10-5.htm">diligently and
carefully laid aside</a> as he
meditates on the days of old and his song in the night.</p>
<blockquote>
<p>Then my spirit made a diligent search:</p>
</blockquote>
<blockquote>
<p>[7] “Will the Lord spurn forever,<br />
and never again be favorable?<br />
[8] Has his steadfast love forever ceased?<br />
Are his promises at an end for all time?<br />
[9] Has God forgotten to be gracious?<br />
Has he in anger shut up his compassion?” Selah</p>
</blockquote>
<p>Now Asaph's heart is quiet… and he employs his mind and reasoning against the
truths on which he has anchored his heart and emotions.. Has His steadfast love
forever ceased? Are his promises at an end for all time?</p>
<p>The answer is no. This is part of our eternal hope and joy in an unchanging and
perfect God. <a href="https://biblehub.com/malachi/3-6.htm">He has not changed, nor will
he</a>.</p>
<blockquote>
<p>[10] Then I said, “I will appeal to this,<br />
to the years of the right hand of the Most High.”(2)</p>
</blockquote>
<p>When I first read this, I thought that Asaph was about to employ a means of
prayer that is often seen in the Old Testament, using this rediscovered truth
about God in his prayers… something like <a href="https://biblehub.com/daniel/9-16.htm">Daniel asking God to stay true to his
character</a>. I was wrong.</p>
<blockquote>
<p>[11] I will remember the deeds of the LORD;<br />
yes, I will remember your wonders of old.<br />
[12] I will ponder all your work,<br />
and meditate on your mighty deeds.<br />
[13] Your way, O God, is holy.<br />
What god is great like our God?<br />
[14] You are the God who works wonders;<br />
you have made known your might among the peoples.<br />
[15] You with your arm redeemed your people,<br />
the children of Jacob and Joseph. Selah</p>
</blockquote>
<p>He is contending with his own fears! He is taking the quiet heart anchor and
double edged sword of truth to do battle with his own anxiety… turning his
thoughts to praise and worship.</p>
<p>It's not just a frenzy of emotional fervor, it is thoughtful. It is the same
disciplined consideration of truth, a diligent search of scripture, now
name-checking the mighty deeds of old and standing firm on the promises they
represent.</p>
<p>What a challenge to me. I don't know that I have ever changed emotional gears
like this to respond to stress. I ride the waves up and down, usually from
mind-whirling fears to some praise and worship song that kicks me in the
emotional gut and turns my thoughts to brokenness and worship. Not a bad
strategy, but I love encountering what seems to be a slightly different path:
calming my heart by meditating on scripture, then reasoning on that truth to
put my fears to death… and ending in praise.</p>
<blockquote>
<p>[16] When the waters saw you, O God,<br />
when the waters saw you, they were afraid;<br />
indeed, the deep trembled.<br />
[17] The clouds poured out water;<br />
the skies gave forth thunder;<br />
your arrows flashed on every side.<br />
[18] The crash of your thunder was in the whirlwind;<br />
your lightnings lighted up the world;<br />
the earth trembled and shook.<br />
[19] Your way was through the sea,<br />
your path through the great waters;<br />
yet your footprints were unseen.(3)</p>
</blockquote>
<p>I've been at the beach for the past week. I am always convicted at how I
mentally flatten the infinite horizon of the ocean into just the twenty feet
that I can easily access, like the passable portion of a map in a video game.
It robs of me of the wonder that has enthralled poets and prophets for
millennia.</p>
<p>As I read this bit, I considered how water is a perfect metaphor for life. It's
used in scripture so much… waves crash down, lack of water makes us pant, we
can drown in it, it can conceal monsters in the deep, we need water to grow,
the disciples think they've mastered it, it masters them, then Christ proves he
is the Master.</p>
<p>Whether we are becalmed and can't move, or with Peter we are drowning under
that which we ought to be walking upon, or the tall waves are threatening to
overcome, this beautiful psalm is another reminder that our God is the creator
and king of the oceans… and of the life of which they are a symbol. Amen.</p>
<blockquote>
<p>[20] You led your people like a flock<br />
by the hand of Moses and Aaron.</p>
</blockquote>
<p>We are led like a shepherd. He leads from the front. We just follow. That's a
good word for my next sleepless night.</p>
<p>Photo by me. Scripture quotations from the ESV.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: July</title>
       <link>http://evantravers.com/articles/2019/07/31/books-and-links-july/</link>
       <pubDate>Wed, 31 Jul 2019 12:13:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/31/books-and-links-july/</guid>
       <description><![CDATA[ <p>Pretty crazy month, personally and professionally. At this moment though, I am
content and grateful. God is good.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#lean-ux-by-jeff-gothelf-and-josh-seiden" aria-hidden="true" class="anchor" id="lean-ux-by-jeff-gothelf-and-josh-seiden"></a>Lean UX by Jeff Gothelf and Josh Seiden</h3>
<blockquote>
<p>Lean UX is the practice of bringing the true nature of a product to light
faster, in a collaborative, cross-functional way that reduces the emphasis on
thorough documentation while increasing the focus on building a shared
understanding of the actual product experience being designed.</p>
</blockquote>
<p>Begun in June. Finished two days before class with Josh Seiden in July.</p>
<p>This is a reference cookbook defining a collaborative, agile process called
Lean UX. Given the current challenges I face at work… this book is a challenge.
It’s hard to read at the moment without coming up with all the reasons that
this can’t work for me.</p>
<p>I think that I need to take a refresher skim or pass through the notes with an
eye towards “what can I learn from this?”</p>
<p>I was directly challenged in many ways... I tend to over-design or
over-engineer, which is properly condemned in this book. It also points out
that in my present role as a UX practitioner, I need to focus and hone my
skills as facilitating collaborative exercises.</p>
<h3><a href="#across-the-fence-by-john-stryker-myer" aria-hidden="true" class="anchor" id="across-the-fence-by-john-stryker-myer"></a>Across the Fence by John Stryker Myer</h3>
<p>I heard about this one on the Jocko podcast.</p>
<blockquote>
<p>Setting that record was a draining, often deadly exercise that ran like this:
As the team leader, I’d get a target in the morning. Covey would pick
primary, secondary and alternate LZs. The team would load up on the Kingbees,
go into the primary LZ and get shot out of it. Then we’d get shot out of the
secondary and alternate sites. Because the flights to the Prairie Fire AO
were so long, we’d have to fly back to Phu Bai, refuel, eat lunch, get
another target and try it again with identical results in the afternoon.</p>
</blockquote>
<p>This book is a fascinating look at some brave young men. It's an exercise in
doing more by doing less (I'm <em>still</em> working my slow way through Essentialism)
and in bravery. I recommend listening to the <a href="https://www.youtube.com/watch?v=sNyo7DZ0QBY">podcast episodes with Mr.
Meyer</a>, pretty humbling stuff.</p>
<p>It's been hard to wuss out of workouts while listening to what they did and
endured.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>There's a lot this week... I deleted games off my phone, so a lot more podcasts
and links were read.</p>
<p>There's some themes here... so I'm going to take the liberty of trying out
categories for the links. (It's my blog, my rules!)</p>
<h3><a href="#interesting" aria-hidden="true" class="anchor" id="interesting"></a>Interesting</h3>
<h4><a href="#the-case-against-lawns" aria-hidden="true" class="anchor" id="the-case-against-lawns"></a><a href="https://www.curbed.com/2019/3/13/18262285/mcmansion-hell-kate-wagner-lawn-care-mowing">The case against lawns</a></h4>
<blockquote>
<p>Lawns, by acreage, are the nation’s largest irrigated crop, surpassing corn.
Lawns consume resources, including fresh water (especially in those lawns
cultivated in desert climes), fertilizer, pesticides and other chemicals,
fossil fuels for mowing, and a mind-numbing amount of time, on an immense
scale. Much hand-wringing goes on about the use of pesticides in industrial
farming and the effect it has had on the worldwide population of pollinators,
but less about its destructive use in lawn care. Lawns have introduced some
of the country’s most invasive species, including English ivy, Japanese and
Chinese wisteria, and decorative trees such as princess tree, Bradford pear,
and mimosa. Second only to deforestation, invasive species are the largest
threat to the world’s biodiversity.</p>
<p>And all this for what?</p>
</blockquote>
<p>I'm a fan of <a href="https://mcmansionhell.com/">Kate's blog McMansion Hell</a>... and
this is great too.</p>
<p><a href="https://www.curbed.com/2019/3/13/18262285/mcmansion-hell-kate-wagner-lawn-care-mowing">Read more...</a></p>
<h4><a href="#the-new-wilderness-idle-words" aria-hidden="true" class="anchor" id="the-new-wilderness-idle-words"></a><a href="https://idlewords.com/2019/06/the_new_wilderness.htm">The New Wilderness (Idle Words)</a></h4>
<p>I know this has been making the rounds for a while, but it <em>is</em> very well
written.</p>
<blockquote>
<p>In the eyes of regulators, privacy still means what it did in the eighteenth
century—protecting specific categories of personal data, or communications
between individuals, from unauthorized disclosure. Third parties that are
given access to our personal data have a duty to protect it, and to the
extent that they discharge this duty, they are respecting our privacy.</p>
<p>Seen in this light, the giant tech companies can make a credible claim to be
the defenders of privacy, just like a dragon can truthfully boast that it is
good at protecting its hoard of gold. Nobody spends more money securing user
data, or does it more effectively, than Facebook and Google.</p>
<p>The question we need to ask is not whether our data is safe, but why there is
suddenly so much of it that needs protecting. The problem with the dragon,
after all, is not its stockpile stewardship, but its appetite.</p>
</blockquote>
<p>I don't agree 100% with the author's assertions about environmentalism, and the
related conceit that only federal regulation can save us, but the comparison to
this new world of privacy/data is intriguing.</p>
<p>More scary words:</p>
<blockquote>
<p>Our discourse around privacy needs to expand to address foundational
questions about the role of automation: To what extent is living in a
surveillance-saturated world compatible with pluralism and democracy? What
are the consequences of raising a generation of children whose every action
feeds into a corporate database? What does it mean to be manipulated from an
early age by machine learning algorithms that adaptively learn to shape our
behavior?</p>
<p>That is not the conversation Facebook or Google want us to have. Their
totalizing vision is of a world with no ambient privacy and strong data
protections, dominated by the few companies that can manage to hoard
information at a planetary scale. They correctly see the new round of privacy
laws as a weapon to deploy against smaller rivals, further consolidating
their control over the algorithmic panopticon.</p>
</blockquote>
<p><a href="https://idlewords.com/2019/06/the_new_wilderness.htm">Read more...</a></p>
<h4><a href="#the-drug-revolution-that-no-one-can-stop---matter---medium" aria-hidden="true" class="anchor" id="the-drug-revolution-that-no-one-can-stop---matter---medium"></a><a href="https://medium.com/matter/the-drug-revolution-that-no-one-can-stop-19f753fb15e0">The Drug Revolution That No One Can Stop - Matter - Medium</a></h4>
<blockquote>
<p>And here lies the problem. We can ban drugs. But we can’t ban chemistry, and
we can’t ban medical research.</p>
</blockquote>
<p>This is I'm sure a little overblown, but a little scary.</p>
<p><a href="https://medium.com/matter/the-drug-revolution-that-no-one-can-stop-19f753fb15e0">Read more...</a></p>
<h4><a href="#mystery-photographs-no6-russian-film" aria-hidden="true" class="anchor" id="mystery-photographs-no6-russian-film"></a><a href="https://www.modelshipsinthecinema.com/2019/07/mystery-photographs-no6-russian-film.html">Mystery Photographs No:6 Russian film.</a></h4>
<img alt="image of ships being painted on glass for old movie" src="https://1.bp.blogspot.com/-3SjmUCkM8wg/XSxb5NOgzNI/AAAAAAAAOnw/Apv2X5YRKWMCkDF_Tcs-xKH6knO2kmUYACKgBGAs/s640/RussianMystery22.jpg">
<blockquote>
<p>I recently acquired a spectacular series of 30 photographs documenting the
shooting of miniature ship effects for an unknown Russian film.</p>
</blockquote>
<p>Wonderful weird insight into the way that films used to be made... and really
still are.</p>
<p><a href="https://www.modelshipsinthecinema.com/2019/07/mystery-photographs-no6-russian-film.html">Read more...</a></p>
<h4><a href="#thread-by-foone-on-kodaks-history" aria-hidden="true" class="anchor" id="thread-by-foone-on-kodaks-history"></a><a href="https://threadreaderapp.com/thread/1151546837578313728.html">Thread by @foone on Kodak's History</a></h4>
<blockquote>
<p>non-calendar reasons why Kodak is weird:
They discovered something in 1946 that wasn't publicly known and was supposed to be top secret. And they sued the government over it.</p>
</blockquote>
<p>Super fascinating exploration of a bizarre and awesome company.</p>
<p><a href="https://threadreaderapp.com/thread/1151546837578313728.html">Read more...</a></p>
<h3><a href="#notetaking" aria-hidden="true" class="anchor" id="notetaking"></a>Notetaking</h3>
<h4><a href="#when-should-you-start-a-new-note--zettelkasten-method" aria-hidden="true" class="anchor" id="when-should-you-start-a-new-note--zettelkasten-method"></a><a href="https://zettelkasten.de/posts/when-start-new-note/">When Should You Start a New Note? • Zettelkasten Method</a></h4>
<blockquote>
<p>The best answer I can come up with is pragmatic: when getting information out
of a note takes too long, it’s not a well-written note. Rephrase it or split
it…</p>
</blockquote>
<p>I'm doing a lot of researching about note-taking, and specifically this
esoteric system called zettelkasten.</p>
<p><a href="https://zettelkasten.de/posts/when-start-new-note/">Read more...</a></p>
<h4><a href="#you-only-find-what-you-have-identified--zettelkasten-method" aria-hidden="true" class="anchor" id="you-only-find-what-you-have-identified--zettelkasten-method"></a><a href="https://zettelkasten.de/posts/add-identity/">You Only Find What You Have Identified • Zettelkasten Method</a></h4>
<blockquote>
<p>The objective of a Zettelkasten note archive is to store notes and allow
connections. Both are necessary to extend our mind and memory. As long as the
software you use doesn’t provide any means to create links between notes, you
have to come up with your own convention. Even if the software did provide
such a mechanism, I’d suggest you think twice about relying on it: I want to
evade vendor lock-in for my Zettelkasten, and I think you should, too. So
let’s assume you don’t care about the software and create your own hyperlink
scheme.</p>
</blockquote>
<p><a href="https://zettelkasten.de/posts/add-identity/">Read more...</a></p>
<h4><a href="#building-blocks-of-a-zettelkasten--zettelkasten-method" aria-hidden="true" class="anchor" id="building-blocks-of-a-zettelkasten--zettelkasten-method"></a><a href="https://zettelkasten.de/posts/zettelkasten-building-blocks/">Building Blocks of a Zettelkasten • Zettelkasten Method</a></h4>
<p>I've been scouring the internet for more information about this method... this
is the first article that is starting to make sense.</p>
<blockquote>
<p>There’s a thing called “Zettelkasten”, and then there’s you using it. The
former is the toolkit, the latter is your application of a method.</p>
</blockquote>
<blockquote>
<p>I recognize the following pieces:</p>
<ul>
<li>Inbox: the gateway into your knowledge system</li>
<li>Archive: the one, trusted place to look for information</li>
<li>Reference Database: interface to the outside world</li>
</ul>
</blockquote>
<p>This article is going to be very formative to the vimwiki final blogpost...</p>
<p><a href="https://zettelkasten.de/posts/zettelkasten-building-blocks/">Read more...</a></p>
<h4><a href="#how-to-write-a-note-that-you-will-actually-understand--zettelkasten-method" aria-hidden="true" class="anchor" id="how-to-write-a-note-that-you-will-actually-understand--zettelkasten-method"></a><a href="https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/">How to Write a Note That You Will Actually Understand • Zettelkasten Method</a></h4>
<blockquote>
<p>Don’t just expect that you can understand yourself in a couple of years. At
least I had some difficulty to do so. Make it easy for your future self.</p>
</blockquote>
<p><a href="https://zettelkasten.de/posts/how-to-write-notes-you-can-understand/">Read more...</a></p>
<h3><a href="#code" aria-hidden="true" class="anchor" id="code"></a>Code</h3>
<h4><a href="#minimum-viable-phoenix" aria-hidden="true" class="anchor" id="minimum-viable-phoenix"></a><a href="http://www.petecorey.com/blog/2019/05/20/minimum-viable-phoenix/">Minimum Viable Phoenix</a></h4>
<blockquote>
<p>To build a better understanding of the framework and how all of its moving
pieces interact, let’s strip Phoenix down to its bare bones. Let’s start from
zero and slowly build up to a minimum viable Phoenix application.</p>
</blockquote>
<p>This was a very enjoyable code-along for those like me who are learning a
little about Phoenix.</p>
<p><a href="http://www.petecorey.com/blog/2019/05/20/minimum-viable-phoenix/">Read more...</a></p>
<h4><a href="#breaking-out-with-css-grid-layout" aria-hidden="true" class="anchor" id="breaking-out-with-css-grid-layout"></a><a href="https://cloudfour.com/thinks/breaking-out-with-css-grid-layout/">Breaking Out With CSS Grid Layout</a></h4>
<p>I read this while researching for the sidebar feature I wanted to add to the
blog... great guide although I'm trying to keep it simpler around here.</p>
<p><a href="https://cloudfour.com/thinks/breaking-out-with-css-grid-layout/">Read more...</a></p>
<h4><a href="#1995-was-the-most-important-year-for-the-web---the-history-of-the-web" aria-hidden="true" class="anchor" id="1995-was-the-most-important-year-for-the-web---the-history-of-the-web"></a><a href="https://thehistoryoftheweb.com/complete-history/1995-was-the-most-important-year-for-the-web/">1995 Was The Most Important Year For The Web - The History of the Web</a></h4>
<blockquote>
<p>Part 3 in an ongoing series about web history Chapter 1: First Things First, What is the Web? Chapter 2: How the Web Spread When No One Knew What it Was Chapter…</p>
</blockquote>
<p><a href="https://thehistoryoftheweb.com/complete-history/1995-was-the-most-important-year-for-the-web/">Read more...</a></p>
<h4><a href="#shape-up" aria-hidden="true" class="anchor" id="shape-up"></a><a href="https://basecamp.com/shapeup">SHAPE UP</a></h4>
<blockquote>
<p>This book is a guide to how we do product development at Basecamp. It’s also
a toolbox full of techniques that you can apply in your own way to your own
process.</p>
</blockquote>
<p>As is widely touted, basecamp published their development process. I'm sure
it's not a one size fits all, but it's an interesting artifact dedicated to
Doing Work Well.</p>
<p><a href="https://basecamp.com/shapeup">Read more...</a></p>
<h3><a href="#random" aria-hidden="true" class="anchor" id="random"></a>Random</h3>
<h4><a href="#one-month-without-a-smartphone" aria-hidden="true" class="anchor" id="one-month-without-a-smartphone"></a><a href="https://thefocuscourse.com/one-month-without-a-smartphone/">One Month Without a Smartphone</a></h4>
<blockquote>
<p>It took me a solid three weeks to truly not miss my smartphone.</p>
</blockquote>
<p>I think I will have to try this at some point.</p>
<p><a href="https://thefocuscourse.com/one-month-without-a-smartphone/">Read more...</a></p>
<h4><a href="#the-worst-workplace-distractions-arent-your-phone-email-or-social-media" aria-hidden="true" class="anchor" id="the-worst-workplace-distractions-arent-your-phone-email-or-social-media"></a><a href="https://chrisbowler.com/journal/real-workplace-distractions">The worst workplace distractions aren't your phone, email, or social media</a></h4>
<blockquote>
<p>According to Daniel Goleman, author of Focus: The Hidden Power of Excellence,
there are actually only two kinds of distraction:</p>
<ul>
<li>Sensory distractions (External). These are the things happening around us
like colleagues talking, phones ringing, people moving around us, music
playing, etc…</li>
<li>Emotional distractions (Internal). These are the thoughts that make our
attention drift from what we’re doing. For example, remembering a phone
call you need to return or thinking about an upcoming meeting.</li>
</ul>
</blockquote>
<p>H/T to <a href="https://chrisbowler.com/journal/real-workplace-distractions">Chris Bowler's
post</a>.</p>
<p><a href="https://chrisbowler.com/journal/real-workplace-distractions">Read more...</a></p>
<h4><a href="#one-month-with-a-dumbed-down-phone--chrisbowlercom" aria-hidden="true" class="anchor" id="one-month-with-a-dumbed-down-phone--chrisbowlercom"></a><a href="https://chrisbowler.com/journal/one-month-in">One month with a dumbed down phone • chrisbowler.com</a></h4>
<blockquote>
<p>It’s been one month since I turned my phone into a device that, for the most
part, does not give me any new content. No email, no social media, no RSS,
and not even any work communication. A few people have asked how it’s going.</p>
<p>In a word, lovely. Absolutely lovely.</p>
</blockquote>
<p><a href="https://chrisbowler.com/journal/one-month-in">Read more...</a></p>
<h4><a href="#how-to-restore-margin" aria-hidden="true" class="anchor" id="how-to-restore-margin"></a><a href="https://shawnblanc.net/2019/07/how-to-restore-margin/">How to Restore Margin</a></h4>
<blockquote>
<p>Margin is the space between our load and our limit. It’s the breathing room between that which we are capable of and that which we are responsible for.</p>
</blockquote>
<p>I am <em>so</em> excited to learn more about this and pretty sure that I want to
subscribe to this course. With each new responsibility of marriage, family,
home... the difficulty of claiming and protecting margin grows. Time to learn
the lesson while it is &quot;easy.&quot;</p>
<p><a href="https://shawnblanc.net/2019/07/how-to-restore-margin/">Read more...</a></p>
<h4><a href="#longhouse-level-3-gear-selection" aria-hidden="true" class="anchor" id="longhouse-level-3-gear-selection"></a><a href="https://www.youtube.com/watch?v=KAILdiF64W4&amp;list=PLaHEtpAYzpjIl0L_PnxEAoNgCnC6_RwGe&amp;index=4">longhouse: Level 3 Gear Selection</a></h4>
<p>HPG is one of my favorite outdoor brands... and as much as I have read and
thought about gear, this video still taught me some new ways of classifying
backpacking gear and ways to think about insulation.</p>
<p><a href="https://www.youtube.com/watch?v=KAILdiF64W4&amp;list=PLaHEtpAYzpjIl0L_PnxEAoNgCnC6_RwGe&amp;index=4">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Dark Mode Kitty and Neovim Using OSX&#39;s Toggle</title>
       <link>http://evantravers.com/articles/2019/07/30/toggling-kitty-and-neovim-background-using-osx-s-dark-mode-setting/</link>
       <pubDate>Tue, 30 Jul 2019 15:16:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/30/toggling-kitty-and-neovim-background-using-osx-s-dark-mode-setting/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/07/lightmode.png"></p><p>I've been seeking a good toggle for dark/light terminals for a <em>long</em> time.</p>
<p>I have been using a dodgy environment variable… and after fooling around with
the OSX dark/light toggle using an Alfred workflow I realized that I pretty
much either want the high contrast light or a lower contrast dark across the
whole computer.</p>
<p>After googling some stack overflow questions, I found a quick snippet that
checks to see whether dark mode is enabled... later I found a better way using
<code>defaults read -g AppleInterfaceStyle</code>, but it returns either &quot;Dark&quot; or an
error… some more googling revealed that I can use <code>2&gt;/dev/null</code> to dump the
error to nothingness and just match on &quot;Dark&quot;. It's much faster than the
javascript method I was using.</p>
<p>I just put an alias in a <code>.zshenv</code> file so that it's loaded and usable by
non-interactive shells. I then check it in my <code>.zshrc</code> and send a message to
<a href="https://sw.kovidgoyal.net/kitty/">Kitty</a> (my terminal of choice at the moment)
to load the right theme.</p>
<p>It doesn't update automatically, but it's close enough.</p>
<p>You can see the <a href="https://github.com/evantravers/dotfiles/compare/084d4737b4dcdd0877520dcc1ba4e02224e4bdd0...2f5a3d18274499970922752d39fc917e4bf0d39b">changes
here</a>.</p> ]]></description>
    </item>
    <item>
       <title>Quick Tip: Track Workouts Using Shortcuts</title>
       <link>http://evantravers.com/articles/2019/07/29/quick-tip-track-workouts-using-shortcuts/</link>
       <pubDate>Mon, 29 Jul 2019 15:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/29/quick-tip-track-workouts-using-shortcuts/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/07/quiz_steps.png"></p><video controls class="sidebar">
  <source src="https://images.evantravers.com/articles/2019/07/f3-quiz.mp4" type="video/mp4">
  I'm sorry, your browser doesn't support the video tag.
</video>
<p>In an effort to get better, (and because I like details,) I track my
<a href="https://www.withings.com/us/en/body-plus">weight</a>,
<a href="https://apps.apple.com/us/app/waterminder/id653031147">water</a>, and workouts.
(Taking suggestions on food/diet!)</p>
<p>I pretty much pipe everything into Apple Health for now… for simplicity I use
Strava for all workouts.</p>
<p>Some workout apps like <a href="https://apps.apple.com/us/app/trx/id949905528">TRX
Training</a> have Strava and Apple
Health integrations. Others like <a href="https://apps.apple.com/us/app/brute-force-wod/id1008711151">Brute
Force</a> or the
<a href="https://f3birmingham.com/">volunteer-led F3 group I've been attending</a> don't.</p>
<p>I've been using iOS Shortcuts to make the posting process easier and more
parseable if I eventually want to get data out of Strava. It looks something
like this.</p>
<ol>
<li>Ask some questions</li>
<li>Format the response</li>
<li>Copy to clipboard</li>
<li>Open Strava</li>
</ol>
<p>I'd like to be super fancy and write an action that auto-posts to Strava via
their API, but honestly this little action gets me 90% of the way there.</p>
<p>If you don't currently use Strava, or don't want to spread your data around,
you could replace the last step by logging the workout to Apple Health or by
<a href="https://www.youtube.com/watch?v=-4HSATi6abU">inserting a row in Airtable</a> or
Google Docs.</p> ]]></description>
    </item>
    <item>
       <title>Highlighting External Links Using CSS</title>
       <link>http://evantravers.com/articles/2019/07/16/highlighting-external-links-using-css/</link>
       <pubDate>Tue, 16 Jul 2019 01:47:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/16/highlighting-external-links-using-css/</guid>
       <description><![CDATA[ <p>I was talking with a coworker about a requirement to highlight links to
external site on our product. While we were talking, I started wondering if you
could achieve this just using a CSS change using pseudo-selectors... and after
a few seconds in <a href="http://codepen.io">codepen</a> I came up with this:</p>
<p>If a link's <code>href</code> attribute doesn't begin with a <code>/</code> (basically isn't an
relative link) then it assumes that the link is external and adds a cute link
emoji. 👍</p>
<pre class="lumis"><code class="language-css" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">a</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">not</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">(</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">[</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">href</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">^=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;/&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">]</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">)</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">after</span> <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lbrace;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">content</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">:</span> <span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;🔗&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">;</span>
</div><div class="line" data-line="3"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&rbrace;</span>
</div></code></pre>
<p>I'm not the first person to realize this... it seems like <a href="https://en.wikipedia.org/wiki/Help:External_link_icons">wikipedia has been
doing this for a while</a>
and David Walsh has a <a href="https://davidwalsh.name/external-links-css">great post on this with some nicer
rules</a>.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: June</title>
       <link>http://evantravers.com/articles/2019/07/01/books-and-links-june/</link>
       <pubDate>Mon, 01 Jul 2019 18:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/01/books-and-links-june/</guid>
       <description><![CDATA[ <p>Very busy month, filled with wonderful things... and distractions. God is good.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>Good month for books!</p>
<h3><a href="#titus-groan-by-mervyn-peake" aria-hidden="true" class="anchor" id="titus-groan-by-mervyn-peake"></a>Titus Groan by Mervyn Peake</h3>
<p>I picked this up because it is fairly constantly mentioned as inspirational for
other authors that I like. Intensely detailed and intricate it is definitely a
book for authors. Prose is dense and rich like deep cut Dickens, like Pickwick
Papers, insane like Lewis Carrol's Sylvia and Bruno, urbane like James Joyce's
Ulysses. It was a bit of a chore there at the end, but I'm glad of the
experience.</p>
<p>There are touches of brooding horror, but mostly in the urbanity and
inescapable claustrophobic reality the characters inhabit. It is like someone
looking too closely at the detail of an eye and getting grossed out because
they are looking so closely they can't see the beauty of the eye anymore. The
dense prose aids this.</p>
<p>It's weird.</p>
<h3><a href="#fall-by-neal-stephenson" aria-hidden="true" class="anchor" id="fall-by-neal-stephenson"></a>Fall by Neal Stephenson</h3>
<p>Content warning: Language and sexual content. (I skipped it.)</p>
<p>I have friends still reading this... so no spoilers. I devoured it over the
course of two days. <a href="/contact">Send me an email</a> if you want to know my
thoughts. It's a Neal Stephenson book... filled with details that send me on
research rabbitholes for weeks. The bits at the beginning about fake-news are
remarkably prescient and scary.</p>
<h3><a href="#the-road-back-to-you-by-ian-morgan-cron" aria-hidden="true" class="anchor" id="the-road-back-to-you-by-ian-morgan-cron"></a>The Road Back to You by Ian Morgan Cron</h3>
<p>This is an enneagram book.</p>
<p>The book promotes a duality between one's true nature (soul?) and personality…
it describes I guess personality as a sort of developed shield around your true
self, a set of programmed behavior, emotions, and responses to stress or
success. I think I can kind of get behind this idea because it means that you
are not a victim of your unchanging personality, you can choose to overcome
your weaknesses and be obedient to Christ... although the book doesn't frame
that in this way.</p>
<p>In the end, I found the enneagram a useful tool for discussion. The stories and
relationships between the numbers seem true-ish to my anecdotal evidence, and
at very least a useful starting point for understanding oneself. However, after
engaging with this particular book, I can see how it fits into the current
trend of &quot;spirtitual journey&quot; books... it promises growth and contentment, but
not by knowing Christ, but by merely knowing yourself. As someone who has been
down that road, there is no joy and contentment in truly knowing yourself, only
in being transformed to be like Christ.</p>
<p>I think that I was put off by the book claiming to think like me... and then
proceeding to not talk like me.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>Oh... I did read me some links this month.</p>
<h3><a href="#planck-constant" aria-hidden="true" class="anchor" id="planck-constant"></a><a href="http://thedarnedestthing.com/planck%20constant">planck constant</a></h3>
<p>I love tools and tool builders... and keyboards... it's a keyboard link.</p>
<p><a href="http://thedarnedestthing.com/planck%20constant">Read more...</a></p>
<h3><a href="#apple-is-listening--marcoorg" aria-hidden="true" class="anchor" id="apple-is-listening--marcoorg"></a><a href="https://marco.org/2019/06/09/apple-is-listening">Apple is Listening – Marco.org</a></h3>
<p>Interesting to consider in light of the (after this post) announcement of Jony
Ive's departure from Apple. I've been thinking about abandoning Apple entirely,
but maybe they'll swing back my way.</p>
<p><a href="https://marco.org/2019/06/09/apple-is-listening">Read more...</a></p>
<h3><a href="#micro-frontends" aria-hidden="true" class="anchor" id="micro-frontends"></a><a href="https://martinfowler.com/articles/micro-frontends.html">Micro Frontends</a></h3>
<p>Great discussion of the pros and cons of a methodology I'm thinking about alot.</p>
<p><a href="https://martinfowler.com/articles/micro-frontends.html">Read more...</a></p>
<h3><a href="#the-dumb-phone-i-already-own--chrisbowlercom" aria-hidden="true" class="anchor" id="the-dumb-phone-i-already-own--chrisbowlercom"></a><a href="https://chrisbowler.com/journal/my-dumb-phone">The dumb phone I already own • chrisbowler.com</a></h3>
<p>Great article... I have been slowly &quot;dumbing&quot; down my phone, but there's some
great suggestions here too.</p>
<p><a href="https://chrisbowler.com/journal/my-dumb-phone">Read more...</a></p>
<h3><a href="#ejecting-disqus" aria-hidden="true" class="anchor" id="ejecting-disqus"></a><a href="https://medium.com/remys-blog/ejecting-disqus-4120e9985823">Ejecting Disqus</a></h3>
<p>This was a timely read... I'm idly reading about commenting systems to
implement here (even though there are only about ten readers!) and I am not
sure which I want to use.</p>
<p><a href="https://medium.com/remys-blog/ejecting-disqus-4120e9985823">Read more...</a></p>
<h3><a href="#the-focus-course" aria-hidden="true" class="anchor" id="the-focus-course"></a><a href="https://thefocuscourse.com/yes-management/">The Focus Course</a></h3>
<blockquote>
<p>Saying no is your tool for creating time.</p>
</blockquote>
<p>Ooooh this is convicting for me.</p>
<p><a href="https://thefocuscourse.com/yes-management/">Read more...</a></p>
<h3><a href="#moving-the-needle" aria-hidden="true" class="anchor" id="moving-the-needle"></a><a href="https://www.macsparky.com/blog/2019/5/moving-the-needle">Moving the Needle</a></h3>
<blockquote>
<p>One of the most important questions to ask yourself at the end of each day
is, “How much time did I spend doing my most important work?” If we’re not
mindful of that question, too often, we fall short.</p>
</blockquote>
<p>Great blog post, and accompanying podcast episode. I'm still a baby on focus
and time tracking... but I'm probably going to try and incorporate something
like this soon.</p>
<p><a href="https://www.macsparky.com/blog/2019/5/moving-the-needle">Read more...</a></p>
<h3><a href="#who-is-watching-me---basic-surveillance-with-condition-grey--spotter-up" aria-hidden="true" class="anchor" id="who-is-watching-me---basic-surveillance-with-condition-grey--spotter-up"></a><a href="https://spotterup.com/who-is-watching-me-basic-surveillance-with-condition-grey/">Who is Watching Me? - Basic Surveillance with Condition Grey • Spotter Up</a></h3>
<blockquote>
<p>We as a species tend to try to fill in the blanks about a story or a picture
that has a lot of holes in it, and this alters our memories of details in
ways we can’t predict.</p>
</blockquote>
<p>This was a fascinating read, both from a psychology perspective... and a
paranoid.</p>
<p><a href="https://spotterup.com/who-is-watching-me-basic-surveillance-with-condition-grey/">Read more...</a></p>
<h3><a href="#frameworks-before-jquery---the-history-of-the-web" aria-hidden="true" class="anchor" id="frameworks-before-jquery---the-history-of-the-web"></a><a href="https://thehistoryoftheweb.com/frameworks-before-jquery/">Frameworks before jQuery - The History of the Web</a></h3>
<p>Compromises are hard.</p>
<p><a href="https://thehistoryoftheweb.com/frameworks-before-jquery/">Read more...</a></p>
<h3><a href="#toast" aria-hidden="true" class="anchor" id="toast"></a><a href="https://adactio.com/journal/15357">Toast</a></h3>
<p>Interesting... the titular toast is a web component rather than some warm
bread. I'm very concerned and interested into whether Google uses their
newfound near-monopoly power for good or evil.</p>
<p><a href="https://adactio.com/journal/15357">Read more...</a></p>
<h3><a href="#relearn-css-layout-every-layout" aria-hidden="true" class="anchor" id="relearn-css-layout-every-layout"></a><a href="https://every-layout.dev/">Relearn CSS layout: Every Layout</a></h3>
<p>This site is <em>awesome</em>... what a great design and very cool. I definitely
enjoyed reading through these great examples of common layouts.</p>
<p><a href="https://every-layout.dev/">Read more...</a></p>
<h3><a href="#rga-ripgrep-but-also-search-in-pdfs-e-books-office-documents-zip-targz-etc---phireskys-blog" aria-hidden="true" class="anchor" id="rga-ripgrep-but-also-search-in-pdfs-e-books-office-documents-zip-targz-etc---phireskys-blog"></a><a href="https://megalithic.io">rga: ripgrep, but also search in PDFs, E-Books, Office documents, zip, tar.gz, etc. - phiresky's blog</a></h3>
<p>My friend <a href="https://megalithic.io">@megalithic</a> sent this to me... he knows me
well. :P</p>
<p><a href="https://megalithic.io">Read more...</a></p>
<h3><a href="#the-lost-art-of-reading-books-and-resistance-in-a-troubled-time-by-david-l-ulin" aria-hidden="true" class="anchor" id="the-lost-art-of-reading-books-and-resistance-in-a-troubled-time-by-david-l-ulin"></a><a href="https://takeonrules.com/2019/06/23/the-lost-art-of-reading-books-and-resistance-in-a-troubled-time-by-david-l-ulin/">“The Lost Art of Reading: Books and Resistance in a Troubled Time” by David L. Ulin</a></h3>
<blockquote>
<p>As we race ever onward, chasing the cult of productivity and efficiency, we
must pause. Seek rest. A sprinter cannot keep sprinting. Our minds require
time. The faster the world moves by, the blurrier our understanding. To never
stop is to surrender a part of your humanity.</p>
</blockquote>
<p>Well said.</p>
<p><a href="https://takeonrules.com/2019/06/23/the-lost-art-of-reading-books-and-resistance-in-a-troubled-time-by-david-l-ulin/">Read more...</a></p>
<h3><a href="#taxonomy-and-drafts" aria-hidden="true" class="anchor" id="taxonomy-and-drafts"></a><a href="https://michaellaporta.com/home/taxonomyanddrafts">Taxonomy and Drafts</a></h3>
<blockquote>
<p>Light organizing seems reasonable. Light organizing never hurt anyone.
Chasing a grand unifying organizational theory that will perfectly structure
your digital life yet most certainly doesn’t actually exist seems a bit much.
Chasing taxonomy bliss might just ruin your life. Or at the very least keep
those novel pages unwritten.</p>
</blockquote>
<p><a href="https://michaellaporta.com/home/taxonomyanddrafts">Read more...</a></p>
<h3><a href="#the-new-guidelines-in-wcag-21-explained--alexander-skogberg" aria-hidden="true" class="anchor" id="the-new-guidelines-in-wcag-21-explained--alexander-skogberg"></a><a href="https://alexanderskogberg.com/2018/02/new-guidelines-wcag-2-1-explained/">The new guidelines in WCAG 2.1 explained | Alexander Skogberg</a></h3>
<p>Great overview resource for understanding what is coming.</p>
<p><a href="https://alexanderskogberg.com/2018/02/new-guidelines-wcag-2-1-explained/">Read more...</a></p>
<h3><a href="#the-cypherpunks-tapping-bitcoin-via-ham-radio" aria-hidden="true" class="anchor" id="the-cypherpunks-tapping-bitcoin-via-ham-radio"></a><a href="https://www.wired.com/story/cypherpunks-bitcoin-ham-radio/">The Cypherpunks Tapping Bitcoin via Ham Radio</a></h3>
<blockquote>
<p>Every six hours, at his home in the high desert outside Kingman, Arizona, midway between Phoenix and Las Vegas, Brian Goss downloads the latest blocks...</p>
</blockquote>
<p>It’s Neal Stephenson’s world. We just live in it.</p>
<p>(h/t to Aaron for the link)</p>
<p><a href="https://www.wired.com/story/cypherpunks-bitcoin-ham-radio/">Read more...</a></p>
<h3><a href="#thingy-a-things-parser-for-drafts-5" aria-hidden="true" class="anchor" id="thingy-a-things-parser-for-drafts-5"></a><a href="https://github.com/dansays/thingy/blob/master/README.md">Thingy: A Things Parser for Drafts 5</a></h3>
<p>This is probably the most featureful project template creator for Things... so
this is what I'm playing with.</p>
<p><a href="https://github.com/dansays/thingy/blob/master/README.md">Read more...</a></p>
<h3><a href="#how-im-preparing-to-write-100000-words-in-a-day" aria-hidden="true" class="anchor" id="how-im-preparing-to-write-100000-words-in-a-day"></a><a href="https://seanwes.com/2019/how-im-preparing-to-write-100000-words-in-a-day/">How I’m Preparing to Write 100,000 Words in a Day</a></h3>
<blockquote>
<p>On Monday, July 1st, 2019 at 5:00 AM CT, I will write 100,000 words in a day
and live stream the whole thing.</p>
</blockquote>
<p>This is an impressive endeavor. I am fascinated by the attention to detail in
the preparation, and intrigued by the end book.</p>
<p>I do wonder if Wes’s need for the Sabbatical stems from his habit of setting
incredibly voracious goals… like writing a draft in a day. It’s a different
balance than I try to set… although I wonder what my output would be if I did
set such goals.</p>
<p><a href="https://seanwes.com/2019/how-im-preparing-to-write-100000-words-in-a-day/">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>My World in Textfiles</title>
       <link>http://evantravers.com/articles/2019/07/01/my-world-in-textfiles/</link>
       <pubDate>Mon, 01 Jul 2019 17:08:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/07/01/my-world-in-textfiles/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/07/wiki_folder.png"></p><div class="admonition tldr">
<p>I homebrewed my own notes system using Drafts and Vimwiki.</p>
</div>
<p>There are many note taking applications. This one is mine.</p>
<p>For over ten years now, I've been managing a glob of .txt and .md files as the
main notes/context for my life. Over time, I've concluded that having my notes
in plaintext is important… I value the portability and flexibility.</p>
<p>For the longest time, the winning combination was
<a href="http://simplenote.com/">SimpleNote</a> on iPhone and <a href="http://brettterpstra.com/projects/nvalt/">Brett Terpstra's amazing
NValt</a>… Simplenote sync'd to NValt
via Simplenote's sync, and NValt also saved a copy to Dropbox. I think
eventually that was too troublesome due to frequent sync errors and
Simplenote's mobile app choking on large documents.</p>
<h2><a href="#the-problem" aria-hidden="true" class="anchor" id="the-problem"></a>The problem</h2>
<p>I have struggled to get a system that made sense on desktop <strong>and</strong> mobile. I'm
looking for…</p>
<ul>
<li>Markdown. Whatever app I use needs to speak markdown.</li>
<li>Search. I need to be able to quickly search and find file names and full-text
content.</li>
<li>Performant. I can't stand when the mobile app takes 15 seconds to load before
I can start typing. I also have a couple notes with 30k+ words. (Mostly typed
on my phone!) Most of the iPhone apps I've used become flip-books with files
this large.</li>
<li>Dropbox. I pay for this service, so I'd rather not another sync service to
the list. Many apps will let you open and save files to Dropbox, but won't
search or save to Dropbox by default. (Honestly though… I need to look at
iCloud's storage options.)</li>
<li>Vim. It's no surprise, <a href="/articles/tags/vim">I like Vim a lot</a>. I don't mind
using a traditional text editor to compose, but once I get into editing and
cleaning up a file, I start twitching without modal editing.</li>
</ul>
<p>When I need an app I usually consult <a href="http://thesweetsetup.com">The Sweet
Setup</a> and honestly they haven't been wrong. If you
don't care about Vim, I think their recommendations for <a href="http://bear.app">Bear</a>
and <a href="http://ulysses.app">Ulysses</a> are spot on. Bear is awesome, but I currently
need Dropbox. Ulysses is <em>incredible</em>, but a touch expensive for something I
would mainly use on my phone for writing. (If I didn't have the Vim
requirement, I'd absolutely be writing a blog post about Ulysses. It's that
awesome.)</p>
<p><em>If you don't care about using Vim on the desktop</em>, you should look at the
<a href="https://thesweetsetup.com/apps/the-best-note-taking-apps-for-ios/">Sweet Setup's
list</a>.
However, if you do care…</p>
<h2><a href="#the-current-solution-vimwiki--draftsapp" aria-hidden="true" class="anchor" id="the-current-solution-vimwiki--draftsapp"></a>The (current) solution: Vimwiki + drafts.app</h2>
<h3><a href="#vimwiki" aria-hidden="true" class="anchor" id="vimwiki"></a>Vimwiki</h3>
<p>I'm jealous of <a href="https://orgmode.org/">org-mode</a>, ok?</p>
<p>Some time ago, I started experimenting with
<a href="https://github.com/Vimwiki/Vimwiki">Vimwiki</a> as a note taking tool on my
laptop. Vimwiki on desktop answers <em>all</em> my needs as listed above… and when I
am writing code, I am always one keystroke away from all my notes and context.</p>
<p>While I no longer <a href="https://www.dailydrip.com/blog/vimwiki">use it as a task
manager</a>, I still like the diary
feature and the linking. I use it daily at work as a personal network of links
and resources and artifacts related to ongoing projects and to store
documentation in Markdown format.</p>
<p>Vimwiki is really two things… a set of folders and conventions for naming
files, and a vim plugin that interfaces with those folders and filename
conventions with handy shortcuts.</p>
<p>There is not really a mobile app that would work for Vimwiki… but I am sort of
hacking it using Drafts.app.</p>
<h3><a href="#draftsapp" aria-hidden="true" class="anchor" id="draftsapp"></a>Drafts.app</h3>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/07/dropbox_action.png" alt="">
</figure>
<p><a href="http://getdrafts.com/">Drafts</a> is a <em>wonderful</em> app. There is a <a href="https://www.macstories.net/reviews/drafts-5-the-macstories-review/">much better
overview on
macstories</a>,
but in short: Drafts focuses on capturing plain text in the moment, then allows
you to process that text at the appropriate time using customizable actions.</p>
<p>A series of customizable actions allow me to put text from my phone into the
Vimwiki set of folders and filename conventions… this is all still a work in
progress.</p>
<p>I started with a simple custom Action to save the current draft to my Vimwiki
diary. It's pretty simple. It's a Drafts Action with one Dropbox step:</p>
<p>That is it! Just add to a file with the right file name. If it already exists,
append. Very simple.</p>
<p>Until it's not.</p>
<p>While this allows me to get text into just one part of my wiki, it doesn't
answer ALL THE THINGS.</p>
<p>I started down a perilous path trying to emulate every major feature that I
want out of Drafts... and after a week of madness I realized that I do more
composing than reading on my phone. All I need to do is put the text where it
needs to go 80% of the time.</p>
<h3><a href="#the-bleeding-edge-magic-wiki" aria-hidden="true" class="anchor" id="the-bleeding-edge-magic-wiki"></a>The Bleeding Edge: Magic Wiki</h3>
<p><img src="https://media.giphy.com/media/12NUbkX6p4xOO4/giphy.gif" alt="magic gif" /></p>
<p>You've made it this far? Good grief.</p>
<p>When I'm writing text on my phone, I'm usually drafting text for a single
one-time message. (sms, email, etc.) This <em>is</em> the Drafts core use case. It's
super good at this right out of the box. No complaints.</p>
<p>I also do a few other things regularly:</p>
<ul>
<li>Jotting down a thought on a book I'm reading.</li>
<li>Logging/journaling a moment in time.</li>
<li>Take a fragment of notes on a meeting for later.</li>
<li>Compose/draft a blogpost.</li>
<li>Writing a fragment of a thought that probably needs to be filed near some
topic.</li>
</ul>
<p>With this thought in mind... I recently set up some <a href="https://getdrafts.com/drafts/workspaces">custom
workspaces</a> in Drafts:</p>
<h4><a href="#workspaces" aria-hidden="true" class="anchor" id="workspaces"></a>Workspaces</h4>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/07/workspaces.jpg" alt="workspaces">
</figure>
<p>These are all driven by tags. I can either add them to a new draft manually...
although for some of them (like meeting especially) I've taken to using an iOS
Shortcuts workflow to building the draft.</p>
<p>It's easy to think of these as folders... but they are more like contexts in
the strict GTD sense. The streams don't cross. A draft isn't both a booknote
and a meeting note. This just makes finding what I'm working on a lot easier,
especially as most of my actions archive after it's completed.</p>
<p>I also built a simple iOS Shortcut for meeting notes. it lets me choose a
recent calendar event, pulls some pertinent details out, gets a template file
from Drafts, and inserts the event details into the template and tags it
properly. That means if I have a useful meeting with some notes, I can always
generate a properly formatted, properly tagged draft for it.</p>
<p>(I'm pretty excited about this!)</p>
<h4><a href="#action" aria-hidden="true" class="anchor" id="action"></a>Action</h4>
<p>I built a custom Action in Drafts to file these different needs out of Drafts
into my organization system in Vimwiki.</p>
<script src="https://gist.github.com/evantravers/a0ff7e2950dfdf035c135587886d4fd2.js"></script>
<p>It uses the same tags as my workspaces to categorize and file any draft that I
have in place. If it's a meeting, it saves it to my vimwiki diary. If it's a
booknote, it saves it in the right location. (I have other custom Drafts
actions to build up a booknote... that's a <em>whole</em> other blog post!)</p>
<h4><a href="#getting-text-into-the-wiki-topics-inboxes" aria-hidden="true" class="anchor" id="getting-text-into-the-wiki-topics-inboxes"></a>Getting text into the wiki topics: inboxes</h4>
<p>If you've been following along, I've covered every one of my use cases except
one: the fragment or thought that needs to be filed somewhere in the wiki's
linked structure as part of a topic.</p>
<p>Zettelkasten is a note taking strategy <a href="https://zettelkasten.de/posts/when-start-new-note/">I've been reading
about</a>. I really like what
I've read so far, and it maps well to what I'm doing.</p>
<p>I've decided to start using the diary as a sort of inbox… entries that don't
have a title show up in vimwiki's diary index as just a date. Anything without
a title is a candidate for either moving into its own page in the wiki or for
naming for better searchability in the future. I don't need to be doing that on
my phone... it's sufficient to periodically groom the diary on the desktop and
place content where it needs to go.</p>
<h2><a href="#nothing-is-perfect" aria-hidden="true" class="anchor" id="nothing-is-perfect"></a>Nothing is perfect…</h2>
<p>I still haven't figured it all out, and I never will. Here's the problems with
which I'm wrestling:</p>
<h3><a href="#generating-indexes" aria-hidden="true" class="anchor" id="generating-indexes"></a>Generating Indexes</h3>
<p>Wikis depend on links. Zettelkasten as a strategy relies heavily on links,
tags, and indexes. Links are manually created… but it's also nice to have an
index of related pages.</p>
<p>Vimwiki has the ability to generate an index on command… and is <a href="https://github.com/Vimwiki/Vimwiki/pull/635">getting the
ability to automatically regenerate the index on file
save</a>. It's not stable for me yet
(might be because I'm using markdown rather than the wiki syntax) and it will
never work on mobile, but it'll do for now.</p>
<p>For now, I can periodically manually rebuild an index based on a tag or folder
to keep my wiki organized. That's enough.</p>
<h3><a href="#search" aria-hidden="true" class="anchor" id="search"></a>Search</h3>
<p>I didn't have a good path for search and opening… until while writing this
Dropbox raised the price on me and added fulltext search. It works on mobile
and desktop, and is robust enough for most mobile searching needs.</p>
<p>On desktop, I have a host of awesome text search tools including <code>rg</code>, <code>fd</code> or
just MacOS Spotlight.</p>
<h3><a href="#images" aria-hidden="true" class="anchor" id="images"></a>Images</h3>
<p>I still don't have a good answer for this. I'm guessing/hoping that with new
updates to iOS shortcuts, I'll be able to upload images to dropbox and drop a
link back into a draft.</p>
<p>On desktop, I merely put it in a folder and make a relative link manually. It
hasn't been too big of an issue so far.</p>
<h2><a href="#all-the-above-is-overthinking-it" aria-hidden="true" class="anchor" id="all-the-above-is-overthinking-it"></a>All the above is overthinking it.</h2>
<p><strong>Don't copy my setup blindly.</strong></p>
<p>I'm solving my particular problems with my particular uses. I write a lot on my
phone, and research more on my desktop. That's <em>backwards</em> from how I used to
be five years ago. Unless your needs align perfectly with mine, you should
consider what you actually need.</p>
<p>I've been working on this post for too long. I'm sure it'll go through some
changes, there's a changelog at the bottom of the page.</p>
<p>If you have any thoughts or questions, feel free to <a href="/contact">reach out</a>!</p>
<h2><a href="#references-and-links" aria-hidden="true" class="anchor" id="references-and-links"></a>References and Links</h2>
<ul>
<li>
<p><a href="https://github.com/evantravers/dotfiles/blob/8251900de2a709ddc884dd51942426ce829cf3c4/nvim/.config/nvim/init.vim#L217-L231">My current Vimwiki config</a></p>
</li>
<li>
<p><a href="https://leancrew.com/all-this/2019/05/drafts-and-dropbox-redux/">Dr. Drang's amazingly useful save/reload from dropbox Drafts actions</a><br />
I use this exact Action as part of my Magic Wiki Action. Very handy for when
I know exactly where I want to put a file.</p>
</li>
<li>
<p><a href="https://zettelkasten.de/posts/overview/">Zettelkasten</a><br />
I've been curious and reading more about this… worth a look.</p>
</li>
<li>
<p><a href="https://michaellaporta.com/home/taxonomyanddrafts">Taxonomy and Drafts</a><br />
This article makes me seem concise… but does have some great thoughts about
the difficulty of grappling with Drafts workspaces. Are they folders? Are
they searches? (Hint, they are smart contexts.)</p>
</li>
<li>
<p><a href="https://gist.github.com/a0ff7e2950dfdf035c135587886d4fd2">The source of my Magic Wiki action</a></p>
</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Minimal iOS Homescreen 2019</title>
       <link>http://evantravers.com/articles/2019/06/03/minimal-ios-homescreen-2019/</link>
       <pubDate>Mon, 03 Jun 2019 21:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/06/03/minimal-ios-homescreen-2019/</guid>
       <description><![CDATA[ <p>Like most, I'm becoming more aware of how my phone sucks my life away. I
started thinking about what would be a
<a href="https://en.wikipedia.org/wiki/Spherical_cow">spherical-cow</a> optimal phone
usage: You never get interrupted until it is necessary. You push one button and
respond to the question or problem and you put your phone back down.</p>
<p>So inspired by a podcast, I'm trying to build my iPhone into that optimal
phone… or 90% of the way there.</p>
<h2><a href="#my-current-home-screen" aria-hidden="true" class="anchor" id="my-current-home-screen"></a>My current home screen</h2>
<figure class="sidebar"><img src="https://images.evantravers.com/articles/2019/06/homescreen.png" alt=""></figure>
<p>I've shamelessly stolen this idea from from <a href="https://www.relay.fm/cortex/75">CGPgrey's
homescreen</a>, his looks like
<a href="https://relayfm.s3.amazonaws.com/assets/Cortex/Episode%20075/Grey%20Home%20Screen%2075.jpeg">this</a>.</p>
<p>Here's the basic theory:</p>
<ul>
<li>Contextual actions instead of apps.</li>
<li>Grouping notifications into folders.</li>
<li>Do one thing, put the phone down.</li>
</ul>
<p>The first screen is just these apps in the dock. They are all chosen because
they are apps I use to act immediately, and process later.</p>
<p><a href="http://getdrafts.com/">Drafts</a> is where all text starts on my phone. Texts,
emails, blogposts (like this one!) usually start from this wonderful app.</p>
<p><a href="http://contrast.co">Launch Center Pro</a> is a customizable dashboard for all my
applications and Apple Shortcuts.</p>
<p><a href="http://culturedcode.com/things">Things 3</a> is where all my tasks and priorities
live. I use the quick add functionality (deep press on the icon or use siri)
constantly.</p>
<p><a href="http://timeryapp.com">Timery</a> is a time tracking via
<a href="http://toggl.com">toggl</a>, will likely be hooked into shortcuts in Launch
Center Pro.</p>
<p>Because all my apps are deep linked in Launch Center Pro, I can send a message
or scan a document without hunting through pages of notifications and
distractions.</p>
<p>I've organized the actions in Launch Center Pro by context… so I find myself
asking less &quot;what app can do this for me?&quot; and more &quot;what am I doing?&quot; I've got
a working out group, with the three apps I use, and deep links to the Spotify
playlists I use while running or lifting.</p>
<h2><a href="#notifications-and-everything-else" aria-hidden="true" class="anchor" id="notifications-and-everything-else"></a>Notifications and Everything Else</h2>
<figure class="sidebar"><img src="https://images.evantravers.com/articles/2019/06/notifications.png" alt=""></figure>
<p>All the other apps else gets pulled up into these folders on the last page. By
deep pressing on a folder, I can see what app spawned the little red dot and
jump to it. I group apps be context or responsibility, like financial apps or
apps related to my work.</p>
<p>I don't often dive into the folders to find apps, I usually use Spotlight to
find them.</p>
<p>By optimizing and changing your notification settings, you can set your apps to
only put notifications in your Notification Center about what's important. I
had to tweak some settings on email or calendar apps to make this workable for
me. Still tweaking.</p>
<p>Just because all that is hidden on the next page, and I rarely see them because
most of my work is done in one swipe in Launch Center Pro, it has dramatically
changing my phone usage over the last month. Even as small a thing as having a
shortcut to message my wife, which is the main thing I do in Messages, has
saved me time and focus. I'm sure it's going to evolve, (primarily in time
tracking shortcuts,) but I've gained enough productivity and writing/reading
time back that I think it's going to stick.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: May</title>
       <link>http://evantravers.com/articles/2019/06/01/books-and-links-may/</link>
       <pubDate>Sat, 01 Jun 2019 02:56:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/06/01/books-and-links-may/</guid>
       <description><![CDATA[ <p>This month has been very busy... and I'm afraid I've fallen victim to spending
more of my time on Factorio or other distractions. Life is full of balls in the
air... Lord willing it'll slow down as the summer progresses.  I'm currently in
the middle of... four books? I really need to double down on just one.</p>
<h3><a href="#frameworking" aria-hidden="true" class="anchor" id="frameworking"></a><a href="https://adactio.com/journal/15111">Frameworking</a></h3>
<blockquote>
<p>Alas, I’ve seen many, many framework-driven sites that are most definitely
not that operating at that scale. Trys speaks the honest truth here:</p>
</blockquote>
<blockquote>
<blockquote>
<p>We kid ourselves into thinking we’re building groundbreakingly complex
systems that require bleeding-edge tools, but in reality, much of what we
build is a way to render two things: a list, and a single item. Here are
some users, here is a user. Here are your contacts, here are your messages
with that contact. There ain’t much more to it than that.</p>
</blockquote>
</blockquote>
<p>More wisdom from Jeremy Keith.</p>
<p><a href="https://adactio.com/journal/15111">Read more...</a></p>
<h3><a href="#the-reinvention-of-birmingham-alabama" aria-hidden="true" class="anchor" id="the-reinvention-of-birmingham-alabama"></a><a href="https://www.cntraveler.com/story/the-reinvention-of-birmingham-alabama">The Reinvention of Birmingham, Alabama</a></h3>
<p>I love the city I grew up in... and it's only getting better. HT to Ed Hart for
the link.</p>
<p><a href="https://www.cntraveler.com/story/the-reinvention-of-birmingham-alabama">Read more...</a></p>
<h3><a href="#moving-toward-a-gender-equitable-internet" aria-hidden="true" class="anchor" id="moving-toward-a-gender-equitable-internet"></a><a href="https://www.blog.google/technology/next-billion-users/towards-gender-equity-online/">Moving toward a gender equitable internet</a></h3>
<blockquote>
<p>Online services tend to be designed with “one device, one user” in mind, but
this principle doesn’t hold true for all women. Many women that we spoke to
share their devices with family members.</p>
</blockquote>
<p>Super fascinating insight.</p>
<p><a href="https://www.blog.google/technology/next-billion-users/towards-gender-equity-online/">Read more...</a></p>
<h3><a href="#turbotax-deliberately-hides-its-free-file-page-from-search-engines--propublica" aria-hidden="true" class="anchor" id="turbotax-deliberately-hides-its-free-file-page-from-search-engines--propublica"></a><a href="https://www.propublica.org/article/turbotax-deliberately-hides-its-free-file-page-from-search-engines">TurboTax Deliberately Hides Its Free File Page From Search Engines — ProPublica</a></h3>
<p>That's... really shady.</p>
<p><a href="https://www.propublica.org/article/turbotax-deliberately-hides-its-free-file-page-from-search-engines">Read more...</a></p>
<h3><a href="#nothing-fails-like-success" aria-hidden="true" class="anchor" id="nothing-fails-like-success"></a><a href="https://alistapart.com/article/nothing-fails-like-success/">Nothing Fails Like Success</a></h3>
<blockquote>
<p>A family buys a house they can’t afford. They can’t make their monthly
mortgage payments, so they borrow money from the Mob. Now they’re in debt to
the bank and the Mob, live in fear of losing their home, and must do whatever
their creditors tell them to do.</p>
<p>Welcome to the internet, 2019.</p>
</blockquote>
<p>Interesting perspective. I think I agree. I certainly have been feeling a lot
more joy working on my personal website than any social network in a long time.</p>
<blockquote>
<p>It’s too late for current internet businesses (victims of their own success)
that are mortgaged to the hilt in investor gelt. But could the next
generation of internet startups learn from older, stable companies like
Basecamp, and design products that pay for themselves via customer
income—products that profit slowly and sustainably, allowing them to scale up
in a similarly slow, sustainable fashion?</p>
</blockquote>
<p><a href="https://alistapart.com/article/nothing-fails-like-success/">Read more...</a></p>
<h3><a href="#itemizing-responsibilities" aria-hidden="true" class="anchor" id="itemizing-responsibilities"></a><a href="https://daverupert.com/2019/05/itemizing-responsibilities/">Itemizing Responsibilities</a></h3>
<p>Awesome idea for quantifying and understanding the weight of &quot;adulting.&quot;</p>
<blockquote>
<p>It’s a bit obsessive and trite but quantifying what I need to be thinking
about on a daily, weekly, monthly, quarterly, and annual basis has helped my
brain immensely. My 5-column board gives me a 10,000 foot view of everything
I need to get done to feel like a responsible adult. It’s still early days
but I’m pleased with the results thus far and have begun offloading more
parts of my brain into Notion.</p>
</blockquote>
<p>(I'm not a <a href="https://www.notion.so">Notion</a> subscriber, but I think that I'll
probably try this in my bullet journal as a start.)</p>
<p><a href="https://daverupert.com/2019/05/itemizing-responsibilities/">Read more...</a></p>
<h3><a href="#1960-the-year-the-singularity-was-cancelled" aria-hidden="true" class="anchor" id="1960-the-year-the-singularity-was-cancelled"></a><a href="https://slatestarcodex.com/2019/04/22/1960-the-year-the-singularity-was-cancelled/">1960: The Year The Singularity Was Cancelled</a></h3>
<blockquote>
<p>To review: population growth increases technological growth, which feeds back
into the population growth rate in a cycle that reaches infinity in finite
time.</p>
<p>But since population can’t grow infinitely fast, this pattern breaks off
after a while.</p>
<p>The Industrial Revolution tried hard to compensate for the “missing”
population; it invented machines. Using machines, an individual could do an
increasing amount of work. We can imagine making eg tractors as an attempt to
increase the effective population faster than the human uterus can manage. It
partly worked.</p>
<p>But the industrial growth mode had one major disadvantage over the Malthusian
mode: tractors can’t invent things. The population wasn’t just there to grow
the population, it was there to increase the rate of technological advance
and thus population growth. When we shifted (in part) from making people to
making tractors, that process broke down, and growth (in people and tractors)
became sub-hyperbolic.</p>
</blockquote>
<p>As usual with SSC, fascinating ideas from a different worldview... I don't
always agree but I'm always fascinated.</p>
<p><a href="https://slatestarcodex.com/2019/04/22/1960-the-year-the-singularity-was-cancelled/">Read more...</a></p>
<h3><a href="#when-i-sit-down-at-my-editor-i-feel-relaxed" aria-hidden="true" class="anchor" id="when-i-sit-down-at-my-editor-i-feel-relaxed"></a><a href="http://px16.matt.is/">When I Sit Down At My Editor, I Feel Relaxed</a></h3>
<blockquote>
<p>We have covered a number of practical efforts to reduce the incidental
complexity of a programming environment, and to make the editing experience
more direct, adaptive to context, and intuitive. The efforts are incomplete,
but feel promising: I hope they might provoke interesting critique, debate,
and further work. I would now like to conclude with a short note about why
work in this field might matter.</p>
</blockquote>
<p>This is an interesting &quot;editor&quot; experiment, similar to
<a href="http://lighttable.com/">http://lighttable.com/</a> and the work of
<a href="http://worrydream.com/">worrydream</a>.</p>
<p>I must admit, I liked it partly because of the interesting ideas, but mostly
because I adore having the footnotes on the side column as a commentary to the
essay, and I want to steal it for this blog. :P</p>
<p><a href="http://px16.matt.is/">Read more...</a></p>
<h3><a href="#how-to-deliver-constructive-feedback-in-difficult-situations" aria-hidden="true" class="anchor" id="how-to-deliver-constructive-feedback-in-difficult-situations"></a><a href="https://medium.com/s/please-advise/the-essential-guide-to-difficult-conversations-41f736e63ccf">How to Deliver Constructive Feedback in Difficult Situations</a></h3>
<blockquote>
<p>I was guilty of making excuses: It will sort itself out; they’ll eventually
stop doing it; there are more important things to focus on. Of course,
delaying these conversations always made things worse. And, sometimes, it
even led to crises.</p>
</blockquote>
<p>Great article, contains some excellent practical advice, like this:</p>
<blockquote>
<p>Our brains are hardwired to take raw information and instantly create simple
stories to explain them — good or bad, right or wrong, hero or villain. These
stories are evaluations, and they are very hard to separate from
observations. Here are a few examples to illustrate the difference:</p>
<ul>
<li>Evaluation: “You are lazy” (which is a character attack). Observation: “You
said that you’d send the document last week, and I haven’t received it.”</li>
<li>Evaluation: “Your work is sloppy” (which is a criticism). Observation:
“Three of the numbers in the report were inaccurate.”</li>
<li>Evaluation: “You’re always late,” (which is a generalization). Observation:
“You arrived 10 minutes late to the meeting this morning.”</li>
<li>Evaluation: “You ignored me.” (which implies intent). Observation: “I sent
you two emails, and I haven’t received a response.”</li>
</ul>
</blockquote>
<p><a href="https://medium.com/s/please-advise/the-essential-guide-to-difficult-conversations-41f736e63ccf">Read more...</a></p>
<h3><a href="#perspective--alexa-has-been-eavesdropping-on-you-this-whole-time" aria-hidden="true" class="anchor" id="perspective--alexa-has-been-eavesdropping-on-you-this-whole-time"></a><a href="https://www.washingtonpost.com/technology/2019/05/06/alexa-has-been-eavesdropping-you-this-whole-time/">Perspective | Alexa has been eavesdropping on you this whole time</a></h3>
<blockquote>
<p>Would you let a stranger eavesdrop in your home and keep the recordings? For
most people, the answer is, “Are you crazy?” Yet that’s essentially what
Amazon has been doing…</p>
</blockquote>
<blockquote>
<p>I listened to four years of my Alexa archive and found thousands of fragments
of my life: spaghetti-timer requests, joking houseguests and random snippets
of “Downton Abbey.” There were even sensitive conversations that somehow
triggered Alexa’s “wake word” to start recording, including my family
discussing medication and a friend conducting a business deal.</p>
<p>You can listen to your own Alexa archive
<a href="http://www.amazon.com/alexaprivacy">here</a>. Let me know what you unearth.</p>
</blockquote>
<p>It’s not unusual or illegal… but you should consider this.</p>
<p><a href="https://www.washingtonpost.com/technology/2019/05/06/alexa-has-been-eavesdropping-you-this-whole-time/">Read more...</a></p>
<h3><a href="#wikipedialist-of-hoaxes-on-wikipedia---wikipedia-the-free-encyclopedia" aria-hidden="true" class="anchor" id="wikipedialist-of-hoaxes-on-wikipedia---wikipedia-the-free-encyclopedia"></a><a href="https://en.wikipedia.org/wiki/Wikipedia:List_of_hoaxes_on_Wikipedia">Wikipedia:List of hoaxes on Wikipedia - Wikipedia, the free encyclopedia</a></h3>
<p>I've long maintained a folder of weird pages on wikipedia... I thought I'd
start posting some of the odder ones. This is just what you think it is... a
list of all the lying pages that have ever been on wikipedia.</p>
<p>There's a reason it has to begin with a plead to not make any more... people
are just going to keep doing it.</p>
<p><a href="https://en.wikipedia.org/wiki/Wikipedia:List_of_hoaxes_on_Wikipedia">Read more...</a></p>
<h3><a href="#how-the-web-spread-when-no-one-knew-what-it-was---the-history-of-the-web" aria-hidden="true" class="anchor" id="how-the-web-spread-when-no-one-knew-what-it-was---the-history-of-the-web"></a><a href="https://thehistoryoftheweb.com/complete-history/how-the-web-spread-when-no-one-knew-what-it-was/">How the Web Spread When No One Knew What It Was - The History of the Web</a></h3>
<blockquote>
<p>How did the web spread? Little by little, person to person. On mailing lists
and in hallway conversations at conferences and on BBS boards and elsewhere
in what was already a great digital abyss. The web enabled computers to
connect to other computers but it is, and has always been, people all the way
down. People loved the web, so people spread the web.</p>
</blockquote>
<blockquote>
<p>But it wasn’t always that way.</p>
</blockquote>
<p><a href="https://thehistoryoftheweb.com/complete-history/how-the-web-spread-when-no-one-knew-what-it-was/">Read more...</a></p>
<h3><a href="#why-all-eyes-are-on-billie-eilish-the-new-model-for-streaming-era-success" aria-hidden="true" class="anchor" id="why-all-eyes-are-on-billie-eilish-the-new-model-for-streaming-era-success"></a><a href="https://www.billboard.com/articles/columns/pop/8510552/billie-eilish-billboard-cover-story-2019">Why All Eyes Are on Billie Eilish, the New Model for Streaming Era Success</a></h3>
<p>Content warning: Strong language.</p>
<p>I'm still trying to figure this out... is she an artfully contrived art-piece,
an intentional zeitgeist to capture teenaged angst and transform victims into a
power fantasy, or is she a genuinely brilliant artist who has the power to
preach and nerve to seize the day before she's old enough to drive?</p>
<p>Either way, she stands in a long line of female power pop-stars that are
capturing hearts and defining a generation, and if only for worldview analysis
we should listen and try to understand.</p>
<blockquote>
<p>“[My music] is about comfort, and it’s about ‘I know how you are feeling, and
you are not alone,’ ” says Eilish. With the press of a button, she can
connect with her 21.3 million Instagram followers. But a quick scan of her
account -- where Eilish’s unfiltered photos reflect the current “I am who I
am” approach preferred over perfectly posed shots -- offers no evidence that
she just played Coachella, the social media content magnet of festivals.</p>
</blockquote>
<p>The weird nature of trying to be a total artist in a world of algorithmic
playlists and timelines is explored a little bit:</p>
<blockquote>
<p>When Spotify first featured “Ocean Eyes” on its New Music Friday playlist,
the song didn’t resonate like hip-hop did at the time. But the metrics, says
Spotify head of global genre groups Mike Biggane, called to mind Post Malone,
whose core fans drove his engagement on the platform before his mainstream
breakthrough with “rockstar.” When “Lovely” with Khalid dropped, Eilish’s
whole catalog exploded. “This is what true reactivity looks like in an
attention economy,” says Biggane. “She’s always focused on her core fan base.
Credit’s due to her team for maximizing opportunity as her audience
developed.”</p>
</blockquote>
<p><a href="https://www.billboard.com/articles/columns/pop/8510552/billie-eilish-billboard-cover-story-2019">Read more...</a></p>
<h3><a href="#the-web-is-a-customer-service-medium-ftraincom" aria-hidden="true" class="anchor" id="the-web-is-a-customer-service-medium-ftraincom"></a><a href="https://ftrain.com/wwic">The Web Is a Customer Service Medium (Ftrain.com)</a></h3>
<blockquote>
<p>“Why wasn't I consulted,” which I abbreviate as WWIC, is the fundamental
question of the web. It is the rule from which other rules are derived.
Humans have a fundamental need to be consulted, engaged, to exercise their
knowledge (and thus power), and no other medium that came before has been
able to tap into that as effectively.</p>
</blockquote>
<p>&quot;Why wasn't I consulted&quot; could be only part of the equation... &quot;I would never
have done it like that&quot; seems to be a close second. I feel like the author is
narrowing down on saying that humanity is prideful as a whole...</p>
<blockquote>
<blockquote>
<p>What makes MetaFilter a success?</p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<p>Matt: I'd like to think it's intense moderation and customer service.</p>
</blockquote>
</blockquote>
<blockquote>
<p>That is the point that I am trying to make. The web is not, despite the
desires of so many, a publishing medium. The web is a customer service
medium. “Intense moderation” in a customer service medium is what “editing”
was for publishing.</p>
</blockquote>
<p>Good stuff. HT to Christian Crumlish for the link.</p>
<p><a href="https://ftrain.com/wwic">Read more...</a></p>
<h3><a href="#the-tim-ferriss-show-transcripts-adam-savage-370" aria-hidden="true" class="anchor" id="the-tim-ferriss-show-transcripts-adam-savage-370"></a><a href="https://tim.blog/2019/05/08/the-tim-ferriss-show-transcripts-adam-savage-370/">The Tim Ferriss Show Transcripts: Adam Savage (#370)</a></h3>
<p>Content warning: strong language</p>
<p>As is usual with this podcast, some really wonderful moments of clarity and
wisdom, such as this gem around finding a career path:</p>
<blockquote>
<p>I got very quickly that there was a fundamental difference between their
drive to study the thing and my desire to be a thing.</p>
</blockquote>
<p>Also on drive:</p>
<blockquote>
<p>“Your problem,” he said, “is you have talent, but no ambition.” I go,
“Really?” And he goes, “Yeah. If you had ambition, you wouldn’t be talking to
me. You’d be saying, ‘I’m sorry, Mr. George Lucas, I can’t make that by
Tuesday.'”</p>
</blockquote>
<blockquote>
<p>And he really was totally correct. This was a guy who had been born and
raised in Manhattan, and the thing that I now understand is that Manhattan is
an amazing city if you know what you want out of Manhattan. It is a place
built on and for ambition, and the people who get their work out and get seen
in Manhattan have busted their a-- to do it because it’s the singular focus
in their life.</p>
</blockquote>
<p>Later, about realizing that working for a living was as fulfilling as art:</p>
<blockquote>
<p>“I get this. I get that this work for commerce is satisfying the emotional
and aesthetic need I have to explore this type of problem solving I was
exploring in my art, and now I can point all of that towards this career, and
I am steadfastly never going to say ‘I used to be an artist.’ Because it is
the same mechanism.” [...]</p>
<p>[...] I think most importantly I didn’t consider it a loss of a purity. To
take that energy and point it towards something that had to do with commerce,
because I also saw that the commerce was feeding me. That this was a thing I
could call a career, and hells bells, if it gave me the same kind of output
thrill as making art, screw it. Let’s totally go towards this. Let’s see
where it leads.</p>
</blockquote>
<p>On failure and learning to “fail fast,” some excellent insight:</p>
<blockquote>
<p>What we really mean when we say failure is we mean iteration. We mean the
creative process is messy and it’s iterative and you have to chase up a lot
of wrong branches in order to get to the right one. And you’re never going to
end up where you think you’re going to end up. And while some people may
think that that’s failure, a true creator knows that you follow the thing to
where it’s going, not to where you think it ought to go</p>
</blockquote>
<p>There's also some <em>wonderful</em> discussion of the mindset of creation:</p>
<blockquote>
<p>Savage: So at the beginning, [..] the mental process you’re going to go
through is going to be one of a constant gear switching, from the macro to
the micro. [...] It’ll be this kind of constant back and forth.</p>
<p>For me, after all the years of experience that I have, it’s a very different
mental process. I look around and I see the wall (project he's working on) as
a set of like — I’m instantly translating it as a set of actions from the
real thing to the smaller thing.</p>
<p>And so there comes a point in the making of things, in which the discipline
you’ve chosen gets past that gear-switching mode and goes towards an almost
entirely mental mode, where, I build something in my head first, and then
what I do with my hands is just cutting the chunks I see in here.</p>
</blockquote>
<p>I've felt that way with a few of my hobbies and skills, and it's a wonderful
thing, and I've never seen it explained better.</p>
<p><a href="https://tim.blog/2019/05/08/the-tim-ferriss-show-transcripts-adam-savage-370/">Read more...</a></p>
<h3><a href="#focused-73-productivity-and-art-with-bob-reynolds---relay-fm" aria-hidden="true" class="anchor" id="focused-73-productivity-and-art-with-bob-reynolds---relay-fm"></a><a href="https://www.relay.fm/focused/73">Focused #73: Productivity and Art with Bob Reynolds - Relay FM</a></h3>
<p>I've <em>really</em> been enjoying this podcast, and this episode is no exception. The
discussions on being in love with the result rather than the process, and how
that can lead people astray in their careers is worth the listen.</p>
<p><a href="https://www.relay.fm/focused/73">Read more...</a></p>
<h3><a href="#perspective--its-the-middle-of-the-night-do-you-know-who-your-iphone-is-talking-to" aria-hidden="true" class="anchor" id="perspective--its-the-middle-of-the-night-do-you-know-who-your-iphone-is-talking-to"></a><a href="https://www.washingtonpost.com/technology/2019/05/28/its-middle-night-do-you-know-who-your-iphone-is-talking/">Perspective | It’s the middle of the night. Do you know who your iPhone is talking to?</a></h3>
<p>More creepy findings about how you are the product. If an app or service is
free... chances are it's taking your data and selling it to whoever pays them
the most.</p>
<p><a href="https://www.washingtonpost.com/technology/2019/05/28/its-middle-night-do-you-know-who-your-iphone-is-talking/">Read more...</a></p>
<h3><a href="#the-ios-only-podcasting-kit" aria-hidden="true" class="anchor" id="the-ios-only-podcasting-kit"></a><a href="https://nahumck.me/the-ios-only-podcasting-kit/">The iOS-Only Podcasting Kit</a></h3>
<p>Pretty amazing what is possible these days with just mobile devices.</p>
<p><a href="https://nahumck.me/the-ios-only-podcasting-kit/">Read more...</a></p>
<h3><a href="#the-world-wide-work" aria-hidden="true" class="anchor" id="the-world-wide-work"></a><a href="https://adactio.com/journal/15260">The World-Wide Work</a></h3>
<p>At this point, I think I just subscribe to Adactio for accessiblity advice
<em>and</em> links to amazing talks. This one is amazing... Ethan Marcotte delivers
again. Very good.</p>
<p><a href="https://adactio.com/journal/15260">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>30 Things I&#39;ve Learned</title>
       <link>http://evantravers.com/articles/2019/05/25/30-things-i-ve-learned/</link>
       <pubDate>Sat, 25 May 2019 21:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/05/25/30-things-i-ve-learned/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/05/path.jpg"></p><p>I've just turned thirty. It crept up on me… I was planning a trip, doing normal
life things and suddenly my golden birthday was upon me. I don't have regrets,
there's nothing I would change, I just sort of felt guilty for not having given
it any thought. That's ok, it's just a day. I am grateful for a season of
contentment and busyness, but this momentous occasion is an excellent excuse
for some good old Evan-style verbose thinking, aping the style of <a href="https://seanwes.com/2018/30-things-ive-learned/">Sean
Wes's</a> excellent post.</p>
<p>This started out as a simple bulleted list… but then I got stuck in LAX for a
few hours. Sorry about that.</p>
<p>Here's some thoughts in no particular order:</p>
<h2><a href="#1-god-is-faithful" aria-hidden="true" class="anchor" id="1-god-is-faithful"></a>1. God is faithful.</h2>
<p>If there's one lesson I've learned, it that is He is faithful. He will never
leave me nor forsake me, and He has walked with me and worked through me. I am
so grateful that he did not leave me where I was when I was twenty, and I can
look forward with confidence and joy towards the next ten years because He is
faithful.</p>
<h2><a href="#2-be-kind" aria-hidden="true" class="anchor" id="2-be-kind"></a>2. Be kind.</h2>
<p>Kindness is easy when it stares you in the face… I'm talking about courageous
and creative kindness. Teaching your heart to <em>see</em> others and their needs and
to meet them. Not only is it obedience (Eph 4:32) but it often pays off in this
life. I'm grateful that my parents instilled some of this early… I'm still
reaping the rewards professionally and personally.</p>
<h2><a href="#3-introversion-is-no-excuse-to-avoid-blessing-others" aria-hidden="true" class="anchor" id="3-introversion-is-no-excuse-to-avoid-blessing-others"></a>3. Introversion is no excuse to avoid blessing others.</h2>
<p>I was guilty of this. I chose to not take opportunities to serve and bless
other people, hiding behind my personality type. Fortunately, the Lord started
teaching me to overcome this, but it really hit home in the last few years when
my friend Aaron told me that fear is no reason to avoid blessing others. Great
advice.</p>
<h2><a href="#4-study-is-better-than-grazing" aria-hidden="true" class="anchor" id="4-study-is-better-than-grazing"></a>4. Study is better than grazing.</h2>
<p>I don't remember the thousands of articles I've read over the years through
Google reader. I do remember the few books I've made notes on. I can't tell you
what I read in my feed reader this morning… unless I shared it with a friend.</p>
<p>The &quot;grazing&quot; behavior of fifteen second clips and rivers of thumbnails <em>feels</em>
like learning, it feels like progress. It tickles the neural pathways that
encourage us to learn and grow… but it doesn't take root. It doesn't make a
difference. It promises endless quick fixes to deeper problems, and maybe if I
scroll a little more I'll be satisfied… lies.</p>
<p>I'm quitting the graze, and trying to study intentionally that which is worth
my time.</p>
<h2><a href="#5-marriage-is-a-blessing-from-the-lord" aria-hidden="true" class="anchor" id="5-marriage-is-a-blessing-from-the-lord"></a>5. Marriage is a blessing from the Lord.</h2>
<p>I knew marriage would be wonderful… but I had no idea that it would be this
wonderful. A good woman is a blessing from God… and I am greatly blessed.</p>
<p>Guys… trust the Lord, wait on Him. She is worth the wait.</p>
<h2><a href="#6-focus-is-a-skill-that-can-be-gained-and-lost" aria-hidden="true" class="anchor" id="6-focus-is-a-skill-that-can-be-gained-and-lost"></a>6. Focus is a skill that can be gained… and lost.</h2>
<p>Like many I feel that my ability to focus has atrophied since I got a
smartphone… but <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">I'm fighting back and trying to rebuild this
skill</a>. I have already
dealt with reducing distraction and regaining time almost ten years ago, when I
went from subscribing to over 10k RSS feed items a day to under 150. The
decrease in information back pressure had me subconsciously refreshing Google
Reader (remember that?) constantly. I'm dealing with a similar thing now… and
slowly reprogramming my brain to avoid endlessly refreshing my dead feeds and
start creating.</p>
<p>More on that later...</p>
<h2><a href="#7-contentment-is-a-secret-that-can-be-found" aria-hidden="true" class="anchor" id="7-contentment-is-a-secret-that-can-be-found"></a>7. Contentment is a secret that can be found.</h2>
<div class="sidebar  quote">
Contentment doesn’t come from having your hearts desire… it comes from having your heart’s desire be the Lord.
</div>
<p>A few years back, I set this as my goal and study… really started praying and
thinking about contentment because I was single and very discontent. I think
there's a certain amount of &quot;godly discontent&quot; that can go with singleness, but
I had a problem. I'm happy to say that through a year of praying and seeking
the Lord, he did give me true contentment with where he had me in life.</p>
<p>Not very long after that, he brought Sarah into my life, but that's a longer
story.</p>
<p>Contentment doesn't come from having your hearts desire… it comes from having
your heart's desire be the Lord. I can still struggle with contentment even
now, but I know the secret a little better than I did before.</p>
<h2><a href="#8-god-answers-prayer" aria-hidden="true" class="anchor" id="8-god-answers-prayer"></a>8. God answers prayer.</h2>
<p>I started keeping a prayer journal. After a year or two it was humbling to go
back through it and remember how the Lord answered. I highly recommend the
practice, it's a source of great joy.</p>
<h2><a href="#9-journaling-has-a-lot-of-value" aria-hidden="true" class="anchor" id="9-journaling-has-a-lot-of-value"></a>9. Journaling has a lot of value.</h2>
<p>I started journaling in earnest five or so years ago… I had always done a sort
of first of the year or birthday journal entry, always intending to make it
work.</p>
<p>At first the journal was a cathartic thing… a way to get it all out, but as the
Lord worked in my heart (see also the notes on contentment) I slowly started to
record all the good that He brought into my life… sunsets, good food,
conversations with friends, good days at work… my journaling has become a way
to build an Ebenezer of gratitude to remind me that God is sovereign and
despite my cynical mind's first impression… things aren't as bad as they seem.</p>
<p>My problem now is that I have too many journals… (last count… five?) I'll let
you know when I figure that out.</p>
<h2><a href="#10-invest-in-your-friends" aria-hidden="true" class="anchor" id="10-invest-in-your-friends"></a>10. Invest in your friends.</h2>
<p>I guess this is also related to #3. In my teens through early twenties, there's
a lot of social arenas in which to build relationships. As I was warned, I have
found that as life continues one must take initiative to forge new
relationships and strengthen old ones.</p>
<p>I'm being pretty aggressive about it at the moment… left to myself I wouldn't
ever reach out, so I have a running list of people to visit with and set a
reminder every two weeks or so to pull someone off the list and give them a
call.</p>
<h2><a href="#11-invite-people-to-invest-in-you" aria-hidden="true" class="anchor" id="11-invite-people-to-invest-in-you"></a>11. Invite people to invest in you.</h2>
<p>Giving is good… but you need people pouring into you as well. On one of my
birthdays, my dad invited a group of men he respected to write me letters to
encourage me and give me advice. Half a decade later, I still revisit those
letters for encouragement and rely on those same men for counsel. I am working
on making this a more regular thing… starting first with the wise men in my
family.</p>
<h2><a href="#12-exercise-makes-life-better" aria-hidden="true" class="anchor" id="12-exercise-makes-life-better"></a>12. Exercise makes life better.</h2>
<p>I was kind of a wuss as a kid. I didn't like getting sweaty or dirty, I wasn't
good at sports, I was content to stay inside in the AC and read books and play
games.</p>
<p>I was not sporty. I did not want to work out. That was for &quot;other people.&quot;</p>
<p>Later in life, a friend introduced me to rock climbing, a hobby which I found I
really enjoyed. I went from climbing one hour a week to climbing an hour 5
times a week, with a workout at the end to strengthen my core so that I'd be
better equipped to climb more.</p>
<p>My sleep improved. My appetite changed. My mood became more positive. I found I
was able to focus more at work. While regular climbing is a little far away for
family life, I still workout pretty much every single day.</p>
<p>If nothing else, starting the day with a &quot;hard thing&quot; is a great way to build
discipline and personal integrity. Keep that promise to yourself… be faithful
in the little things.</p>
<h2><a href="#13-writing-is-an-essential-life-skill" aria-hidden="true" class="anchor" id="13-writing-is-an-essential-life-skill"></a>13. Writing is an essential life skill.</h2>
<p>Every job requires communication. Most communication these days is written in
emails and texts. Even if you don't write for a living, the ability to clearly
and concisely relay information is <em>critical</em>.</p>
<p>If you are a software developer, this is probably the single best skill that
you can use to take your career to the next level. Ever notice how your
development heroes have blogs and write regularly? Yep. Ever notice how the
really good developers in your office take time on documentation and git
commits? That's a good hint.</p>
<p>I'm sure students of grammar will find lots of tense mistakes and run-on
sentences in this piece… I'm still learning.</p>
<h2><a href="#14-discipline-is-freedom" aria-hidden="true" class="anchor" id="14-discipline-is-freedom"></a>14. Discipline is freedom.</h2>
<p>This is a <a href="/articles/2019/02/28/review-extreme-ownership-by-jocko-willink-and-leif-babin/">new phrase for
me</a>
for a concept that I've been slowly learning over the past five years.</p>
<p>I would never have characterized myself as a disciplined person. I hated waking
up. I hated working out. I didn't enjoy doing hard things.</p>
<p>Then my little brothers grew up into disciplined men. I watched and admired
how their focus and drive enabled them to succeed and grow… and inspired...
starting reading and changing my life a little bit at a time.</p>
<p>I still don't like waking up. I still don't enjoy working out. But I like the
person I'm becoming.  I have more ability to serve others and enjoy God's
creation. And I hope that by being more faithful in the small things… I will
build a character quality that will honor One whose name <em>is</em> Faithful and
True.</p>
<h2><a href="#15-leadership-is-hard" aria-hidden="true" class="anchor" id="15-leadership-is-hard"></a>15. Leadership is hard.</h2>
<p>When I was young… I decided I didn't even want to be the oldest kid and my
younger brother happily stepped up to the plate. (Long story, that.)</p>
<p>But you can't always abdicate that easily. Leadership is part of life and
serving others. Just when I think I'm getting the hang of being the leader at
work, in a community, or in my family I find a new wrinkle that challenges and
scares the stink out of me.</p>
<p>Thanks to #14 and #25… running away isn't an option any more. I have so much
too learn.</p>
<h2><a href="#16-adventures-are-everywhere" aria-hidden="true" class="anchor" id="16-adventures-are-everywhere"></a>16. Adventures are everywhere.</h2>
<p>With the right mix of courage and care, you don't have to travel anywhere
exotic to have an adventure. Usually it just requires looking someone in the
face and listening.</p>
<p>If you catch yourself saying &quot;ha, I would never do that…&quot; you are saying no to
an adventure.</p>
<p>(Be wise though… there are &quot;adventures&quot; you shouldn't take.)</p>
<h2><a href="#17-i-waste-more-time-researching-than-doing" aria-hidden="true" class="anchor" id="17-i-waste-more-time-researching-than-doing"></a>17. I waste more time &quot;researching&quot; than doing.</h2>
<p>If reading about ways to get six-pack abs could give you six-pack abs… I'd have
six-pack abs.</p>
<p>Pretty much every skill I have ever wanted to acquire, I spend about 72 hours
watching beginner youtube videos and reading reviews and spend about… fifteen
minutes practicing with the tools I have now.</p>
<p>This is dumb. I am going to stop. (See also grazing.)</p>
<h2><a href="#18-there-is-no-substitute-for-face-to-face" aria-hidden="true" class="anchor" id="18-there-is-no-substitute-for-face-to-face"></a>18. There is no substitute for face to face.</h2>
<p>As someone who tends to introvert, it is <em>so</em> tempting to try and deal with
conflict or confession over a screen via text or email. It is always a mistake.</p>
<h2><a href="#19-communication-is-an-art-that-requires-practice" aria-hidden="true" class="anchor" id="19-communication-is-an-art-that-requires-practice"></a>19. Communication is an art that requires practice.</h2>
<p>Two years ago or so, I would have characterized myself as being a really great
communicator.</p>
<p>Oh boy was I wrong.</p>
<p>I have so much more to learn about effective and kind communication… and I'm
excited to strengthen my abilities and fix my weaknesses, if only for my
family's sake.</p>
<h2><a href="#20-being-organized-is-great" aria-hidden="true" class="anchor" id="20-being-organized-is-great"></a>20. Being organized is great.</h2>
<p>I always thought of myself as one of those people that's just not organized…
&quot;my brain doesn't work that way,&quot; or &quot;I don't need that.&quot;</p>
<p>Yeah. I needed it. Real bad. I'm probably going overboard at the moment and
need to pull back and be more measured, but I'm really benefiting from a task
manager and some more disciplined scheduling.</p>
<h2><a href="#21-time-does-speed-up" aria-hidden="true" class="anchor" id="21-time-does-speed-up"></a>21. Time does speed up.</h2>
<p>I haven't read all the research to figure out why… but the aphorism holds true.
Time really does change on you. The past year of our daughter's life has
<em>flown</em> by… I could see blinking a few more times and she'll be asking for my
keys. How we invest our hours is how we spend our years… I want to be a good
steward of the time.</p>
<h2><a href="#22-travel-is-awesome" aria-hidden="true" class="anchor" id="22-travel-is-awesome"></a>22. Travel is awesome.</h2>
<p>I'm a bit of a lazy homebody… but the times I've gotten out of my comfort zone
and spent time with my friends and family in a new place have been some of the
best times of my life. Definitely something I want to carry into the next
decade.</p>
<h2><a href="#23-nothing-you-do-is-secret" aria-hidden="true" class="anchor" id="23-nothing-you-do-is-secret"></a>23. Nothing you do is secret.</h2>
<p>This is true three ways: God sees all. People are always watching. Even your
fake social media account <strong>will</strong> be found by the person you least want to see
it.</p>
<p>Also… to live in a confessional community of believers… or at least within your
family… it's <em>so</em> good to be known and forgiven.</p>
<h2><a href="#24-i-enjoy-building-tools" aria-hidden="true" class="anchor" id="24-i-enjoy-building-tools"></a>24. I enjoy building tools.</h2>
<p>Looking back over the past ten years of work, I have realized that the projects
that have most captured my interest have been around building tools to help
myself or others work. Fortunately, that's also my day job at the moment.</p>
<h2><a href="#25-i-need-a-growth-mindset" aria-hidden="true" class="anchor" id="25-i-need-a-growth-mindset"></a>25. I need a growth mindset.</h2>
<p>I've spent a lot of time coasting on the latent ability God has given
me… taking pride in my strengths and avoiding or excusing my weaknesses. While
I haven't finished reading the Mindset book, I have become more exposed to the
idea and have realized how I have had a bad &quot;fixed&quot; mindset for too long. I aim
to change that. I'm not a bad cook. I'm just not <em>yet</em> a good cook. :P</p>
<h2><a href="#26-i-celebrate-my-strengths-and-excuse-my-weaknesses" aria-hidden="true" class="anchor" id="26-i-celebrate-my-strengths-and-excuse-my-weaknesses"></a>26. I celebrate my strengths and excuse my weaknesses</h2>
<p>This is a relatively new discovery for me. As a high &quot;S&quot; on the DISC… I tend to
have a hard time communicating decisions. I excused this behavior as part of my
&quot;being humble and nice.&quot; While there is <em>some</em> truth to this, I now understand
how frustrating my &quot;kind&quot; behavior can be. I also realize that the way I
excused my indecisiveness is the same fond way other personality types can feel
about their weaknesses… which has raised my compassion.</p>
<h2><a href="#27-you-will-become-like-your-heroes" aria-hidden="true" class="anchor" id="27-you-will-become-like-your-heroes"></a>27. You will become like your heroes.</h2>
<p>When Is as a kid, I thought Hawkeye from The Last of the Mohicans was
<em>awesome</em>. I spent hours reading about how to read trail signs and practicing
walking quietly through the woods.</p>
<p>As a result… 18 years later I still accidentally scare people because I walk
quietly.</p>
<p>My closet and gear chest are filled with things that my heroes have worn and
bought. I adopt podcaster's mannerisms and jokes, I buy the backpack I see on a
cool blog, I use the plugins that I see on someone's screencast… you may not
think you have any heroes, but ask your family. Evaluate their effect on you.</p>
<h2><a href="#28-you-need-less-than-you-think" aria-hidden="true" class="anchor" id="28-you-need-less-than-you-think"></a>28. You need less than you think.</h2>
<p>When I was a little boy… my brothers and I would hoard a Cabela's catalog and
plan what we'd need to have an amazing river camping trip. I want this
catamaran with this backpack, and this tent, and these knives… I would plan
small businesses, movies, projects that all depended upon acquiring gear and
<em>stuff</em> in order to start.</p>
<p>The few hobbies and projects that I actually started before I had got
everything on my list have affected my life dramatically: photography, web
development, blogs… the ones that I was shopping for stayed dreams and cobwebs.</p>
<p>I need a lot less than is on my wishlist and in my closet. I probably need to
find a way to put that on my Amazon homepage. :P</p>
<h2><a href="#29-my-heart-is-an-idol-factory" aria-hidden="true" class="anchor" id="29-my-heart-is-an-idol-factory"></a>29. My heart is an idol factory.</h2>
<p>In order to live the Christian life I have to <a href="https://www.esv.org/verses/Ephesians4:20">put off and put on</a>. I wish that I
could say I've spent the right amount of time and energy into putting on the
new man… but I sure have found a lot of encumbering things that needed to be
put off.</p>
<p>There's an idol hiding in nearly ever other point in this document… still
fighting and submitting myself to Christ.</p>
<h2><a href="#30-start-it-now" aria-hidden="true" class="anchor" id="30-start-it-now"></a>30. Start it now.</h2>
<p>Whatever &quot;it&quot; is… start it. Don't wait till it &quot;feels right&quot; or you have enough
morale… set a time tomorrow and start. I have wasted <em>years</em> waiting for the
&quot;right time.&quot; It never comes. Today is the right time.</p>
<h2><a href="#whats-next" aria-hidden="true" class="anchor" id="whats-next"></a>What's Next</h2>
<figure class="sidebar">
  <img src="https://images.evantravers.com/articles/2019/05/thirty.jpg" alt="my goofy mug">
  <figcaption>
    📷 by <a href="http://instagram.com/sarahandevanphotos/">my lovely wife</a>!
  </figcaption>
</figure>
<p>Well… this post isn't perfect, but neither am I. I wrote most of it on planes,
layovers, and over a week... then I put it down, picked it up again a month
later... it's all over the place. I'd still like to know what you think.</p>
<p>I'm so grateful to God for this path.</p>
<p>I'm so thankful for the family that he placed me in. The parents that loved
and guided me, the siblings who have encouraged me.</p>
<p>I'm overcome by the blessings that he has lavished on me through my wife and
little family.</p>
<p>I'm ready for the next ten years.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: April</title>
       <link>http://evantravers.com/articles/2019/05/03/books-and-links-april/</link>
       <pubDate>Fri, 03 May 2019 19:03:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/05/03/books-and-links-april/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/05/bird.jpg"></p><p>We just got back from a simultaneously relaxing and exhausting trip to
California... without my computer, so this is a little late.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>I read two books in April... the most recent James SA Corey novel and The Left
Hand of Darkness by Ursula Le Guin.</p>
<p>In TLHoD an envoy from a human civilization makes first contact with a world
full of very strange humans. Ultimately, I think it's about the complications
in communication that come from completely alien experience, culture...
especially with someone we assume we understand.</p>
<p>I'm working on too many books at the moment... Mindset by Carol Dweck and
Essentialism by Greg McKeon are on deck. Maybe too much self-help for one
month.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>I got some excellent feedback last month to make this shorter... but there were
<em>so</em> many good links this month, and I haven't built a new script to generate
smaller snippets.</p>
<h3><a href="#automators---relay-fm" aria-hidden="true" class="anchor" id="automators---relay-fm"></a><a href="https://www.relay.fm/automators">Automators - Relay FM</a></h3>
<p>Automation is near and dear to my heart, and this show is right up my alley.
This very blog post is generated through a slew of automation... so I'm
definitely going to be subscribing and catching up on some back issues. Start
with Episode 1, about calendar automation for a quick taste of what the hosts
have to offer.</p>
<p><a href="https://www.relay.fm/automators">Read more...</a></p>
<h3><a href="#godzilla-1998" aria-hidden="true" class="anchor" id="godzilla-1998"></a><a href="http://www.modelshipsinthecinema.com/2019/04/godzilla-1998.html">Godzilla 1998</a></h3>
<p><img src="https://4.bp.blogspot.com/-i9bpNY8B15c/XKCHNoI6TUI/AAAAAAAANsA/nx0Kdil55PwX8IGFHekhirsEcMMYcCD-wCKgBGAs/s1600/01_VFX-Supervisor-Volker-Engel-in-NY-miniature_.jpg" alt="picture from behind the scenes" /></p>
<p>I love super detailed blogs that obsess about design details. I love movie
props and miniatures. This blog is both of those things.</p>
<p><a href="http://www.modelshipsinthecinema.com/2019/04/godzilla-1998.html">Read more...</a></p>
<h3><a href="#the-tim-ferriss-show-transcripts-neil-gaiman-366" aria-hidden="true" class="anchor" id="the-tim-ferriss-show-transcripts-neil-gaiman-366"></a><a href="https://tim.blog/2019/03/30/the-tim-ferriss-show-transcripts-neil-gaiman-366/">The Tim Ferriss Show Transcripts: Neil Gaiman (#366)</a></h3>
<figure>
  <iframe height="315" src="https://www.youtube.com/embed/iHPKTby9z6o?rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</figure>
<p>This whole interview is worth reading either for discussions of writing, focus,
or just the love of a good yarn.</p>
<p>My favorite piece of advice, among many:</p>
<blockquote>
<p>I would go down to my lovely little gazebo at the bottom of the garden, sit
down, and I’m absolutely allowed not to do anything. I’m allowed to sit at my
desk, I’m allowed to stare out at the world, I’m allowed to do anything I
like, as long as it isn’t anything. Not allowed to do a crossword, not
allowed to read a book, not allowed to phone a friend, not allowed to make a
clay model of something. All I’m allowed to do is absolutely nothing, or
write.</p>
<p>What I love about that is I’m giving myself permission to write or not write,
but writing is actually more interesting than doing nothing after a while.</p>
<p>[...]</p>
<p>I think it’s really just a solid rule for writers. You don’t have to write.
You have permission to not write, but you don’t have permission to do
anything else.</p>
</blockquote>
<p><a href="https://tim.blog/2019/03/30/the-tim-ferriss-show-transcripts-neil-gaiman-366/">Read more...</a></p>
<h3><a href="#details-on-details" aria-hidden="true" class="anchor" id="details-on-details"></a><a href="https://docs.google.com/presentation/d/1hvnPpsJo44BTPfJx28CV95vqk_dt6na1awUbk0kmZYM/edit">Details on &lt;details&gt;</a></h3>
<p>This talk is <em>fantastic</em>. I had never really examined this HTML element before,
but the ability to make dropdown/modal/menus with pure HTML, no js, and
accessible... very cool. Now I want to rebuild my menu without the checkbox
trick.</p>
<p>The link I liked is the details of implementation, but you should read <a href="https://docs.google.com/presentation/d/1hvnPpsJo44BTPfJx28CV95vqk_dt6na1awUbk0kmZYM/edit">the slides</a>
first.</p>
<p><a href="https://docs.google.com/presentation/d/1hvnPpsJo44BTPfJx28CV95vqk_dt6na1awUbk0kmZYM/edit">Read more...</a></p>
<h3><a href="#native-image-lazy-loading-for-the-web" aria-hidden="true" class="anchor" id="native-image-lazy-loading-for-the-web"></a><a href="https://addyosmani.com/blog/lazy-loading/">Native image lazy-loading for the web!</a></h3>
<p>Simple attribute that will hopefully remove <em>tons</em> of weird javascript hacks
over the years.</p>
<p><a href="https://addyosmani.com/blog/lazy-loading/">Read more...</a></p>
<h3><a href="#opinion--you-are-not-as-good-at-kissing-as-you-think-but-you-are-better-at-dancing" aria-hidden="true" class="anchor" id="opinion--you-are-not-as-good-at-kissing-as-you-think-but-you-are-better-at-dancing"></a><a href="https://www.nytimes.com/2019/04/06/opinion/sunday/overconfidence-men-women.html">Opinion | You Are Not as Good at Kissing as You Think. But You Are Better at Dancing.</a></h3>
<blockquote>
<p>Another factor that predicted overconfidence is how much a person’s skill
level at a trait is a matter of opinion. Give people more wiggle room in how
they can define the skill, and they will tend to rate themselves higher.
People were slightly more overconfident in how they ranked their intelligence
(somewhat subjective) than their performance on an IQ test (seemingly more
objective.)</p>
</blockquote>
<p>Some interesting brain science here... outcomes vs. objectives.</p>
<p><a href="https://www.nytimes.com/2019/04/06/opinion/sunday/overconfidence-men-women.html">Read more...</a></p>
<h3><a href="#split" aria-hidden="true" class="anchor" id="split"></a><a href="https://adactio.com/journal/15050">Split</a></h3>
<p>There have been a lot of posts recently about the back-end of front-end
programming, and what that shift means for the web as a whole. Last month I
posted a great article about what that means for building teams and hiring, but
I think Jeremy Keith hits the nail on the head with my other concern about this
trend:</p>
<blockquote>
<p>As a user-centred developer, my priority is doing what’s best for end users.
That’s not to say I don’t value developer convenience. I do. But I prioritise
user needs over developer needs. And in any case, those two needs don’t even
come into conflict most of the time. Like I said, from a user’s point of
view, it’s irrelevant what text editor or version control system you use.</p>
</blockquote>
<p>I struggle with this a lot... but as someone who has spent a lot of time over
the past years working on accessibility remediation, I've seen a lot of damage
created by making decisions for developer convenience.</p>
<p>Also:</p>
<blockquote>
<p>Last year, I was asked “Is there a fear or professional challenge that keeps
you up at night?” I responded:</p>
<p>My greatest fear for the web is that it becomes the domain of an elite
priesthood of developers. I firmly believe that, as Tim Berners-Lee put it,
“this is for everyone.” And I don’t just mean it’s for everyone to use—I
believe it’s for everyone to make as well. That’s why I get very worried by
anything that raises the barrier to entry to web design and web development.</p>
</blockquote>
<p><a href="https://adactio.com/journal/15050">Read more...</a></p>
<h3><a href="#cronios" aria-hidden="true" class="anchor" id="cronios"></a><a href="https://tow.com/shortcuts/cronios/">Cronios</a></h3>
<p>I've been diving heavily into the world of iOS automation, trying to learn all
I can. If I can report one thing... its this: give a nerd a cookie, and he'll
build a full-bore scheduling and automation system.</p>
<p><a href="https://tow.com/shortcuts/cronios/">Read more...</a></p>
<h3><a href="#dark-scrum" aria-hidden="true" class="anchor" id="dark-scrum"></a><a href="https://ronjeffries.com/articles/016-09ff/defense/">Dark Scrum</a></h3>
<blockquote>
<p>Often, today’s power holders believe that their job is to decide what their
people should do, tell them to do it, and see that they do. Scrum teaches
otherwise: explain what needs to be done, then stand back and let the people
self-organize to do it.</p>
<p>People can’t just click over into Scrum’s new mode of operation. It takes
time to unlearn the old ways. It takes time to learn new habits, time to
learn to trust the team. It takes time for the team to learn how to be
trusted: in a way that’s the underlying message of this article. Scrum’s
training begins this learning process for the people who get the training.</p>
<p>Dark Scrum begins when people who know their old job, but not their new Scrum
job, begin to do the Scrum activities. It goes like this:</p>
</blockquote>
<p>Well worth the read. Still thinking about and re-reading this article a month
later.</p>
<blockquote>
<p>When leadership cannot see working software, they become afraid about the
future — and rightly so. They show that fear, invariably, in ways that are
not helpful, and that are generally painful. Developers can stop that from
happening. The only way I know is to deliver software. Real, live, working
software. With visible features!</p>
</blockquote>
<p>Great article, with a strong emphasis on some real strategies that developers
can employ to move the team towards a healthier work cycle.</p>
<p><a href="https://ronjeffries.com/articles/016-09ff/defense/">Read more...</a></p>
<h3><a href="#product-thinking-vs-project-thinking" aria-hidden="true" class="anchor" id="product-thinking-vs-project-thinking"></a><a href="https://productcoalition.com/product-thinking-vs-project-thinking-380692a2d4e">Product Thinking vs. Project Thinking</a></h3>
<blockquote>
<p>Product thinking takes a fundamentally different approach. Rather than
focusing on the output, product thinking is focused on the outcome.</p>
<p>This is a significant shift from the mindset of project thinking. Rather than
focusing on timelines and dates, we focus on the goal we want to achieve or
the job to be done. Because we’re focused on the outcome rather than the
output, it is much more difficult to put time constraints around the
delivery, at least up front. Primarily because we don’t necessarily know how
we’re going to accomplish the goal up front.</p>
<p>[...]</p>
<p>The key is to make commitments and project plans only at a point when we can
do it with a high degree of confidence. So rather than committing to a
specific path beforehand, we commit once we’ve validated what we’re doing and
have had a chance to really understand what it will take. Often that is a
sprint or two into the work. That may feel really late in the process, but it
is at the point when estimates and plans can actually mean something. Marty
Cagan, in his book Inspired: How to Create Tech Products People Love, calls
this type of commitment a “high-integrity commitment.” We allow teams time to
do proper discovery and research before asking for commitments.</p>
</blockquote>
<p>I guess I need to finish reading Inspired.</p>
<p><a href="https://productcoalition.com/product-thinking-vs-project-thinking-380692a2d4e">Read more...</a></p>
<h3><a href="#home--automation-orchard" aria-hidden="true" class="anchor" id="home--automation-orchard"></a><a href="https://automationorchard.com">Home | Automation Orchard</a></h3>
<blockquote>
<p>There are fabulous tools out there to help you automate things, but which
tool should you use? How can you make better use of it? Automation Orchard is
collecting content from all over the web to give you a central repository
where you can find everything about automation.</p>
</blockquote>
<p>I've been reading and learning a lot about personal automation, and this is
going to be pinned in my tabs for a while. Amazing resource!</p>
<p><a href="https://automationorchard.com">Read more...</a></p>
<h3><a href="#mario-gets-a-boosted-makeover-video--the-brothers-brick" aria-hidden="true" class="anchor" id="mario-gets-a-boosted-makeover-video--the-brothers-brick"></a><a href="https://www.youtube.com/embed/sKl4EMKzXMA">Mario gets a BOOSTed makeover [Video] | The Brothers Brick</a></h3>
<iframe width="604" height="352" src="https://www.youtube.com/embed/sKl4EMKzXMA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>This is incredible.</p>
<p><a href="https://www.youtube.com/embed/sKl4EMKzXMA">Read more...</a></p>
<h3><a href="#my-affair-with-the-intellectual-dark-web" aria-hidden="true" class="anchor" id="my-affair-with-the-intellectual-dark-web"></a><a href="https://medium.com/s/greatescape/nuance-a-love-story-ae6a14991059">My Affair With the Intellectual Dark Web</a></h3>
<blockquote>
<p>“New crops of young journalists, many consigned to online opinion writing,
knew all too well that career advancement depended on clicks, which in turn
depended on fealty to the woke narrative.”</p>
</blockquote>
<p>I don't agree with all the positions presented in this story. The desire to
have &quot;nuance&quot; in discussion, to be able to raise ideas without being shouted
down by those more extreme... that does resonate with me.</p>
<p><a href="https://medium.com/s/greatescape/nuance-a-love-story-ae6a14991059">Read more...</a></p>
<h3><a href="#things-on-ios-the-complete-guide-to-automations-and-workflows" aria-hidden="true" class="anchor" id="things-on-ios-the-complete-guide-to-automations-and-workflows"></a><a href="https://thesweetsetup.com/articles/automations-workflows-things-ios/">Things on iOS: The Complete Guide to Automations and Workflows</a></h3>
<p>I'm mostly saving this for myself. I'm working on being more organized, so I'm
going to need this link for later. :P</p>
<p><a href="https://thesweetsetup.com/articles/automations-workflows-things-ios/">Read more...</a></p>
<h3><a href="#routinehub---start-meeting" aria-hidden="true" class="anchor" id="routinehub---start-meeting"></a><a href="https://i.imgur.com/hFj3EGv.png">RoutineHub - Start Meeting</a></h3>
<p><img src="https://i.imgur.com/hFj3EGv.png" alt="picture of part of the workflow" /></p>
<p>This is a crazy example of a full workflow built in Shortcuts. (Can you tell
I've been doing some reading on personal automation?)</p>
<p><a href="https://i.imgur.com/hFj3EGv.png">Read more...</a></p>
<h3><a href="#how-algorithms-know-what-youll-type-next" aria-hidden="true" class="anchor" id="how-algorithms-know-what-youll-type-next"></a><a href="http://pudding.cool">How Algorithms Know What You’ll Type Next</a></h3>
<p><a href="http://pudding.cool">pudding.cool</a> continues to a be source of interesting
learning through visualizations.</p>
<p><a href="http://pudding.cool">Read more...</a></p>
<h3><a href="#what-happens-when-you-enter-a-url-in-your-browser-of-choice---the-history-of-the-web" aria-hidden="true" class="anchor" id="what-happens-when-you-enter-a-url-in-your-browser-of-choice---the-history-of-the-web"></a><a href="https://thehistoryoftheweb.com/history-of-the-url/">What Happens When You Enter a URL In Your Browser of Choice - The History of the Web</a></h3>
<blockquote>
<p>There’s this scene in the second season of The Crown (if you watch enough old
movies, you’ll see the same kind of thing). The scene depicts Princess
Margaret, away from England and distraught after hearing news of a former
love, as she attempts to get in contact with her sister, the Queen of
England. She tells her staff to place an urgent call, so her attendant goes
to the phone and picks it up. He is immediately greeted by an operator. He
tells the operator he needs to connect to Buckingham immediately, on a secure
line.</p>
<p>What follows is an inside and in-depth look at how mid-20th century phone
calls were connected. The operator pulls a phone connector out of a hole in a
machine on the wall and plugs it in elsewhere. This connects the phone line
to another operator, this time in England, who once again patches the call to
a different line. The third operator does the same as the second, and the
fourth the same as the third, and on and on it goes down the line of
switchboard operators pulling plugs in and out of large telephone
switchboards that cover entire walls all with the goal of connecting one
telephone line to another until Her Majesty the Queen is finally located and
answers in her stables.</p>
<p>The sequence is as compelling as it is mesmerizing, meant to highlight the
very real mechanical and human-driven logistics of global communication, a
small glimpse at the work of the many that enables the strength of the
British Crown. In those days, calls were connected by actual human beings,
connecting phone lines through a series of switches until callers were
connected. These telephone switchboard operators, as they were known, were
essential, though over the years they would be replaced, first by
mechanically automated switches, and later by electric tones.</p>
</blockquote>
<p><a href="https://thehistoryoftheweb.com/history-of-the-url/">Read more...</a></p>
<h3><a href="#sizes-better-disk-usage-reporting-in-terminal---brettterpstracom" aria-hidden="true" class="anchor" id="sizes-better-disk-usage-reporting-in-terminal---brettterpstracom"></a><a href="https://brettterpstra.com/2019/04/15/sizes-better-disk-usage-reporting-in-terminal/">sizes: better disk usage reporting in Terminal - BrettTerpstra.com</a></h3>
<blockquote>
<p>I’ve come up with a lot of ways to see what’s taking up space in my
directories from Terminal over the years. I’ve finally built one that covers
all the little niggles I’ve had in the past.</p>
<p>Let’s start with the other ways you can do this.</p>
</blockquote>
<p>Not only a useful tool... but a great explanation on how to build tools for
yourself.</p>
<p><a href="https://brettterpstra.com/2019/04/15/sizes-better-disk-usage-reporting-in-terminal/">Read more...</a></p>
<h3><a href="#using-htaccess-to-provide-better-open-graph-images---brettterpstracom" aria-hidden="true" class="anchor" id="using-htaccess-to-provide-better-open-graph-images---brettterpstracom"></a><a href="https://brettterpstra.com/2019/04/02/using-htaccess-to-provide-better-open-graph-images/">Using htaccess to provide better Open Graph images - BrettTerpstra.com</a></h3>
<blockquote>
<p>I joined David Sparks and Rosemary Orchard on episode 20 of the Automators
podcast. It was a riot, and made me realize exactly how nerdy I am about
automation and its peripheral nerdery. One of the things that came up was my
htaccess trick for handling Open Graph metadata on my blog. I got a bunch of
questions about that, so I’m writing this up to explain.</p>
</blockquote>
<p><a href="https://brettterpstra.com/2019/04/02/using-htaccess-to-provide-better-open-graph-images/">Read more...</a></p>
<h3><a href="#dragndrop-revisited" aria-hidden="true" class="anchor" id="dragndrop-revisited"></a><a href="https://adactio.com/journal/15030">Drag’n’drop revisited</a></h3>
<blockquote>
<p>One of the interfaces needed for this feature was a form to re-order items in
a list. So I thought to myself, “what’s the simplest technology to enable
this functionality?” I came up with a series of select elements within a
form.</p>
</blockquote>
<p>Great story of how to approach a simple accessibility fix... simple and to the
point.</p>
<p><a href="https://adactio.com/journal/15030">Read more...</a></p>
<h3><a href="#solving-advent-of-code-in-under-a-second" aria-hidden="true" class="anchor" id="solving-advent-of-code-in-under-a-second"></a><a href="https://www.forrestthewoods.com/blog/solving-advent-of-code-in-under-a-second/">Solving Advent of Code in Under a Second</a></h3>
<p>As someone who struggles to even finish a year's worth of problems, this is
insane.</p>
<p><a href="https://www.forrestthewoods.com/blog/solving-advent-of-code-in-under-a-second/">Read more...</a></p>
<h3><a href="#the-ultimate-guide-to-duckduckgo---brettterpstracom" aria-hidden="true" class="anchor" id="the-ultimate-guide-to-duckduckgo---brettterpstracom"></a><a href="https://brettterpstra.com/2019/03/07/the-ultimate-guide-to-duckduckgo/">The ultimate guide to DuckDuckGo - BrettTerpstra.com</a></h3>
<p>I've started using duckduckgo as my main search engine out of a desire to not
give google <em>all</em> my data. Here's a useful guide to some hidden features.</p>
<p><a href="https://brettterpstra.com/2019/03/07/the-ultimate-guide-to-duckduckgo/">Read more...</a></p>
<h3><a href="#trainers--ethanmarcottecom" aria-hidden="true" class="anchor" id="trainers--ethanmarcottecom"></a><a href="https://ethanmarcotte.com/wrote/trainers/">Trainers. — ethanmarcotte.com</a></h3>
<blockquote>
<p>The results of Brenda’s work, and the work of her coworkers, will fuel the
artificial intelligence research at companies like Microsoft, IBM, Facebook,
and Google. Employees at Brenda’s company make around $9 a day. The most
accurate “trainers” will receive a shopping voucher.</p>
<p>This is exploitation, of course—an especially old strain of it. And what’s
more, imagine how precarious Brenda’s job is. As image recognition technology
improves, will her job still exist in a few years’ time? It’s quite possible
that the data work she’s doing is being fed into automated solutions that
will eventually replace her.</p>
</blockquote>
<p>Ethics are important y'all... and hard.</p>
<p><a href="https://ethanmarcotte.com/wrote/trainers/">Read more...</a></p>
<h3><a href="#notes-from-laurie-voss-stuff-everybody-knows-except-you-talk-from-tampa-bay-startup-week-part-1---global-nerdy-because-hacker-news-is-trash" aria-hidden="true" class="anchor" id="notes-from-laurie-voss-stuff-everybody-knows-except-you-talk-from-tampa-bay-startup-week-part-1---global-nerdy-because-hacker-news-is-trash"></a><a href="http://www.globalnerdy.com/2018/02/13/notes-laurie-voss-stuff-everybody-knows-except-talk-tampa-bay-startup-week-part-1/">Notes from Laurie Voss’ “Stuff everybody knows (except you)” talk from Tampa Bay Startup Week, part 1 - Global Nerdy: Because Hacker News is Trash</a></h3>
<p>Amazing article, I really need to watch the full talk. Here's a great excerpt
with a great warning;</p>
<blockquote>
<h3><a href="#urls-are-part-of-ux" aria-hidden="true" class="anchor" id="urls-are-part-of-ux"></a>URLs are part of UX.</h3>
<ul>
<li>HTTP is a stateless protocol, which is a fancy computer science way of
saying “No matter who you pass a URL to, if they follow it, they’ll see the
same thing”. If both you and I follow the same URL for a terrible article,
we will both see the same terrible article.</li>
<li>This seems obvious to people who’ve been on the web for a while, but it’s
unique to the web, and it’s why the web is so popular. It runs off social
networking and our deep-seated desire to share stuff with each other.</li>
<li>If you’re building a web app, you need to think about how people share it.
You can’t have a rich web app that has a single URL that is the home page
and a bunch of random s--- that happens when you click buttons.</li>
<li>You should be able to follow a path into a site really deeply, and when you
find something and want to share it, you should be able to copy its URL,
send it to someone, and they should be able to follow it and see the same
thing. That’s how the web is supposed to work.</li>
<li>Support deep links because the web is social and people share stuff.</li>
<li>Don’t break URLs! And remember, they’ll end up shared and embedded in
everything.</li>
<li>Your URLs from 10 years ago need to work today, otherwise you’ll lose
people who are trying to find you.</li>
<li>Supporting deep links isn’t just good social networking and SEO; it’s also
crucial to scaling.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>Beware Twitter’s hashbang mistake, which they made when they tried to turn
it into a rich web app.</li>
<li>At the time — 2010 — they needed IE6 compatibility, and so they decided to
make use of the hashbang.</li>
<li>The problem with the hashbang is that everything after it in the URL is
considered to be a page fragment — it means it doesn’t go to the server;
it’s handled on the page.</li>
<li>This decision means that now and forever, Twitter’s homepage has two jobs:</li>
<li>It has to be Twitter’s homepage, and</li>
<li>it has to be the location of any one of 1.8 billion tweets</li>
<li>If you load Twitter’s homepage from scratch, you’ll see that it stays blank
for a second while it tries to determine if you want to see a homepage or a
tweet and if it’s a tweet, has to load the user interface and then dig into
the database to get that tweet.</li>
<li>It’s a 2010 engineering decision that broke everything; they’re stuck with
a stupid one-second delay forever because they can’t break all those URLs
that have been shared.</li>
</ul>
</blockquote>
<p><a href="http://www.globalnerdy.com/2018/02/13/notes-laurie-voss-stuff-everybody-knows-except-talk-tampa-bay-startup-week-part-1/">Read Part 1</a></p>
<p><a href="http://www.globalnerdy.com/2018/02/14/notes-laurie-voss-stuff-everybody-knows-except-talk-tampa-bay-startup-week-part-2/">Read Part 2</a></p>
<h3><a href="#meet-the-mormon-transhumanists-seeking-salvation-in-the-singularity" aria-hidden="true" class="anchor" id="meet-the-mormon-transhumanists-seeking-salvation-in-the-singularity"></a><a href="https://medium.com/s/reasonable-doubt/meet-the-mormon-transhumanists-seeking-salvation-in-the-singularity-a7e3784d6c04">Meet the Mormon Transhumanists Seeking Salvation in the Singularity</a></h3>
<p>I guess The Expanse series vision of a technologically oriented Mormon
colonists wasn't that far off... fascinating read.</p>
<p><a href="https://medium.com/s/reasonable-doubt/meet-the-mormon-transhumanists-seeking-salvation-in-the-singularity-a7e3784d6c04">Read more...</a></p>
<h3><a href="#peekenl---simulating-blobs-of-fluid" aria-hidden="true" class="anchor" id="peekenl---simulating-blobs-of-fluid"></a><a href="https://peeke.nl/simulating-blobs-of-fluid">Peeke.nl - Simulating Blobs of Fluid</a></h3>
<p>I really enjoyed reading through this process... very thoughtful and rather
intense. I especially enjoyed all the consideration and explanation of neat
optimization tricks.</p>
<p><a href="https://peeke.nl/simulating-blobs-of-fluid">Read more...</a></p>
<h3><a href="#uiux-patterns-you-literally-cannot-design-design-patents-from-tech-companies" aria-hidden="true" class="anchor" id="uiux-patterns-you-literally-cannot-design-design-patents-from-tech-companies"></a><a href="https://medium.com/@christiet">UI/UX Patterns You Literally Cannot Design: Design Patents From Tech Companies</a></h3>
<p>Content warning: language.</p>
<p>Super fascinating look into the dark business side of design... including
things as specific as facebook's:</p>
<blockquote>
<p>Animation of user’s profile spinning into view with a like reaction expanding
next to the user’s icon.</p>
</blockquote>
<p>or Netflix:</p>
<blockquote>
<p>Play duration as an animation on the play button itself</p>
</blockquote>
<p>Sorry... can't copy that affordance, you'll get sued.</p>
<p><a href="https://medium.com/@christiet">Read more...</a></p>
<h3><a href="#why-you-should-use-css-env" aria-hidden="true" class="anchor" id="why-you-should-use-css-env"></a><a href="https://blog.logrocket.com/why-you-should-use-css-env-9ee719ce0f24">Why you should use CSS env()</a></h3>
<blockquote>
<p>You now have the tools to share any variable between CSS and JS, with a
single place to update values as needed. This solution provides a more robust
way of sharing variables and is much less likely to break when the variable
values change.</p>
</blockquote>
<p>This is <strong>very</strong> cool, I have faced this several times on server side and
client side… very excited to see this become more common.</p>
<p><a href="https://blog.logrocket.com/why-you-should-use-css-env-9ee719ce0f24">Read more...</a></p>
<h3><a href="#how-to-ask-questions-the-smart-way" aria-hidden="true" class="anchor" id="how-to-ask-questions-the-smart-way"></a><a href="http://www.catb.org/~esr/faqs/smart-questions.html">How To Ask Questions The Smart Way</a></h3>
<p>I saw this resource used <em>brutally</em> on a subreddit to gatekeep a newbie… but it
honestly is a great guide.</p>
<p><a href="http://www.catb.org/~esr/faqs/smart-questions.html">Read more...</a></p>
<h3><a href="#francis-fukuyama-postpones-the-end-of-history" aria-hidden="true" class="anchor" id="francis-fukuyama-postpones-the-end-of-history"></a><a href="https://www.newyorker.com/magazine/2018/09/03/francis-fukuyama-postpones-the-end-of-history">Francis Fukuyama Postpones the End of History</a></h3>
<p>Been reading a little bit about Fukuyama because a friend pointed me at his
work. This is not the kindest reading of his opinions, but I mostly put it in
favorites because it has a plethora of references to his basic tenents and
influences… including his time at the RAND corporation. That place keeps coming
up!</p>
<p><a href="https://www.newyorker.com/magazine/2018/09/03/francis-fukuyama-postpones-the-end-of-history">Read more...</a></p>
<h3><a href="#improving-the-keyboard-accessibility-of-embedded-codepens" aria-hidden="true" class="anchor" id="improving-the-keyboard-accessibility-of-embedded-codepens"></a><a href="https://matuzo.at/blog/improving-the-keyboard-accessibility-of-codepen-embeds/">Improving the keyboard accessibility of Embedded CodePens</a></h3>
<blockquote>
<p>Depending on the colors in a CodePen theme and the browser used, focus styles
are more or less visible. To make sure that focusable elements are
sufficiently highlighted all the time, I added these lines to my custom CSS
file:</p>
</blockquote>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">button:focus,
</div><div class="line" data-line="2">  a:focus &lbrace;
</div><div class="line" data-line="3">    outline: 5px solid #f23c50;
</div><div class="line" data-line="4">    outline-offset: 2px;
</div><div class="line" data-line="5">
</div><div class="line" data-line="6">    transform: rotate(0);
</div><div class="line" data-line="7">&rbrace;
</div></code></pre>
<blockquote>
<p>The outline property highlights the “CSS” button on focus.
Wait! What?Why did you add transform: rotate(0);?</p>
<p>To make sure that other items don’t overlap the outline of the focused item,
I create a new stacking context on focus by applying the transform property
with a value that doesn’t change anything else visually. transform is just
one of many other properties that create a new stacking context.</p>
</blockquote>
<p>🤯🤯🤯</p>
<p><a href="https://matuzo.at/blog/improving-the-keyboard-accessibility-of-codepen-embeds/">Read more...</a></p>
<h3><a href="#clip-sharing-with-overcast--marcoorg" aria-hidden="true" class="anchor" id="clip-sharing-with-overcast--marcoorg"></a><a href="https://marco.org/2019/04/27/overcast-clip-sharing">Clip sharing with Overcast – Marco.org</a></h3>
<blockquote>
<p>For podcasting to remain open and free, we must not leave major shortcomings
for proprietary, locked-down services to exploit.2 Conversely, the more we
strengthen the open podcast ecosystem with content, functionality, and ease
of use, the larger the barrier becomes that any walled garden must overcome
to be compelling.</p>
</blockquote>
<p>My favorite podcast app gets better.</p>
<p><a href="https://marco.org/2019/04/27/overcast-clip-sharing">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Community Post: 40% Keyboard Layouts</title>
       <link>http://evantravers.com/articles/2019/04/20/community-post-40-keyboard-layouts/</link>
       <pubDate>Sat, 20 Apr 2019 15:01:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/04/20/community-post-40-keyboard-layouts/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/04/sa_ice.jpg"></p><p>Over the years... my keyboards have been shrinking. I used to use a full size
keyboard, then I switched to a 60% compact keyboard. These days I've been using
so called 40% keyboards, usually of the ortholinear 4x12 variety.</p>
<p>When people see me using them... they often ask &quot;how do you manage?&quot; As
@snipeye said:</p>
<blockquote>
<p>Snipeye: Boiled down into one word: layers.  In multiple words:
multi-function keys.</p>
</blockquote>
<p>I thought I'd do a compilation blog post of a bunch of people who are currently
using 40%ish keyboards to provide a resource for those looking to make their
own customized layouts for their needs. It takes the form of a quick-ish survey
and the user's responses, if you like what you see, be sure to give them a
shout out next time you see them on github or discord!</p>
<h2><a href="#the-valiant-40-ish-volunteers" aria-hidden="true" class="anchor" id="the-valiant-40-ish-volunteers"></a>The Valiant 40%-ish Volunteers</h2>
<h3><a href="#mindsound" aria-hidden="true" class="anchor" id="mindsound"></a>Mindsound</h3>
<h4><a href="#what-do-you-do-for-a-living" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living"></a>What do you do for a living?</h4>
<p>I'm a software engineer!  These days I mostly do project management but in the past I did C/C++/Java/Golang.</p>
<h4><a href="#is-4x12-your-daily-driver" aria-hidden="true" class="anchor" id="is-4x12-your-daily-driver"></a>Is 4x12 your daily driver?</h4>
<p>Yup!  I have OLKB Plancks at home and at work and I have a couple of Let's
Split's as well.</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout"></a>Could you enclose a picture of the layout?</h4>
<figure>
  <img src="https://i.imgur.com/Bp5jOfo.png" alt="">
  <figcaption>Mindsound's Base Layout</figcaption>
</figure>
<p>I have backlight controls and piezo speaker controls on the &quot;adjust&quot; layer.</p>
<h4><a href="#how-long-have-you-been-working-on-this-layout" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout"></a>How long have you been working on this layout?</h4>
<p>About 2 years now, since I ordered my first Planck in February 2017.</p>
<h4><a href="#what-did-you-base-it-on" aria-hidden="true" class="anchor" id="what-did-you-base-it-on"></a>What did you base it on?</h4>
<p>It's very much based on Jack's default Planck layout, I've just made
quality-of-life tweaks or added features that I personally wanted.  I like
Jack's original layout a lot.</p>
<h4><a href="#what-changes-are-special-to-you" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you"></a>What changes are special to you?</h4>
<p>As far as the typing layout goes, having Ctrl and Esc tap-danced on the same
key (leftmost column on the home row) is a big deal for me.  I also have
MOD_HYPR tap-danced on the left 1u space key, which I use for custom window
management keybindings in Ubuntu.  And I have the bottom left key set up as
media play/pause, which also works with the rotary encoder that I use for media
volume and piezo frequency on my rev 6: <a href="https://www.youtube.com/watch?v=BxFF0VKFg-M">video here!</a></p>
<p>In terms of general QMK features, I have piezo speaker code that I helped write
-- Drashna got it into master for me -- and backlight flickering code that I
wrote, having that stuff around as (more or less) fidget toys is awesome.</p>
<h4><a href="#what-are-you-thinking-of-trying-next" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next"></a>What are you thinking of trying next?</h4>
<p>I'd like to hook an outboard AC-powered solenoid to one of the breakout headers
on the rev 6.  :)  I also have some more complex piezo speaker code that I
shelved for other life stuff, I hope to get back to that someday.</p>
<h4><a href="#would-you-mind-sharing-a-link-to-the-source-for-your-layout" aria-hidden="true" class="anchor" id="would-you-mind-sharing-a-link-to-the-source-for-your-layout"></a>Would you mind sharing a link to the source for your layout?</h4>
<p>Sure!  I love the new community layout directory in QMK, I can use <a href="https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ortho_4x12/mindsound/keymap.c">this keymap
for all 4 of my 4x12 boards</a>.</p>
<h3><a href="#nimmoomoo" aria-hidden="true" class="anchor" id="nimmoomoo"></a>NimMooMoo</h3>
<h4><a href="#what-do-you-do-for-a-living-1" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living-1"></a>What do you do for a living?</h4>
<p>I'm a Software Test Automation Engineer, so I dabble in programming, but nothing overly complex.</p>
<h4><a href="#is-4x12-your-daily-driver-1" aria-hidden="true" class="anchor" id="is-4x12-your-daily-driver-1"></a>Is 4x12 your daily driver?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/nimmoomoo_planck.png" alt="nimmoomo's planck" /></p>
<p>It is at the office, but not at home.</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout-1" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout-1"></a>Could you enclose a picture of the layout?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/nimmoomoo.png" alt="nimmoomoo's layout" /></p>
<p><a href="https://github.com/WemansG90/qmk_firmware/tree/nim_keymaps/keyboards/planck/keymaps/nim">Link to the Readme on github</a></p>
<h4><a href="#how-long-have-you-been-working-on-this-layout-1" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout-1"></a>How long have you been working on this layout?</h4>
<blockquote>
<p>6 months,. It's still getting tweaked now and again, when I notice I need a
specific key in a different place, so I wouldn't classify it as being done.
Eg. Having both Right and Left alt bound, due to deadkey characters</p>
</blockquote>
<h4><a href="#what-did-you-base-it-on-1" aria-hidden="true" class="anchor" id="what-did-you-base-it-on-1"></a>What did you base it on?</h4>
<p>Just the default layout for the Planck Rev6</p>
<h4><a href="#what-changes-are-special-to-you-1" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you-1"></a>What changes are special to you?</h4>
<p>Nothing that out of the ordinary I'd think. The ShareX keybinds probably, as I
need to make screenshots quite often while testing.</p>
<h5><a href="#sharex-keybinds" aria-hidden="true" class="anchor" id="sharex-keybinds"></a>ShareX Keybinds</h5>
<ul>
<li><strong>KC_CAPW</strong> : Capture the whole screen</li>
<li><strong>KC_CAPA</strong> : Capture active window</li>
<li><strong>KC_CAPP</strong> : Capture portion of the screen (The mouse cursor selection box)</li>
</ul>
<h5><a href="#space-savers" aria-hidden="true" class="anchor" id="space-savers"></a>Space Savers</h5>
<ul>
<li><strong>KC_ESCC</strong> : Control when you hold down the key, Escape when you tap it</li>
<li><strong>KC_ENTS</strong> : Shift when you hold down the key, Enter when you tap it</li>
</ul>
<h5><a href="#rotary-encoder" aria-hidden="true" class="anchor" id="rotary-encoder"></a>Rotary Encoder</h5>
<ul>
<li>KC_LOCK : Super+ L, aka the Windows &quot;lock my session&quot; combination</li>
</ul>
<h4><a href="#what-are-you-thinking-of-trying-next-1" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next-1"></a>What are you thinking of trying next?</h4>
<p>Nothing drastic, at least not 4x12 wise. I'm planning to do a second Iris, so I
might refine that keymap and try to unify the Planck layout accordingly.</p>
<h3><a href="#bakingpy" aria-hidden="true" class="anchor" id="bakingpy"></a>bakingpy</h3>
<h4><a href="#what-do-you-do-for-a-living-2" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living-2"></a>What do you do for a living?</h4>
<p>Software Engineer.</p>
<h4><a href="#is-4x12-your-daily-driver-2" aria-hidden="true" class="anchor" id="is-4x12-your-daily-driver-2"></a>Is 4x12 your daily driver?</h4>
<p>Yes, a split one.</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout-2" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout-2"></a>Could you enclose a picture of the layout?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/bakingpy.png" alt="bakingpy's base layers" />
<a href="https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ortho_4x12/bakingpy/keymap.c">Self documenting code here</a></p>
<h4><a href="#how-long-have-you-been-working-on-this-layout-2" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout-2"></a>How long have you been working on this layout?</h4>
<p>Spent about a month tweaking it after using something close to the default
layout for 3 months</p>
<h4><a href="#what-did-you-base-it-on-2" aria-hidden="true" class="anchor" id="what-did-you-base-it-on-2"></a>What did you base it on?</h4>
<p>Default Planck layout</p>
<h4><a href="#what-changes-are-special-to-you-2" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you-2"></a>What changes are special to you?</h4>
<p>Swapping meaning of lower and raise so I could put numpad on right hand by
pressing lower; macOS screenshot keys; easy access to arrow keys using just one
hand (left or right)</p>
<h4><a href="#what-are-you-thinking-of-trying-next-2" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next-2"></a>What are you thinking of trying next?</h4>
<p>Maybe move around the media control keys to a place I can remember them.</p>
<h4><a href="#would-you-mind-sharing-a-link-to-the-source-for-your-layout-1" aria-hidden="true" class="anchor" id="would-you-mind-sharing-a-link-to-the-source-for-your-layout-1"></a>Would you mind sharing a link to the source for your layout?</h4>
<p><a href="https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ortho_4x12/bakingpy/keymap.c">Here you go</a>.</p>
<h3><a href="#jetpacktuxedo" aria-hidden="true" class="anchor" id="jetpacktuxedo"></a>jetpacktuxedo</h3>
<h4><a href="#what-do-you-do-for-a-living-3" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living-3"></a>What do you do for a living?</h4>
<p>Software engineer, mostly python dev</p>
<h4><a href="#is-4x12-your-daily-driver-3" aria-hidden="true" class="anchor" id="is-4x12-your-daily-driver-3"></a>Is 4x12 your daily driver?</h4>
<figure class="thirds">
  <img src="https://images.evantravers.com/articles/2019/04/jetpack_planck.JPG" alt="">
  <img src="https://images.evantravers.com/articles/2019/04/jetpack_amj40.JPG" alt="">
  <img src="https://images.evantravers.com/articles/2019/04/jetpack_kumo.JPG" alt="">
  <figcaption>Planck</figcaption>
  <figcaption>AMJ40v2</figcaption>
  <figcaption>Kumo</figcaption>
</figure>
<p>My planck is more a secondary than a primary... I keep it on my desk and use it
frequently, but my current daily is my kumo, and my previous daily was an
amj40. I still use the planck regularly, just not my main</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout-3" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout-3"></a>Could you enclose a picture of the layout?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/jetpacktuxedo.png" alt="jetpacktuxedo's layout" /></p>
<h4><a href="#how-long-have-you-been-working-on-this-layout-3" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout-3"></a>How long have you been working on this layout?</h4>
<p>Since about October or so? a bit over 6 months?</p>
<h4><a href="#what-did-you-base-it-on-3" aria-hidden="true" class="anchor" id="what-did-you-base-it-on-3"></a>What did you base it on?</h4>
<p>It is heavily inspired by <a href="https://github.com/qmk/qmk_firmware/tree/master/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo">my minivan
layout</a>
which in turn was designed to minimize the learning curve when transitioning
from a more traditional format of keyboard.</p>
<h4><a href="#what-changes-are-special-to-you-3" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you-3"></a>What changes are special to you?</h4>
<p>Having Enter in a more normal place is huge for me as it allows me to have my
right shift back (I'm a right shift kinda guy I guess). Second would probably
be putting my arrows back in a traditional inverted T instead of all in a line.</p>
<p>The minivan layout has been in use since I got my first van in like January
2017 I think? Obviously some changes have been made since then, but not really
that many tbh. Most of what I said about the Planck layout still applies since
they have a lot in common.</p>
<p>I think the &quot;weirdest&quot; part of my van layout is that I don't actually use split
space lol. I map both spacebars to be space when tapped and FN1 when held, and
then I map both tab and enter to dual function as FN2.</p>
<p>My biggest &quot;oh yeah, that just makes sense&quot; thing on all of my 40s layouts is
that FN2 (or lower on the Planck) is almost litteraly just FN1 (or raise +
shift). It's not really needed at all, but I didn't want to hold FN1+shift +
tap the actual key I want.</p>
<p>The arrow keys doubling as pgup/pgdn/home/end is actually stolen from chromeOS
lol. I've mapped that on every programmable board I've owned, 40 or not.</p>
<p>Oh, I also have started mirroring -=;' over to FN1+asdf because my amj40 layout
doesn't have the extra ; key on the right (40 vs 45 <code>¯\_(ツ)_/¯</code>). That makes it
a bit easier for me to swap between my amj40s and my vans/plancks</p>
<p>I think trying to adapt the same setup to fit on a pearl caused a bunch of
issues, so my keymap for that is a little bit different... I don't really
remember where the issues were though.</p>
<p>A bunch of people have adapted my minivan layout to fit their own needs, too.
I've had at least a few people message me about it.</p>
<p>Plus I have a spare van just to lend to people that I flash with that layout,
and most people that try that as their first foray into 40s have kept it and
commented that it was pretty easy to adjust to.</p>
<p>I think I might actually move my spacebar 1u to the right (fat thumb layout on
rev6 makes it possible), and move raise/lower to be dual function on
space/tab/enter like my van, which would let me shift ctrl/win/alt two keys to
the right which makes them more thumbable... but I have a rotary encoder bottom
left which breaks my ctrl/win/alt muscle memory :/ otherwise I usually do them
with my pinky</p>
<h4><a href="#what-are-you-thinking-of-trying-next-3" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next-3"></a>What are you thinking of trying next?</h4>
<p>I will probably end up moving /? to be dual function on right shift like my
other 40s, but idk what else  to use that key for...</p>
<h4><a href="#would-you-mind-sharing-a-link-to-the-source-for-your-layout-2" aria-hidden="true" class="anchor" id="would-you-mind-sharing-a-link-to-the-source-for-your-layout-2"></a>Would you mind sharing a link to the source for your layout?</h4>
<p><a href="https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jetpacktuxedo/keymap.c">Here you go!</a></p>
<h4><a href="#why-do-you-stick-with-a-40" aria-hidden="true" class="anchor" id="why-do-you-stick-with-a-40"></a>Why do you stick with a 40%?</h4>
<p>I like having backspace closer 😂
It's just comfortable.
Also they are cute.</p>
<p>A close backspace is definitely what I miss most anytime I am back on a larger
board.</p>
<h3><a href="#kauyon-kais" aria-hidden="true" class="anchor" id="kauyon-kais"></a>Kauyon Kais</h3>
<h4><a href="#what-do-you-do-for-a-living-4" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living-4"></a>What do you do for a living?</h4>
<p>I'm working on my bachelor's degree in Human-Computer-Systems, but also am a
half-time employee at a webdev company.</p>
<h4><a href="#is-40ish-your-daily-driver" aria-hidden="true" class="anchor" id="is-40ish-your-daily-driver"></a>Is 40%ish your daily driver?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/kauyon_original.jpg" alt="Kayoun's Daily Driver" /></p>
<p>Yes. The only time I use my Kantana60 is for gaming.</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout-4" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout-4"></a>Could you enclose a picture of the layout?</h4>
<figure>
  <img src="https://images.evantravers.com/articles/2019/04/kauyon.png" alt="">
  <figcaption>
    Sure! <a href="http://www.keyboard-layout-editor.com/#/gists/b7d1a738a2cf9e5d26c9b1a13e5d0efc">This is all layers, mod taps and so on.</a>
  </figcaption>
</figure>
<h4><a href="#how-long-have-you-been-working-on-this-layout-4" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout-4"></a>How long have you been working on this layout?</h4>
<p>Hard to say. It developed over a few keyboards. A a week for each iteration,
plus another week of &quot;hotfixing&quot;. So a bit over a month, maybe.</p>
<h4><a href="#what-did-you-base-it-on-4" aria-hidden="true" class="anchor" id="what-did-you-base-it-on-4"></a>What did you base it on?</h4>
<p>Most layers aren't based on anything specifically. A mirrored-shifted numpad
seemed like the easiest way to remember how the special characters are placed.
Navcluster with home/end and page up/down just fell in place. The Z/X/C
Ctrl/Win/Alt modtaps were inspired by keymaps using homerow modtap keys for
layers and mods.</p>
<p>My alphas are taken from the zxcv-locked qwerty-optimization carpalx
(<a href="http://mkweb.bcgsc.ca/carpalx/?full_optimization">http://mkweb.bcgsc.ca/carpalx/?full_optimization</a> Figure 4). I'm on my third
of three stages switching from QWERTY to carpalx and while the change itself is
hard, it was definitely worth it for me.</p>
<h4><a href="#what-changes-are-special-to-you-4" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you-4"></a>What changes are special to you?</h4>
<p>I don't think I've seen double-tap &quot; on ; (or H for me) before. But aside from
space related necessities, I think my keymaps aren't too special, carpalx
aside.</p>
<h4><a href="#what-are-you-thinking-of-trying-next-4" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next-4"></a>What are you thinking of trying next?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/kayoun_new.jpg" alt="5x3 crkbd" /></p>
<p>There's a few things. Keymap wise I want to try out more homerow oriented
modtapping and tapdancing. When it comes to keyboards, I'm currently building a
5x3 crkbd and the idea of a 5x3 Dactyl style keyboard won't leave my head
either, so that's going to be made at some point as well.</p>
<h4><a href="#would-you-mind-sharing-a-link-to-the-source-for-your-layout-3" aria-hidden="true" class="anchor" id="would-you-mind-sharing-a-link-to-the-source-for-your-layout-3"></a>Would you mind sharing a link to the source for your layout?</h4>
<p>Sure! <a href="https://github.com/KauyonKais/qmk_firmware/tree/fnh/keyboards/fnh/keymaps/kk">Link here...</a></p>
<h4><a href="#why-do-you-choose-to-use-a-smaller-keyboard" aria-hidden="true" class="anchor" id="why-do-you-choose-to-use-a-smaller-keyboard"></a>Why do you choose to use a &quot;smaller&quot; keyboard?</h4>
<p>It's nicer to type on. When I switched from a regular board to a 4x12, typing
already was way more relaxed. Layers and thumbkeys are the true blessing of
smaller/non-standard boards. I bought a Katana60 later on because I liked the
idea and soon realized that the distance between the hands was way more
enjoyable. With my current board, I got rid of the most outer column for each
hand, since the movement to these keys is far from great for the pinky finger
and what better way to keep myself from using that column than to cut it?</p>
<p>The whole point is forced ergonomics for me and while it took a while to get
used to it, I'm glad I gave it a shot.</p>
<h3><a href="#snipeye" aria-hidden="true" class="anchor" id="snipeye"></a>Snipeye</h3>
<h4><a href="#what-do-you-do-for-a-living-5" aria-hidden="true" class="anchor" id="what-do-you-do-for-a-living-5"></a>What do you do for a living?</h4>
<p>I am a programmer for a living, usually working in Javascript or Java.   For a
future living, I'm a full-time student studying computer engineering (splits
the difference between electrical engineering, because I love hardware, and
computer science, because I love programming).</p>
<h4><a href="#is-4x12-your-daily-driver-4" aria-hidden="true" class="anchor" id="is-4x12-your-daily-driver-4"></a>Is 4x12 your daily driver?</h4>
<figure>
  <img src="https://images.evantravers.com/articles/2019/04/snipeye.jpg" alt="snipeye's amazing build">
  <figcaption>
    Snipeye's amazing build... which features mouse functionality!
  </figcaption>
</figure>
<p>&quot;Dichotomy,&quot; which has 48 (sorta 50) keys is my daily driver at work, but I
don't bring it around with me.</p>
<h4><a href="#could-you-enclose-a-picture-of-the-layout-5" aria-hidden="true" class="anchor" id="could-you-enclose-a-picture-of-the-layout-5"></a>Could you enclose a picture of the layout?</h4>
<p><img src="https://images.evantravers.com/articles/2019/04/snipeye.png" alt="snipeye's layout" /></p>
<ul>
<li>So the keys in red are tap/hold keys.  If you tap, you get default behavior,
if you hold, you get secondary behavior.</li>
<li>The center (black) is default, base layer for everything.</li>
<li>The green is number layer, activated by &quot;num&quot; (far left center)</li>
<li>That layer can be toggled - if you just press &quot;num&quot; and release it - or used
as a modifier, like &quot;shift&quot; - so &quot;num + D&quot; = 4, but when you release
everything you're not still on the number layer</li>
<li>The receiver turns green to indicate number layer</li>
<li>The blue keys (right side of the key, and some audio emojis) are the mouse
layer</li>
<li>Same deal with activating it - temporary or toggle</li>
<li>Receiver turns blue to indicate mouse layer</li>
<li>The shift key (bottom far left) is normal shift, like you would expect, but
the &quot;uppercase&quot; of some keys have been changed - for instance, the green 9
and 0 and the base layer &quot;,&quot; and &quot;.&quot;</li>
<li>beacuse I moved those to the thumb cluster.  Not totally in love with it but
it works.</li>
<li>The shift can be a toggle - so if you just tap shift, it turns on caps lock</li>
<li>if you use shift as normal, it works like normal</li>
<li>The two rotary encoder buttons (blank here) are both set as mouse 3 (pressing
the scroll wheel down)</li>
<li>Right rotary encoder is vertical scrolling, left is horizontal scrolling</li>
<li>Oh, and the tap/hold numbers on Q through P are not enabled by default</li>
<li>To turn that on, you have to press both control keys at the same time.</li>
</ul>
<p>... I THINK that's it.  And that tap/hold numbers on Q-P aren't in the QMK repo
yet, I haven't pushed that.</p>
<h4><a href="#how-long-have-you-been-working-on-this-layout-5" aria-hidden="true" class="anchor" id="how-long-have-you-been-working-on-this-layout-5"></a>How long have you been working on this layout?</h4>
<p>This has been in development for over a year, but I know other people with
Dichotomy use vastly different configurations.  It's based primarily on QWERTY,
honestly - this is my first custom, and I didn't want to try to change too
dramatically.</p>
<h4><a href="#what-changes-are-special-to-you-5" aria-hidden="true" class="anchor" id="what-changes-are-special-to-you-5"></a>What changes are special to you?</h4>
<p>Special changes for me... I reinvented the wheel a couple times.  The tap-hold
across the top-row (as well as the momentary/toggle for the layer switching) is
all hand-written, though it would have been way easier to just use the features
already baked into QMK.  The REALLY special change for me is that this whole
thing (each half, wireless) is also a mouse in addition to a keyboard.  This
way I put my hands down and don't have to keep shifting them between keyboard
and mouse.  Not mouse keys, mind you, an actual mouse - you drag the whole
thing around.</p>
<h4><a href="#what-are-you-thinking-of-trying-next-5" aria-hidden="true" class="anchor" id="what-are-you-thinking-of-trying-next-5"></a>What are you thinking of trying next?</h4>
<p>Next I'm building an absurdly-large, battleship-class keyboard with as many
features as I can possibly shove into it.  I'm also looking into trying out
trackballs.  I love experimenting with new input methods.</p>
<p>Why do I use a small keyboard?  Not sure.  I really am not liking not having
enough keys, and switching between layers often slows me down.  So the real
why, right now, is because this keyboard is a derivative of Mitosis, and this
is the most keys I could shove into it.</p>
<h4><a href="#would-you-mind-sharing-a-link-to-the-source-for-your-layout-4" aria-hidden="true" class="anchor" id="would-you-mind-sharing-a-link-to-the-source-for-your-layout-4"></a>Would you mind sharing a link to the source for your layout?</h4>
<p><a href="https://github.com/qmk/qmk_firmware/blob/master/keyboards/dichotomy/keymaps/default/keymap.c">Here you go.</a></p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>Thank you to everyone who participated and contributed their information and
photos...</p>
<ul>
<li>Mindsound</li>
<li>NimMooMoo</li>
<li>bakingpy</li>
<li>jetpacktuxedo</li>
<li>Kauyon Kais</li>
<li>Snipeye</li>
</ul>
<p>If you have another cool layout or trick, I'd love to <a href="/contact">hear about it</a>!</p> ]]></description>
    </item>
    <item>
       <title>My Keyboard Setup</title>
       <link>http://evantravers.com/articles/2019/04/03/my-keyboard-setup/</link>
       <pubDate>Wed, 03 Apr 2019 21:51:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/04/03/my-keyboard-setup/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/04/keyboard.jpg"></p><p>I use my keyboard to control my computer as much as possible. By using a
keyboard to navigate, launch, and manage your applications and data, you can be
faster and more accurate than with just a mouse because you can put
combinations and chords into your muscle memory.</p>
<p>Here's more information than you <em>ever</em> wanted to know.</p>
<h2><a href="#controlling-your-keyboard" aria-hidden="true" class="anchor" id="controlling-your-keyboard"></a>Controlling your keyboard</h2>
<p>I used to remap tons of things on my keyboards, but I've worked it down to two
main ones: I need my keyboard to have a <code>CTRL</code> key where Caps Lock normally is
(inspired by <a href="http://stevelosh.com/blog/2012/10/a-modern-space-cadet/">&quot;Modern Space Cadet&quot; by Steve
Losh</a>) and I need an
F19 key to fire off a second layer of &quot;Hyper&quot; key chords.</p>
<p>That special Hyper Key goes to some program that can change it into the
mega-chord of <code>CMD+SHIFT+OPT+CTRL</code>... which is not used anywhere else in the
OS. That way I can be sure when I define a shortcut I'm not overriding anything
else!</p>
<p>I use <a href="https://pqrs.org/osx/karabiner/">karabiner elements</a> to remap my built
in laptop keyboard. I use <a href="https://qmk.fm">QMK</a> to rewrite the firmware for all
my <a href="/articles/2018/09/12/i-built-a-keyboard/">mechanical keyboards</a>, so they
&quot;natively&quot; have an F19. Both configurations put the F19 as the bottom left key
on the keyboard, where FN usually goes.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/04/keyboard-layout.png" alt="older image of my planck layout">
  <figcaption>
    A mostly up to date representation of my 4x12 ortho layout. There are at
    least two other layers not represented.
  </figcaption>
</figure>
<h2><a href="#hyper" aria-hidden="true" class="anchor" id="hyper"></a>Hyper</h2>
<p>My hyper key does a few things: launches/focuses different common apps, moves
and aligns windows, and fires some small scripts that I've written.</p>
<p>I mostly used it to switch between my terminal and my browser in my work as a
front-end developer. Using iTerm's non-native full screen, it meant I could
have a focused full screen environment without the .25s animation that goes
with OSX's built in full screen. Once you try it, you can't go back to CMD+TAB.</p>
<p>I have gone through several different versions of the &quot;Hyper&quot; setup.
Originally, I followed the original blog post to the letter, using Keyboard
Maestro. Later I rebuilt it using Alfred workflows... mostly to try and cut
down on the amount of applications I was using. Both of these were a little
slow.</p>
<p>Since discovering <a href="https://www.hammerspoon.org/">hammerspoon</a>, I've been using
that as an abstraction layer to fire and control my mac from my keyboard. It's
been <em>way</em> faster for app switching than Keyboard Maestro or Alfred, and
because it's code I can check it into git and sync it between my work and home
computer.</p>
<h2><a href="#hyper-hammerspoon" aria-hidden="true" class="anchor" id="hyper-hammerspoon"></a>Hyper Hammerspoon</h2>
<p>My full hammerspoon config is
<a href="https://github.com/evantravers/hammerspoon-config/blob/7f4bd45dcf8f3c4801634003fc36ed68951b2be6">here</a>. A quick walkthrough:</p>
<p>My main configuration file is
<a href="https://github.com/evantravers/hammerspoon-config/blob/7f4bd45dcf8f3c4801634003fc36ed68951b2be6/init.lua">init.lua</a>. It
contains a list of applications. I can set what monitor I prefer them to be on
for my window manager, I can set a hotkey for launching/focus, and I can also
set a list of hotkeys I want to make available for use inside that application,
all under my Hyper layer.</p>
<p>There is a plethora of keyboard shortcuts on OSX, and using the Hyper key layer
means that I can have universal shortcuts that work regardless of what
application I have focused without worrying about accidentally doing something
in my current application.</p>
<p>When an F19 key is pressed,
<a href="https://github.com/evantravers/hammerspoon-config/blob/7f4bd45dcf8f3c4801634003fc36ed68951b2be6/hyper.lua">hyper.lua</a>
is listening and invokes a layer that fires actions based on the list in
init.lua. If the application for which the shortcut key is pressed isn't open,
it opens it and then presses the key again. This lets me have a button that
always opens a new Drafts.app draft or a new Tweetbot tweet... even if the
application isn't open yet.</p>
<figure>
  <iframe height="315" src="https://www.youtube-nocookie.com/embed/hmkp0Ox6TIo?rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  <figcaption>
    <p>
      Here, I demonstrate how quickly I can switch between my terminal and
      browser, without app switcher, just from my keyboard.
    </p>
<pre class="lumis"><code class="language-plaintext" translate="no" tabindex="0"><div class="line" data-line="1">&lt;p&gt;
</div><div class="line" data-line="2">  I&#39;m using &lt;a href=&quot;https://github.com/keycastr/keycastr&quot;&gt;Keycastr&lt;/a&gt; so
</div><div class="line" data-line="3">  you can see what I&#39;m typing... when Hammerspoon handles the F19 and doesn&#39;t
</div><div class="line" data-line="4">  send the hyperchord, you&#39;ll see a weird question mark.
</div><div class="line" data-line="5">&lt;/p&gt;
</div></code></pre>
  </figcaption>
</figure>
<p>I also make the hyper layer available to my scripts for moving windows and
starting timers, so that they are always one key away, no matter what
application I'm in. <a href="/articles/2018/10/02/pomodoro-in-hammerspoon/">I've detailed the pomodoro
timer</a> elsewhere, but the move
windows script is partially written by <a href="https://github.com/tmiller">Tom Miller</a>
with some modifications by me.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/04/workstation.jpg" alt="Picture of a workstation">
  <figcaption>
    Full description of the setup
    <a href="https://www.reddit.com/r/Battletops/comments/aez461/this_is_where_i_type_the_codes/">here</a>.
  </figcaption>
</figure>
<p>Thanks to some help from <a href="https://github.com/megalithic/">@megalithic</a> and
<a href="https://github.com/Hammerspoon/hammerspoon/issues/2041">nice people using
hammerspoon</a> I also
have hammerspoon automatically throwing applications to the windows I prefer
them to live as soon as I add or remove a monitor. This is very handy for when
I come back to my workstation after being in a meeting.</p>
<p>The latest addition is a <a href="https://github.com/evantravers/hammerspoon-config/blob/7f4bd45dcf8f3c4801634003fc36ed68951b2be6/airpods.lua">simple script that
connects/disconnects</a>
my Airpods with a single button.</p>
<h2><a href="#keyboard-interfaces-to-other-applications" aria-hidden="true" class="anchor" id="keyboard-interfaces-to-other-applications"></a>Keyboard Interfaces to other Applications</h2>
<p>Besides using <a href="/articles/tags/vim">vim</a> and <a href="https://evantravers.blogspot.com/2009/08/mac-productivity-tip-of-day-using-help.html">memorizing as many
shortcuts</a>
as possible, I use a couple of other tools to keep my hands on home row.</p>
<h3><a href="#alfred" aria-hidden="true" class="anchor" id="alfred"></a>Alfred</h3>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2019/04/alfred.png" alt="alfred">
</figure>
<p>I've been using an <a href="https://www.youtube.com/watch?v=9YKfhJ-JzgM">app launcher for a long
time</a>. I think I heard Merlin Mann
talk about the <a href="https://www.youtube.com/watch?v=d4LkTstvUL4">quicksilver talk at
google</a> on an old Macbreak Weekly.
I believe the dev was subsequently hired by google, but that video alone made
me buy a Mac as my next computer.</p>
<p>Since then I've used Quicksilver, Launchbar, and now Alfred. For more
information about why Alfred and an overview of the general usefulness of
Alfred, check out the <a href="https://thesweetsetup.com/apps/our-favorite-os-x-launcher/">excellent review over at the
sweetsetup</a>, but
here are a few of the more esoteric things I use it for:</p>
<ul>
<li><a href="http://www.packal.org/workflow/audio-switch">Switching audio inputs</a></li>
<li><a href="http://joelcalifa.com/blog/alfred-emoji-snippet-pack/">Slack-style emojis everywhere via snippets</a></li>
<li>Clipboard history/merging</li>
<li><a href="https://github.com/g1eny0ung/Alfred-Colors-workflow">Color picking</a></li>
<li>Access to <a href="https://kapeli.com/dash">Dash.app</a></li>
<li><a href="https://github.com/mermaid/mojave-darkmode-toggle">Toggling my OSX theme</a> from Dark/Light... why not!</li>
</ul>
<h3><a href="#vimium" aria-hidden="true" class="anchor" id="vimium"></a>Vimium</h3>
<p>I really like Vim's modal interface. I've found that Vim's shortcuts are in my
fingers and therefore I tend to use it everywhere that I can.</p>
<figure>
  <iframe height="315" src="https://www.youtube-nocookie.com/embed/OEWgcmPqk-E?rel=0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  <figcaption>
    Here I'll use some basic vimium features to scroll, open some tabs, and
    open tabs in background. It has more power, but that's what we are mostly
    doing on the intertubes, right?
  </figcaption>
</figure>
<p>There's an awesome family of plugins for web browsers that bring some of those
shortcuts to vim, both in terms of search and scrolling, but also interacting
with links. I mostly use it to navigate, using the <code>f</code> operator to open links
that are interesting to me.</p>
<h3><a href="#osx-readline" aria-hidden="true" class="anchor" id="osx-readline"></a>OSX Readline</h3>
<p>OSX has a rather robust version of <a href="https://readline.kablamo.org/emacs.html">readline
shortcuts</a> available everywhere
there's a cursor. I use <code>&lt;C-a&gt;</code> and <code>&lt;C-e&gt;</code> constantly... you can find a full
list <a href="https://jblevins.org/log/kbd">here</a>.</p>
<p>I'm constantly surprised that it has an <a href="https://twitter.com/ttscoff/status/1112901323593314305">actual killring
register</a> separate from
the built in clipboard. It's occasionally very handy.</p>
<h3><a href="#osx-keyboard-pref-pane" aria-hidden="true" class="anchor" id="osx-keyboard-pref-pane"></a>OSX Keyboard Pref Pane</h3>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2019/04/keyboard-shortcuts.png" alt="OSX Pref Pane -&gt; Keyboard -&gt; Shortcuts -&gt; App Shortcuts">
</figure>
<p>I do have one more configuration trick: I use the built-in keyboard shortcuts
pane to rebind keys. There's a bit of a trick to it, you have to put in the
<em>precise</em> name of the Menu item and a keyboard shortcut... even counts
ellipsis or specific possessive apostrophes. I'll rebind some keys to more
familiar positions, or more often unbind shortcuts that interfere with OSX's
built in readline shortcuts. (Looking at you, Sketch.app!)</p>
<h3><a href="#osx-help-menu" aria-hidden="true" class="anchor" id="osx-help-menu"></a>OSX Help Menu</h3>
<p>I've <a href="https://evantravers.blogspot.com/2009/08/mac-productivity-tip-of-day-using-help.html">known this one for a long
time</a>,
but a lot of people haven't realized: if you hit <code>CMD+SHIFT+/</code> (basically
<code>CMD+?</code>) in most OSX apps it'll focus the search box in the Help menu. It
searches <em>every</em> menubar in the application. I originally used it to find
things in Photoshop that I had forgotten where they were... but now I just use
it to quickly access the menubar.</p>
<p>Apparently there's a way to do this even faster/better using BetterTouchTool or
Hammerspoon, I may look into that. I'll use
<a href="https://sketchrunner.com">SketchRunner</a> for this in Sketch.app.</p>
<h3><a href="#qmk-layers" aria-hidden="true" class="anchor" id="qmk-layers"></a>QMK Layers</h3>
<p><img src="https://images.evantravers.com/articles/2019/04/extra-shortcuts.png" alt="more shortcut layers" /></p>
<p>I have adopted the ortholinear keyboard full time... and it's led to a couple
interesting changes.</p>
<p>I have a key on the right side of the keyboard that converts a portion of the
right side to a tenkey, making entering numbers a little faster with one hand.
I also have another layer for when I hold the tab key... it makes the top row
(QWERT) send CMD+1-4, a common OSX shortcut for switching tabs, focusing
certain views... I've also bound a couple other convenience functions so that
my left hand can reach all the things that I need for designing while my right
hand is on my mouse.</p>
<p>There is a layer for gaming too if I'm using a 4x12 board, but that's another
blog post.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>After typing portions of this into slack a few times, I finally decided to put
it all in one article... at least for now. It'll change in another year I'm
sure. Regardless of what parts you decide to implement and how, I think that
being efficient with tasks through automation or scripting can make you a more
effective information worker. The parts that I can't do without anymore:</p>
<ul>
<li>jumping to apps</li>
<li>searching for/inside files quickly and acting on them</li>
</ul>
<p>I think that a decade of tweaking how I move between programs on my computer
has landed me in a good place, I'm now more interested in doing more automation
for repetitive or predictable tasks. Stay tuned!</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References:</h2>
<h3><a href="#inspiration" aria-hidden="true" class="anchor" id="inspiration"></a>Inspiration</h3>
<ul>
<li><a href="http://stevelosh.com/blog/2012/10/a-modern-space-cadet/">A Modern Space Cadet / Steve Losh</a></li>
<li><a href="https://brettterpstra.com/2017/06/15/a-hyper-key-with-karabiner-elements-full-instructions/">A Hyper Key with Karabiner Elements, full instructions - BrettTerpstra.com</a></li>
<li><a href="https://github.com/megalithic/dotfiles/tree/master/hammerspoon">dotfiles/hammerspoon at master · megalithic/dotfiles · GitHub</a></li>
</ul>
<h3><a href="#tools-used" aria-hidden="true" class="anchor" id="tools-used"></a>Tools Used</h3>
<ul>
<li><a href="https://qmk.fm">QMK Firmware</a></li>
<li><a href="https://pqrs.org/osx/karabiner/">Karabiner</a></li>
<li><a href="https://www.hammerspoon.org/">Hammerspoon</a></li>
<li><a href="https://www.alfredapp.com">Alfred</a></li>
<li><a href="https://vimium.github.io">Vimium</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Books and Links: March</title>
       <link>http://evantravers.com/articles/2019/03/31/books-and-links-march/</link>
       <pubDate>Sun, 31 Mar 2019 01:01:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/03/31/books-and-links-march/</guid>
       <description><![CDATA[ <h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>Good month for books! Setting hard limits on social media time really works.</p>
<p>I read Norse Mythology by Neil Gaiman. While I was already pretty familiar with
the stories, hearing them in Gaiman's dry sardonic tones was a treat. He has a
mastery of holding both the cultural weight of an millenia-old oracular myth
and the quiet joy of the fireside storyteller. Great read, although it may be a
little shocking to those whose main exposure to Odin, Thor, and Loki is from
their toned-down Marvel movie counterparts.</p>
<p>I also read Masters of Doom... this one is about the making of one of the first
big computer games. Another tale I was pretty familiar with, but still an
exciting reminder of how far we have come so fast in this industry. I would
also point to it as an example of what happens to relationships when people put
products in front of people. Some unneeded language for accuracy to
personalities involved.</p>
<p>Since comics are now part of Amazon Prime Reading, I finally read Fables 1:
Legends in Exile. It was a fun concept, and far more interesting than Once Upon
a Time. Content warning: some PG depictions of romance.</p>
<p>I read Hyperion by Dan Simmons. I can <strong>not</strong> recommend it because of some <em>heavy</em>
language and intentionally gross depictions of romantic encounters... but
there’s an undercurrent in the book about time and love that spoke to me… each
tale had interesting notes about about how we are separated by time, but it
doesn't always move the same speed... we catch up, meet, pass, experience loss
and love differently in different stages of life.</p>
<p>The scholar’s tale about the father whose daughter starts aging backwards
really grabbed hold of me. It spoke beautifully both about the magic of a child
becoming an adult... and as the scholar's daughter slowly moves backwards
through those milestones that I am enjoying now, losing them forever... Made me
hold Sophie a little tighter. As Ursula Le Guin says, <a href="http://theliterarylink.com/leguinintro.html">Science fiction is not
predictive; it is descriptive. </a></p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>I've been deleting instagram and games off my phone, so a lot more reading of
blog posts and twitter ensued. :P</p>
<p>I also updated my <a href="http://ifttt.com">ifttt.com</a> scripts to post everything I
like or comment on in Instapaper into a folder, and wrote a quick elixir script
to get all that into this blog post with ease... good idea? Who knows. Here's
a selection from what I read and liked this month:</p>
<h3><a href="#addition-font" aria-hidden="true" class="anchor" id="addition-font"></a><a href="http://litherum.blogspot.com/2019/03/addition-font.html">Addition Font</a></h3>
<blockquote>
<p>You can use the glyph stream as memory by reading and writing to it; that is,
after all, what the shaping algorithm is designed to do. You can delete a
glyph by using Type 2 to map it to an empty sequence. You can insert a glyph
by using Type 2 to map the preceding glyph to a sequence of [itself, the new
glyph you want to insert]. And, once you’ve inserted a glyph, you can check
for its presence by using the “if” statements described above.</p>
<p>So thats a pretty powerful virtual machine. I think the above is sufficient
to prove Turing complete-ness.</p>
</blockquote>
<p>The basic infrastructure of <em>every</em> part of writing software is <em>complicated</em>.
Even the system required to correctly represent written words on this page is
complex enough to contain entire programs.</p>
<p><a href="http://litherum.blogspot.com/2019/03/addition-font.html">Read more...</a></p>
<h3><a href="#unsolved-problems-by-beth-dean" aria-hidden="true" class="anchor" id="unsolved-problems-by-beth-dean"></a><a href="https://adactio.com/journal/14897">Unsolved Problems by Beth Dean</a></h3>
<blockquote>
<p>The British government offered a bounty for cobras in India. So people bred
snakes for the bounty. So they got rid of the bounty …and then all those
snakes were released into the wild.  AirBnB drives up rent …even though it
started out as a way to help people who couldn’t make rent. Sounds like cobra
farming.</p>
</blockquote>
<p>I think I would have <em>really</em> enjoyed this talk.</p>
<p><a href="https://adactio.com/journal/14897">Read more...</a></p>
<h3><a href="#mark-zuckerberg-discovers-privacy" aria-hidden="true" class="anchor" id="mark-zuckerberg-discovers-privacy"></a><a href="http://social.techcrunch.com/2019/03/06/mark-zuckerberg-discovers-privacy/">Mark Zuckerberg discovers privacy</a></h3>
<blockquote>
<p>It’s different with privacy. Privacy is about philosophy. It’s about how you
handle things from the start. Facebook effectively stole a whole bunch of
s--- over a long period of time, relying on intentional obfuscation, legal
muscle and user ignorance to pull off the heist. Now, the company is trying
to make it out of the store with all that contraband stuffed under its shirt
before the security guard ambles back. Unfortunately for Facebook, its hands
are stained with a decade and a half of data wrung out of a now cumulative
2.3 billion users.</p>
</blockquote>
<p>There's a fair amount of profanity in this article... but a lot of truth too.
Pretty happy I deleted my account. I don't miss it much at all.</p>
<p><a href="http://social.techcrunch.com/2019/03/06/mark-zuckerberg-discovers-privacy/">Read more...</a></p>
<h3><a href="#how-to-think-like-a-front-end-developer-by-chris-coyier" aria-hidden="true" class="anchor" id="how-to-think-like-a-front-end-developer-by-chris-coyier"></a><a href="https://adactio.com/journal/14891">How to Think Like a Front-End Developer by Chris Coyier</a></h3>
<blockquote>
<p>Michael Schnarnagl brings up the point about how it’s affecting hiring.
Back-end developers are being replaced with JavaScript engineers. Lots of
things that used to be back-end tasks are now happening on the client side.
Component-driven design, site-level architecture, routing, getting data from
the back end, mutating data, talking to APIs, and managing state—all of those
things are now largely a front-end concern.</p>
</blockquote>
<p>The front-end world is splitting, this article does a pretty good job of
describing that from a hiring perspective.</p>
<p><a href="https://adactio.com/journal/14891">Read more...</a></p>
<h3><a href="#making-things-better-redefining-the-technical-possibilities-of-css-by-rachel-andrew" aria-hidden="true" class="anchor" id="making-things-better-redefining-the-technical-possibilities-of-css-by-rachel-andrew"></a><a href="https://adactio.com/journal/14888">Making Things Better: Redefining the Technical Possibilities of CSS by Rachel Andrew</a></h3>
<p>The CSStastic afternoon of day one of An Event Apart in Seattle continues with
Rachel Andrew. Her talk is Making Things Better: Redefining the Technical…</p>
<p>Lots of excellent thoughts about the current edge of CSS woes.</p>
<blockquote>
<p>Many of things Rachel has shown—grid, exclusions, regions—were implemented by
Microsoft. With Edge moving to a Chromium rendering engine, we must make sure
that we maintain diversity of thought in the standards process. Voices other
than those of rendering engines need to contribute to the discussion.</p>
<p>At a W3C meeting or standards discussion, the room should not be 60-70%
Googlers.</p>
</blockquote>
<p>Truth.</p>
<p><a href="https://adactio.com/journal/14888">Read more...</a></p>
<h3><a href="#web-design-experiments-by-jen-simmons" aria-hidden="true" class="anchor" id="web-design-experiments-by-jen-simmons"></a><a href="https://labs.jensimmons.com/">Web Design Experiments by Jen Simmons</a></h3>
<p>Seriously epic explorations of what is possible with native CSS these days...
spend some quality time with Chrome Inspector on this site and subscribe to the
Youtube Channel.</p>
<p><a href="https://labs.jensimmons.com/">Read more...</a></p>
<h3><a href="#the-most-versatile-criminal-in-history" aria-hidden="true" class="anchor" id="the-most-versatile-criminal-in-history"></a><a href="https://longreads.com/2019/02/21/the-most-versatile-criminal-in-history/">‘The Most Versatile Criminal In History’</a></h3>
<blockquote>
<p>One expert I interviewed… basically said to me, ‘I think he may be the
largest individual contributor to the painkiller epidemic.’ That’s as an
individual person.</p>
</blockquote>
<p><a href="https://longreads.com/2019/02/21/the-most-versatile-criminal-in-history/">Read more...</a></p>
<h3><a href="#vector-the-journal-of-the-british-apl-association" aria-hidden="true" class="anchor" id="vector-the-journal-of-the-british-apl-association"></a><a href="http://vector.org.uk/art10011550">Vector, the Journal of the British APL Association</a></h3>
<p>A super deep but fascinating look at one of the oddest and most intriguing
programming languages. I can <em>almost</em> understand the draw.</p>
<blockquote>
<p>“there are ways of reasoning other than those which have dominated
information processing for 40 years but they are, alas, still extremely rare.
This difference and originality, introduced by APL, are major features. They
typify the open and welcoming intellectual spirit of the people who practise
it.”</p>
</blockquote>
<blockquote>
<p>For sure, other languages manage somehow but it seems to us, at the beginning
of the 21st century, not totally unreasonable to ask that the inequality ≥
should not be represented as =&gt; and that ≠ should not be represented by the
diabolical &lt;&gt;!</p>
</blockquote>
<p>That's a <em>little</em> elitist... but yeah. That's APL.</p>
<p><a href="http://vector.org.uk/art10011550">Read more...</a></p>
<h3><a href="#twitter" aria-hidden="true" class="anchor" id="twitter"></a><a href="https://twitter.com/pixnblox/status/1104485690899922944">Twitter</a></h3>
<p><img src="https://pbs.twimg.com/media/D1PreGKWkAEyBZt.png" alt="picture of a circuit board" /></p>
<p>Keep it simple.</p>
<blockquote>
<p>A (very) early example of video game art... Atari's Space Race (1973) did not
have a ROM to store data. So half of the rocket shape was stored as an 8x16
diode matrix, which was mirrored to create the full shape. This is plainly
visible in the schematic and the circuit board. 🚀</p>
</blockquote>
<p><a href="https://twitter.com/pixnblox/status/1104485690899922944">Read more...</a></p>
<h3><a href="#the-web-we-broke--ethanmarcottecom" aria-hidden="true" class="anchor" id="the-web-we-broke--ethanmarcottecom"></a><a href="https://ethanmarcotte.com/wrote/the-web-we-broke/">The web we broke. — ethanmarcotte.com</a></h3>
<blockquote>
<p>“Any sufficiently advanced neglect is indistinguishable from malice.</p>
<p>Deb Chachra, reappropriating Clarke’s third law”</p>
</blockquote>
<p>This hurts. I'm happy to see accessibility taking such a forefront in so many
people's minds these days.</p>
<p><a href="https://ethanmarcotte.com/wrote/the-web-we-broke/">Read more...</a></p>
<h3><a href="#how-im-able-to-take-notes-in-mathematics-lectures-using-latex-and-vim" aria-hidden="true" class="anchor" id="how-im-able-to-take-notes-in-mathematics-lectures-using-latex-and-vim"></a><a href="https://castel.dev/post/lecture-notes-1/">How I'm able to take notes in mathematics lectures using LaTeX and Vim</a></h3>
<blockquote>
<p>These lec­ture notes — in­clud­ing fig­ures — are made while at­tend­ing the lec­ture and have not been edit­ed af­ter­wards. To make note tak­ing using LaTeX vi­able, I had four goals in mind:</p>
<ul>
<li>Writ­ing text and math­e­mat­i­cal for­mu­las in LaTeX should be as fast as the lec­tur­er writ­ing on a black­board: no delay is ac­cept­able.</li>
<li>Draw­ing fig­ures should be al­most as fast as the lec­tur­er.</li>
<li>Man­ag­ing notes, i.e. adding a note, com­pil­ing all my notes, com­pil­ing the last two lec­tures, search­ing in notes, etc. should be easy and quick.</li>
<li>An­no­tat­ing pdf doc­u­ments using LaTeX should be pos­si­ble for when I want to write notes along­side a pdf doc­u­ment.</li>
</ul>
<p>This blog post will focus on the first item: writ­ing LaTeX.</p>
</blockquote>
<p>This is an incredible example of what happens when you apply yourself to
building your own tools.</p>
<p><a href="https://castel.dev/post/lecture-notes-1/">Read more...</a></p>
<h3><a href="#the-state-of-agile-software-in-2018" aria-hidden="true" class="anchor" id="the-state-of-agile-software-in-2018"></a><a href="https://martinfowler.com/articles/agile-aus-2018.html">The State of Agile Software in 2018</a></h3>
<p>This transcript of a talk by Martin Fowler is really encouraging and
challenging... &quot;agile&quot; being a bad word among programmers has become a little
bit of a joke in my circles, so it's good see a good perspective on how the
concept has been corrupted.</p>
<blockquote>
<p>Our challenge at the moment isn't making agile a thing that people want to
do, it's dealing with what I call faux-agile: agile that's just the name, but
none of the practices and values in place. Ron Jeffries often refers to it as
&quot;Dark Agile&quot;, or specifically &quot;Dark Scrum&quot;. This is actually even worse than
just pretending to do agile, it's actively using the name &quot;agile&quot; against the
basic principles of what we were trying to do, when we talked about doing
this kind of work in the late 90s and at Snowbird.</p>
</blockquote>
<p>Lots of good quotes.</p>
<blockquote>
<p>Why is this important? Because if you want to make changes, you want to add
things quickly, you've got to quickly understand which parts of the program
matter, what do they do, and how do I work so that I can quickly make that
change. This also burrows up into modularity. If I've got a well-modularized
piece of software, instead of having to understand the whole thing, I can
just understand part of it. Technical excellence is about being able to build
that kind of adaptive software.</p>
</blockquote>
<p><a href="https://martinfowler.com/articles/agile-aus-2018.html">Read more...</a></p>
<h3><a href="#seeking-the-productive-life-some-details-of-my-personal-infrastructurestephen" aria-hidden="true" class="anchor" id="seeking-the-productive-life-some-details-of-my-personal-infrastructurestephen"></a><a href="https://blog.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/">Seeking the Productive Life: Some Details of My Personal Infrastructure—Stephen</a></h3>
<p>Hang on... this essay bascially needs <em>another</em> essay to break down and
summarize.</p>
<p>Lots of glorious esoterica in here... this is clearly a man who spends a lot of
time tweaking and thinking about how to Do Work.</p>
<blockquote>
<p>And as a result of that very experience I decided I’d better actually
understand how computers talk to projectors. It’s a complicated business,
that involves having the computer and the projector negotiate to find a
resolution, aspect ratio, frame rate, etc. that will work for both of them.
Underneath, there are things called EDID strings that are exchanged, and
these are what typically get tangled up. Computer operating systems have
gotten much better about handling this in recent years, but for high-profile,
high-production-value events, I have a little box that spoofs EDID strings to
force my computer to send a specific signal, regardless of what the projector
seems to be asking it for.</p>
</blockquote>
<p>However, you have to get a long way through the article before you find
anything like this:</p>
<blockquote>
<p>When I’m specifically working on a particular project, I’ll usually just be
using files in the folder associated with that project. But on a good day,
I’ll have lots of ideas about lots of different projects. And I also get
hundreds of emails every day, relevant to all sorts of different projects.
But often it’ll be months or years before I’m finally ready to seriously
concentrate on one of these other projects. So what I want to do is to store
the material I accumulate in such a way that even long in the future I can
readily find it.</p>
</blockquote>
<blockquote>
<p>At some level it’s as simple as “what file should I put it into”? But the key
point is to have a pre-existing structure that makes it quick to decide
that—and then to have this structure be one in which I can readily find
things even far into the future.</p>
</blockquote>
<p>Yes Mr. Wolfram, it's just as simple and as difficult as that. It does make me
feel good that <em>someone</em> else is thinking hard about this... and has been for
several decades.</p>
<p>One more gem from this delightful tome on the dangers of overthinking:</p>
<blockquote>
<p>Well, here I get to tell a cautionary tale (that my wife regularly uses as an
example) of what can go wrong in my kind of approach. Always liking to
understand the historical progression of ideas, I thought it would be nice to
be able to browse a category of books on a shelf in historical order (say, by
first publication date). But this makes it difficult to find a specific book,
or, for example, to reshelve it. (It would be easier if books had their
publication dates printed on their spines. But they don’t.)</p>
<p>About 20 years ago I was preparing to move all my books to a new location,
with different lengths of shelves. And I had the issue of trying to map out
how to arrange book categories on the new shelves (“how many linear feet is
quantum field theory and where can it fit in?”) So I thought: “Why not just
measure the width of each book, and while I’m at it also measure its height
and its color?” Because my idea was that then I could make a graphic of each
shelf, with books shown with realistic widths and colors, then put an arrow
in the graphic to indicate the location (easily identified visually from
“landmarks” of other books) of a particular book.</p>
<p>I got a colorimeter (it was before ubiquitous digital cameras) and started
having the measurements made. But it turned out to be vastly more
labor-intensive than expected, and, needless to say, didn’t get finished
before the books had to be moved. Meanwhile, the day the books were moved, it
was noticed that the packing boxes fit more books if one didn’t just take a
single slab of books off a shelf, but instead put other books around the
edges.</p>
<p>The result was that 5100 books arrived, basically scrambled into random
order. It took three days to sort them. And at this point, I decided just to
keep things simpler, and alphabetize by author in each category. And this
certainly works fine in finding books.</p>
</blockquote>
<p>This is delightful.</p>
<p><a href="https://blog.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/">Read more...</a></p>
<h3><a href="#wtf-is-big-o-notation" aria-hidden="true" class="anchor" id="wtf-is-big-o-notation"></a><a href="https://rob.conery.io/2019/03/25/wtf-is-big-o-notation/">WTF is Big O Notation?</a></h3>
<p>Sorry for the expletive-reference in the title, but a <em>great</em> article.</p>
<blockquote>
<p>Even that description is really arm-wavy, isn’t it? We can dispose of the
arm-waving by thinking about things in terms of operations per input. How
many operations does my code need to perform to get to a single cart from the
set of all carts in Redis?</p>
</blockquote>
<p><a href="https://rob.conery.io/2019/03/25/wtf-is-big-o-notation/">Read more...</a></p>
<h3><a href="#bliki-semanticdiffusion" aria-hidden="true" class="anchor" id="bliki-semanticdiffusion"></a><a href="https://martinfowler.com/bliki/SemanticDiffusion.html">bliki: SemanticDiffusion</a></h3>
<blockquote>
<p>Semantic diffusion occurs when you have a word that is coined a person or
group, often with a pretty good definition, but then gets spread through the
wider community in a way that weakens that definition. This weakening risks
losing the definition entirely - and with it any usefulness to the term.</p>
</blockquote>
<p>This is my new favorite term.</p>
<blockquote>
<p>...there's a tricky balance between holding to a clear definition and
dogmatism.</p>
</blockquote>
<p>Well... that's convicting.</p>
<p><a href="https://martinfowler.com/bliki/SemanticDiffusion.html">Read more...</a></p>
<h3><a href="#strobist-a-bakers-dozen-13-key-ideas" aria-hidden="true" class="anchor" id="strobist-a-bakers-dozen-13-key-ideas"></a><a href="https://strobist.blogspot.com/2019/03/a-bakers-dozen-13-key-ideas.html">Strobist: A Baker's Dozen: 13 Key Ideas</a></h3>
<p>If you shoot photos, you should read Strobist.</p>
<p><a href="https://strobist.blogspot.com/2019/03/a-bakers-dozen-13-key-ideas.html">Read more...</a></p>
<h3><a href="#why-is-silicon-valley-so-obsessed-with-the-virtue-of-suffering" aria-hidden="true" class="anchor" id="why-is-silicon-valley-so-obsessed-with-the-virtue-of-suffering"></a><a href="https://www.nytimes.com/2019/03/26/style/silicon-valley-stoics.html">Why Is Silicon Valley So Obsessed With the Virtue of Suffering?</a></h3>
<p>This article is worth it just for the playful images accompanying it... but I
don't know exactly how to respond to this from my worldview. There is much that
I agree with on the surface with stoics, but ultimately I find the philosophy
unable to weather the waves of the harsh realities of life.</p>
<p><a href="https://www.nytimes.com/2019/03/26/style/silicon-valley-stoics.html">Read more...</a></p>
<h3><a href="#episode-128-one-hell-of-a-toll--the-way-i-heard-it-with-mike-rowe--overcast" aria-hidden="true" class="anchor" id="episode-128-one-hell-of-a-toll--the-way-i-heard-it-with-mike-rowe--overcast"></a><a href="http://thewayiheardit.rsvmedia.com/episode-128-one-hell-of-a-toll">Episode 128: One Hell of a Toll — The Way I Heard It with Mike Rowe — Overcast</a></h3>
<p>A good reminder of how good we have it today from one of my favorite
storytellers.</p>
<p><a href="http://thewayiheardit.rsvmedia.com/episode-128-one-hell-of-a-toll">Read more...</a></p>
<h3><a href="#book-review-inventing-the-future" aria-hidden="true" class="anchor" id="book-review-inventing-the-future"></a><a href="https://slatestarcodex.com/2019/03/18/book-review-inventing-the-future/">Book Review: Inventing The Future</a></h3>
<p>Once again, a writer whom I respect but with whom I don't see eye to eye
reviewing a book whose worldview I don't hold. I present merely as an
entertaining and informative view into a different perspective on the world and
politics.</p>
<p>Particularly of interest: the use of the word &quot;hegemony&quot; in the context in
which I would say &quot;worldview&quot;. Al Mohler has been saying for a while that in
the US, a political alignment is more indicative of worldview than policy
alignment... and I think this usage is pointing to that as well.</p>
<blockquote>
<p>S&amp;W often use the word “hegemony”, usually in the context of a current
neoliberal hegemony or a hoped-for future communist hegemony. I started out
reading this as just an emphatic way of saying “power”, as in “the
neoliberals are definitely almost-irreversibly in power” or “the communists
are definitely almost-irreversibly in power”. After looking into it more, I
think the best interpretation of “hegemony” is “paradigm” in the Kuhnian
sense, or as the sort of thing that should be in one of the leftmost boxes of
this table. A hegemony is a self-consistent way of looking at the world that
guides how we think about things and what questions we ask. It is not just
made of facts, but also of perspectives, biases, values, and investigational
techniques, all coming together into a coherent whole.</p>
</blockquote>
<p>The quote that made me laugh the hardest.</p>
<blockquote>
<p>But at its worst, Inventing The Future feels like a search for the public’s
secret cheat code that will make them have a revolution with you.</p>
</blockquote>
<p><a href="https://slatestarcodex.com/2019/03/18/book-review-inventing-the-future/">Read more...</a></p>
<h3><a href="#simple--boring--css-tricks" aria-hidden="true" class="anchor" id="simple--boring--css-tricks"></a><a href="https://css-tricks.com/simple-boring/">Simple &amp; Boring | CSS-Tricks</a></h3>
<blockquote>
<p>We assume that complex problems always require complex solutions. We try to
solve complexity by inventing tools and technologies to address a problem;
but in the process, we create another layer of complexity that, in turn,
causes its own set of issues.</p>
<p>— Max Böck, &quot;On Simplicity&quot;</p>
</blockquote>
<p><img src="https://media.giphy.com/media/3o6fJ1uhyJhVkOEQRW/giphy.gif" alt="PREACH" /></p>
<p><a href="https://css-tricks.com/simple-boring/">Read more...</a></p>
<h3><a href="#john-maeda-in-reality-design-is-not-that-important" aria-hidden="true" class="anchor" id="john-maeda-in-reality-design-is-not-that-important"></a><a href="https://www.fastcompany.com/90320120/john-maeda-in-reality-design-is-not-that-important">John Maeda: “In reality, design is not that important”</a></h3>
<p>Clickbait title, but valid points.</p>
<blockquote>
<p>Maeda thinks that designers should focus on being good teammates rather than
leaders. Worrying too much about whether design has enough influence over a
product or a company distracts from the real vision: making great products
that solve people’s problems.</p>
</blockquote>
<p>...</p>
<blockquote>
<p>It’s a controversial stance, given how much Maeda and other design industry
leaders have argued for design becoming a more powerful discipline within
organizations. “Designers are used to being the benchwarmer and called into
spray smell on something, and they’ve been so hurt, they’re tired of it, they
want to fight back and organize,” he says. “I think in the past … I was
advocating for design in general, I had to be a symbolic leader of that. I
felt responsible to do that.”</p>
</blockquote>
<p>I think that I agree. I think it might be early for this level of thinking, but
I don't think it's wrong.</p>
<p><a href="https://www.fastcompany.com/90320120/john-maeda-in-reality-design-is-not-that-important">Read more...</a></p>
<h3><a href="#what-the-ea-community-can-learn-from-the-rise-of-the-neoliberals" aria-hidden="true" class="anchor" id="what-the-ea-community-can-learn-from-the-rise-of-the-neoliberals"></a><a href="https://www.effectivealtruism.org/articles/ea-neoliberal/">What the EA community can learn from the rise of the neoliberals</a></h3>
<p>This article contains a very interesting timeline of the neoliberalism
movement. Good summaries and descriptions of the different politics and people
involved.</p>
<p><a href="https://www.effectivealtruism.org/articles/ea-neoliberal/">Read more...</a></p> ]]></description>
    </item>
    <item>
       <title>Using Vim Macros to Undo Shortened URLs</title>
       <link>http://evantravers.com/articles/2019/03/08/using-vim-macros-to-undo-shortened-urls/</link>
       <pubDate>Fri, 08 Mar 2019 21:10:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/03/08/using-vim-macros-to-undo-shortened-urls/</guid>
       <description><![CDATA[ <p>I've been tinkering with my blog setup. I use
<a href="http://instapaper.com">Instapaper</a> to do most of my reading on the internet.
As I find links that intrigue me, I add them to my Instapaper queue. Once upon
a time, every link that I starred in Instapaper got immediately posted to
twitter... which explains most of my tweet count.</p>
<p>I have decided to be a little more thoughtful. Rather than blasting the
interent, now when I like a link on Instapaper, I use an
<a href="http://ifttt.com">IFTTT</a> applet to save the title and link to my personal wiki
on dropbox, in a folder marked links. I have been manually copying the
interesting ones out of that folder to build my monthly link posts. I just
<a href="https://gist.github.com/evantravers/f52133b9530ce006fd30e4107068de20">wrote a little
script</a>
that grabs all the links for the current month, and outputs my preferred
markdown format so that I can generate a link post at any point. I have also
started pulling quotes and commentary out of the link into the saved text file,
both in terms of generating the blog post and summarizing what I thought was
important about it for my personal knowledge base.</p>
<p>One thing that bugged me about my applet was that it was saving all the links
with ifttt's link shortener... While I <em>just</em> discovered that you can turn that
off (read the docs, right?),  last month I spent a lot of time opening each
link, copying the original URL, and putting it back in the blog post. Yucky.</p>
<p>In preparation for this month I was cleaning up the URLs I had &quot;liked&quot; before
turning off the link shortener, and I realized that the way I was using vim was
a <em>great</em> example of the power of Vim: movement, magic, and macros... so I
humblebragged on Slack and stopped to recreate the edit as a demo:</p>
<figure>
  <img src="https://images.evantravers.com/articles/2019/03/macro_magic.svg" alt="">
  <figcaption>
    <ol>
      <li>
        I open all the files I want to edit using <code>nvim March*</code>.
        (Because I had done this already, the first file that opens already has
        the unshortened URL.)
      </li>
      <li>
        Because I know I'm going to do this more than once, I use
        <code>qq</code> to start recording a macro to the "q" register.
      </li>
      <li>
        The IFTTT file always puts the URL at the bottom, so I hit <code>G</code>.
      </li>
      <li>
        I quickly jump to the URL using <code>fh</code> to "find the h".
      </li>
      <li>
        Vim's NETRW module allows you to follow http links and load a copy of
        the file that's found there... so when I hit <code>gf</code> for go to
        file on the URL, it downloads the file and opens it.
      </li>
      <li>
        <code>/href</code> searches for "href", taking me to the correct line.
        I use <code>yi"</code> to yank the new, lengthened, URL out of the
        quotes.
      </li>
      <li>
        I use <code>&lt;CTRL-o&gt;</code> to step out of the file and into the
        original file.
      </li>
      <li>
        A quick creation of a new line, <code>p</code> to paste my URL, and I
        step up to the previous line to delete it. I hit <code>q</code> again
        to stop recording the macro.
      </li>
      <li>
        I use a binding to jump to the next file, and can hit <code>@q</code>
        to play back my macro.
      </li>
    </ol>
  </figcaption>
</figure>
<p>A &quot;real&quot; version of this macro would have also probably saved the file and
automatically gone to the next file in the list using <code>:bn</code>, but this was a
quick and dirty version for internet fame. <a href="https://youtu.be/rjQtzV9IZ0Q?t=5">It'll
do</a>.</p>
<p>I'm always telling people it's worth the effort to learn their preferred editor
well. Maybe this task demonstrates why Vim is a good option. I didn't even stop
to think what I was doing until I was done, and I had accomplished a fairly
complex and repetitive task with speed and efficiency.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: February</title>
       <link>http://evantravers.com/articles/2019/03/04/books-and-links-february/</link>
       <pubDate>Mon, 04 Mar 2019 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/03/04/books-and-links-february/</guid>
       <description><![CDATA[ <p>This is a little late... but better late than... oh well. You get the point.
I'm currently making this post from my highlights on Instapaper and a IFTTT
recipe that makes a text file for every link that I &quot;like&quot; on instapaper... I
need to make a script that auto-generates it or something.</p>
<p>I've been blocking some of the more distracting blogs and websites from my
phone, and putting my kindle in reachable spots for the evening... the result:
a <em>lot</em> of reading.</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>This month I finished <a href="/articles/2019/02/09/review-deep-work-by-cal-newport/">Deep
Work</a> and read <a href="/articles/2019/02/28/review-extreme-ownership-by-jocko-willink-and-leif-babin/">Extreme
Ownership</a>.
Both were very influential on my behavior already... I hope to continue to grow
as a result of what I read.</p>
<p>I think I read at least two fiction books along the way, but I'm having trouble
finding the records of it. I think about halfway through the month I started
making a diary of books that I've finished and such in vimwiki, but I haven't
been thorough.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>As always... I try to save highlights from Instapaper as I read things that are
interesting... I usually run out of my free five highlights around one week
into the month.</p>
<h3><a href="#book-review-zero-to-one-slate-star-codex" aria-hidden="true" class="anchor" id="book-review-zero-to-one-slate-star-codex"></a><a href="https://slatestarcodex.com/2019/01/31/book-review-zero-to-one/">Book Review: Zero to One, Slate Star Codex</a></h3>
<blockquote>
<p>&quot;Don’t try to “disrupt” your field – if you’re “disrupting” someone, it means
you’re competing with them, and making enemies who will try to hold you back.
Don’t try to be the “first mover” (Yahoo was the first-mover in the search
engine space), instead try to be the “last mover” whom nobody is able to
supplant. Etc, etc.&quot;</p>
</blockquote>
<p>I don't agree with the worldview of this blogger, nor the worldview or politics
of the author he is summarizing, but I found some interesting gems in there.</p>
<p><a href="https://slatestarcodex.com/2019/01/31/book-review-zero-to-one/">Read more...</a></p>
<h3><a href="#how-to-get-startup-ideas-paul-graham" aria-hidden="true" class="anchor" id="how-to-get-startup-ideas-paul-graham"></a><a href="http://www.paulgraham.com/startupideas.html">How to Get Startup Ideas, Paul Graham</a></h3>
<blockquote>
<p>“The way to get startup ideas is not to try to think of startup ideas. It's
to look for problem s, preferably problems you have yourself.</p>
<p>The very best startup ideas tend to have three things in common: they're
something the founders themselves want, that they themselves can build, and
that few others realize are worth doing.  Microsoft, Apple, Yahoo, Google,
and Facebook all began this way.”</p>
</blockquote>
<p>This is a little in contrast with Peter Thiel's discussion on monopolies from
Zero to One earlier, but I'm not arguing. It's an interesting
counter-perspective to the previous discussion.</p>
<blockquote>
<p>&quot;When you have an idea for a startup, ask yourself: who wants this right now?
Who wants this so much that they'll use it even when it's a crappy version
one made by a two-person startup they've never heard of? If you can't answer
that, the idea is probably bad. [3]&quot;</p>
</blockquote>
<p>Quote of the day for me.</p>
<p><a href="http://www.paulgraham.com/startupideas.html">Read more...</a></p>
<h3><a href="#tips-for-delegating-shawn-blanc" aria-hidden="true" class="anchor" id="tips-for-delegating-shawn-blanc"></a><a href="https://shawnblanc.net/2019/02/tips-for-delegating/">Tips for Delegating, Shawn Blanc</a></h3>
<blockquote>
<p>“Actual delegation happens when you assign a task to someone while also
empowering them to make any decisions related to completing that task.</p>
<p>Put another way, you are delegating the outcome.”</p>
</blockquote>
<p>Such convicting truth.</p>
<p><a href="https://shawnblanc.net/2019/02/tips-for-delegating/">Read more...</a></p>
<h3><a href="#oop-before-oop-with-simula" aria-hidden="true" class="anchor" id="oop-before-oop-with-simula"></a><a href="https://twobithistory.org/2019/01/31/simula.html">OOP Before OOP with Simula</a></h3>
<p>I'm reading about functional programming a good bit, and while part of this was
over my head, I loved this part:</p>
<blockquote>
<p>He argues that we think of an object in a computer program the same way we
think of a river—we imagine that the object has a fixed identity, even though
many or all of the object’s properties will change over time. Doing this is a
mistake, because we have no way of distinguishing between an object instance
in one state and the same object instance in another state. We have no
explicit notion of time in our programs. We just breezily use the same name
everywhere and hope that the object is in the state we expect it to be in
when we reference it. Inevitably, we write bugs.</p>
</blockquote>
<p>If that intrigues you... the rest of the article may not help, it's mostly a
history. :P</p>
<p><a href="https://twobithistory.org/2019/01/31/simula.html">Read more...</a></p>
<h3><a href="#design-thinking-is-fundamentally-conservative-and-preserves-the-status-quo" aria-hidden="true" class="anchor" id="design-thinking-is-fundamentally-conservative-and-preserves-the-status-quo"></a><a href="https://hbr.org/2018/09/design-thinking-is-fundamentally-conservative-and-preserves-the-status-quo">Design Thinking Is Fundamentally Conservative and Preserves the Status Quo</a></h3>
<p>I did <em>not</em> agree with this article.</p>
<p>I would like to read that again, but I didn’t buy the examples… did she prove
that the “bad” solution of the wall was produced by a design thinking process,
and the “good” solution was produced by a different process? It seemed she was
claiming that each was representative of the kinds of solutions produced, but
she didn’t get as far as showing that it <em>must</em> produce.</p>
<p>There’s also a strong assumption in the article that all change from status quo
= good and the status quo = bad. I’m not sure that’s always true and I’m fairly
sure that’s a dangerous assumption.</p>
<p>I did like the challenge to rigidity… but the article basically reminded me of
every argument I’ve ever read about waterfall vs. agile rather than a well
though out criticism of design thinking.</p>
<p>I'm open to hearing other opinions though, feel free to <a href="/contact">contact me</a>.</p>
<p><a href="https://hbr.org/2018/09/design-thinking-is-fundamentally-conservative-and-preserves-the-status-quo">Read more...</a></p>
<h3><a href="#the-dr-fox-effect---futility-closet" aria-hidden="true" class="anchor" id="the-dr-fox-effect---futility-closet"></a><a href="https://www.futilitycloset.com/2019/02/10/the-dr-fox-effect/">The Dr. Fox Effect - Futility Closet</a></h3>
<blockquote>
<p>The researchers arranged lectures on mathematical game theory for two
audiences of psychiatrists and psychologists. In one classroom the lecturer
was an actual scientist, and in the other he was an actor playing “Dr. Myron
L. Fox” who’d been given one day to prepare a lecture “with an excessive use
of double-talk, neologisms, non sequiturs, and contradicting statements.”</p>
<p>When both Fox and the scientist delivered their material in an inexpressive
monotone, the scientist’s students performed better on an examination. But
when both spoke engagingly, the students rated the charlatan as highly as the
expert.</p>
</blockquote>
<p>As a UX designer for a company that presents itself unabashedly as an industry
expert, this scares me not a little bit.</p>
<p><a href="https://www.futilitycloset.com/2019/02/10/the-dr-fox-effect/">Read more...</a></p>
<h3><a href="#knowledge-processing-system-for-marketers-creators-and-knowledge-workers" aria-hidden="true" class="anchor" id="knowledge-processing-system-for-marketers-creators-and-knowledge-workers"></a><a href="https://tinylittlebusinesses.com/zettelkasten-method/">Knowledge Processing System for Marketers, Creators, and Knowledge Workers</a></h3>
<blockquote>
<p>Instead of asking, “Under what topic do I store this note?” he asked, “In
which CONTEXT will I want to stumble upon it again?”</p>
</blockquote>
<p>I spend <em>entirely</em> too much time taking, re-organizing, and thinking about what
I just took notes on. This article coalesced a lot of ideas I've had and gave
me new perspective.</p>
<p><a href="https://tinylittlebusinesses.com/zettelkasten-method/">Read more...</a></p>
<h3><a href="#shakey-graves---roll-the-bones---audiotree-live---youtube" aria-hidden="true" class="anchor" id="shakey-graves---roll-the-bones---audiotree-live---youtube"></a><a href="https://www.youtube.com/watch?v=sD72LbIk02M">Shakey Graves - Roll the Bones - Audiotree Live - YouTube</a></h3>
<p>I'm on a Shakey Graves kick. Enjoy.</p>
<p><a href="https://www.youtube.com/watch?v=sD72LbIk02M">Listen...</a></p> ]]></description>
    </item>
    <item>
       <title>Review: Extreme Ownership by Jocko Willink and Leif Babin</title>
       <link>http://evantravers.com/articles/2019/02/28/review-extreme-ownership-by-jocko-willink-and-leif-babin/</link>
       <pubDate>Thu, 28 Feb 2019 22:05:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/02/28/review-extreme-ownership-by-jocko-willink-and-leif-babin/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/02/extreme_ownership.jpg"></p><p>I read this on Audible in the month of February, mostly while driving or on an <a href="https://alldayruckoff.com/announcements/goruck-february-2019-rucking-challenge-mile-a-day/">evening ruck</a>.</p>
<p>The book is read by the authors, whose concise military diction adds both
weight to the advice and matches their writing/speaking style well.</p>
<p>I liked this book <em>very</em> much, and would highly recommend it. I will most
likely re-listen or re-read it in a few years. I read it initially out of
curiosity, but found myself greatly convicted as to my lack of leadership at
home and at work.</p>
<p>The book will describe a leadership lesson from a military/training context,
break down the principle at play, and demonstrate how it unfolds in a business
context. I enjoyed the business stories a lot more than normal. I found that
the subtle ways that Jocko and Leif led their clients as they coached
leadership lessons very interesting: teaching moment like asking &quot;do you think
that [person in conflict] is out to destroy the business?&quot; Such a question
resets the us vs. them mindset that people can adopt, and encourage alignment
to the mission.</p>
<h2><a href="#structure" aria-hidden="true" class="anchor" id="structure"></a>Structure</h2>
<p>The book has three parts: Winning the War Within, The Laws of Combat, and
Sustaining Victory.</p>
<h3><a href="#winning-the-war-within" aria-hidden="true" class="anchor" id="winning-the-war-within"></a>Winning the War Within</h3>
<p>Winning the war within is all about the character and mindset of a good leader.
This is all within the individual, as a warning and guide to those who feel
called or pressed into leadership.</p>
<h4><a href="#extreme-ownership" aria-hidden="true" class="anchor" id="extreme-ownership"></a>Extreme Ownership</h4>
<p>This is the titular lesson of the book. The idea is simple, but not easy: As a
leader, you are responsible for <em>everything</em> in your space. These include
details, emergency plans, junior leaders below you and senior leaders above
you. A mindset of ownership, of a dedication to the success of the mission
makes leaders successful.</p>
<p>Extreme Ownership requires owning your mistakes as well. If you acknowledge
them, you can face them and come up with a new plan to overcome them and win.</p>
<h4><a href="#no-bad-teams-only-bad-leaders" aria-hidden="true" class="anchor" id="no-bad-teams-only-bad-leaders"></a>No Bad Teams, Only Bad Leaders</h4>
<p>This drives home the hard lesson of the previous chapter. The measure of a
leader is the success or failure of the team.</p>
<p>He describes a convicting picture of the &quot;tortured genius,&quot; a leader who feels
that they are a good leader even though their team is not succeeding. Such a
leader will display victimization, blaming their followers understanding and
motivation rather than taking ownership of their failure to lead.</p>
<p>It was incredibly inspiring... and convicting.</p>
<h4><a href="#believe" aria-hidden="true" class="anchor" id="believe"></a>Believe</h4>
<p>To perform at a high level, you have to believe the mission. To believe the
mission, you have to understand it. To understand... you have to go get
knowledge.</p>
<p>Part of extreme ownership is the accepting that knowledge, understanding, and
strategy will not be spoon fed to you, you have the responsibility to go get
it. Very rarely will someone hand you the &quot;Why?&quot; of the mission. You have to
find it.</p>
<p>By understanding the mission, you can improvise, adapt, and improve.</p>
<p>This chapter was convicting to me... I have often complained that I don't
understand what my leader's strategy is... and I don't seek them out. That is
my fault.</p>
<p>The chapter also touches on the leader's responsibility to make themselves
available for such questions, and discusses the distance that even a friendly
leader may not realize their position gives them.</p>
<h4><a href="#check-the-ego" aria-hidden="true" class="anchor" id="check-the-ego"></a>Check The Ego</h4>
<p>This chapter does a good job of listing several of the insidious ways that ego
can creep in and ruin leaders.</p>
<ul>
<li>Ego prevents you from taking good advice. It can even block self
preservation.</li>
<li>Ego hides your own weaknesses from myself... and lets your enemies exploit
them unchallenged.</li>
<li>Ego can prevent your team from improvising and improving.</li>
</ul>
<p>Ego is pride. It is destructive and dangerous, and I was glad to see humility
be a key part of Jocko and Leif's mindset for leaders.</p>
<h3><a href="#the-laws-of-combat" aria-hidden="true" class="anchor" id="the-laws-of-combat"></a>The Laws of Combat</h3>
<p>This section of the book is about the essential skills and aspects of
leadership that can be focused on and trained... strategies for solving
problems and dominating as a team.</p>
<h4><a href="#cover-and-move" aria-hidden="true" class="anchor" id="cover-and-move"></a>Cover and Move</h4>
<p>Cover and Move is teamwork. It has an additional advantage over the normal
sports-oriented language of teamwork because in a military context, each
element has a separate mission and location. They have to understand the
greater strategy and communicate effectively, considering each other's moves
and needs in order to prevail.</p>
<p>The book lists some of the easy failures to cover and move:</p>
<ul>
<li>Forgetting that all of the units on your team are <em>your</em> team. (I'm guilty of
this one. I treat some other elements as &quot;them&quot; rather than &quot;we&quot;.)</li>
<li>Getting so focused on your team's task that you forget the overall strategy.</li>
<li>Blaming others for your team's failures. We are all on the same mission.</li>
<li>Failing to step back and consider how to support <em>and</em> depend on others
around us.</li>
</ul>
<p>Make those around you a part of your team. Great lesson.</p>
<h4><a href="#simple" aria-hidden="true" class="anchor" id="simple"></a>Simple</h4>
<p>Life and combat has layers of complexity, where one small mistake can cascade
into a snowball of problems. Simplify your communication and plans. Orders must
be clear and simple so that everyone can understand their role and the backup
plan. It doesn't matter how clear you <em>think</em> you have been if your team does
not understand, you have failed. (That last point hurts.)</p>
<p>It is easy to be so intimate with your plan's details that you ignore how
complex it really is... if people don't understand it... that is your clue.</p>
<p>Simplicity gives flexibility and robustness to planning and communication. You
can't adjust or compensate when the plan is too complex for each element to
comprehend.</p>
<h4><a href="#prioritize-and-execute" aria-hidden="true" class="anchor" id="prioritize-and-execute"></a>Prioritize and Execute</h4>
<p>You can't do everything at once. Relax. Look around. Make a call.</p>
<p>In order to choose the right problems and execute with wisdom, you have to
<em>actively maintain</em> situational awareness. This was a good point... I often
accept information about the world as it comes, and don't always seek it out
actively.</p>
<p>You can plan, but you can't plan for everything. A key aspect of leadership is
the ability to step back, see the big picture, and tackle the most important
thing with the whole team, one problem at a time.</p>
<p>I'm very guilty of &quot;solution binging,&quot; getting so excited about progress and so
overwhelmed with the number of problems that I attempt to engage four or five
problems at once. This was a good wake-up call for me.</p>
<h4><a href="#decentralized-command" aria-hidden="true" class="anchor" id="decentralized-command"></a>Decentralized Command</h4>
<p>This chapter was worth the book.</p>
<p>This is about delegation, but about more than delegation. It is an
understanding that there is an upper bound to the people a leader can
effectively lead. It builds on the previous chapters... you can't have
decentralized command without the teamwork of Cover and Move and the clarity of
keeping things Simple.</p>
<p>There is a lot of excellent counsel in this chapter on how to empower and coach
junior leaders on your team to take ownership of their teams, and how to build
an effectively network. It all comes down to being a strong enough leader to
not only give direction, but to empower your leaders to carry out the mission
without you. Your junior leaders should not ask &quot;what should I do?&quot; they should
be telling you &quot;This is what we are going to do.&quot;</p>
<p>It takes strength to let go. I fail at this a lot, especially at home. Taking
the long game, and slowly coaching my team at home and work to succeed without
me... that's my new mission.</p>
<h3><a href="#sustaining-victory" aria-hidden="true" class="anchor" id="sustaining-victory"></a>Sustaining Victory</h3>
<p>I really loved that they included this chapter in the book. It's not enough to
have the right mindset, it's better but not sufficient to have strategies for
dealing with the day to day of leadership activities, you have to build in a
thoughtful strategy for maintaining and improving.</p>
<h4><a href="#plan" aria-hidden="true" class="anchor" id="plan"></a>Plan</h4>
<p>This chapter is <em>also</em> worth the cost of the book. In hearing the stories and
examples I could see so many ways that I have failed people on my team by not
planning and communicating effectively. I am excited to learn and grow.</p>
<p>While there is a ton of notes and insights I gleaned from this chapter (see my
<a href="#Additional_Resources">full notes</a> or buy the book for more!) the one thought
that really stood out to me was the necessity of a form of review of your plan
after execution. Without a &quot;post operation debrief&quot; of some kind, you will make
the same mistakes over and over again.</p>
<p>Another really excellent point that I will use this very week is to only focus
on risks that you can actually mitigate. It doesn't help to worry or spin in
place trying to fight a risk you can't control... just move on and execute.
Many times I waste the most time in my planning process worrying about what I
can't control instead of focusing on what I can.</p>
<h4><a href="#leading-up-and-down-the-chain-of-command" aria-hidden="true" class="anchor" id="leading-up-and-down-the-chain-of-command"></a>Leading Up and Down the Chain of Command</h4>
<p>This chapter has <em>many</em> gems of knowledge about communication up and down your
organization... and I found conviction in both parts.</p>
<h5><a href="#leading-down" aria-hidden="true" class="anchor" id="leading-down"></a>Leading Down</h5>
<p>As a senior leader I can bless my junior leaders by showing them the strategic
impact of our team.</p>
<p>Your team enters briefs wondering &quot;what are we doing next&quot;. In addtion, you
<em>need</em> to give them a &quot;why&quot;. Your men need help to connect their tactical
missions to the greater strategic goal.</p>
<p>If a team member helps plan the mission, they'll often catch the vision and
increase their morale and purpose thanks to hearing their commander's intent.</p>
<p>This is leading down the chain of command. Providing vision to those junior to
you. Giving them ownership.</p>
<h5><a href="#leading-up" aria-hidden="true" class="anchor" id="leading-up"></a>Leading Up</h5>
<p>Before blaming the boss, blame yourself.  What can you do to push SA up the
chain? This requires a lot more skill than leading down. You must also
recognize your needs are part of a larger picture, you may not be the priority.
This takes humility. At the end of the day, you must execute the plan as if it
were your own.</p>
<h4><a href="#decisiveness-amidst-uncertainty" aria-hidden="true" class="anchor" id="decisiveness-amidst-uncertainty"></a>Decisiveness Amidst Uncertainty</h4>
<p>This was a great chapter... an area that I am very weak on. A leader must be
decisive amidst uncertainty. Act on logic, not emotions.</p>
<p>This was really similar to <a href="https://www.forbes.com/sites/eriklarson/2018/09/24/how-jeff-bezos-uses-faster-better-decisions-to-keep-amazon-innovating/#5b79c9bd7a65">Bezos's 70%
rule</a>.
There was even a passage giving a heuristic for decision making under stress...
it can be helpful to understand that some decisions are irrevocable and some
can be changed. A wise leader knows how to resist the stress of the situation
and make the best call given the information they have.</p>
<h4><a href="#discipline-equals-freedom--the-dichotomy-of-leadership" aria-hidden="true" class="anchor" id="discipline-equals-freedom--the-dichotomy-of-leadership"></a>Discipline Equals Freedom / The Dichotomy of Leadership</h4>
<p>This chapter spawned two more books of their own... so its dense with ideas and
concepts that are more fleshed out in their respective titles.</p>
<p>In the passages on discipline, Jocko describes how the only way to excel is to
systematically build discipline in your personal life and process. He describes
the battle to get up on time in the morning as the first step on this journey,
proclaiming that little discipline leads to discipline in greater things.
(<a href="https://biblehub.com/luke/16-10.htm">Sound familiar?</a>.) He also demonstrates
how being disciplined with process can lead to making time for what's
important, but personal discipline will empower you to spend that new time on
the best things.</p>
<p>I have spent a fair amount of my life learning how to do things with a
discipline and speed, I am just now on the path of learning how to be
disciplined to spend this new time on good things. Great lesson.</p>
<p>Under the dichotomy of leadership, Jocko and Leif muse on how leadership is
always about striking a balance between extremes. Recognizing this fact will
allow you to self-diagnose and better balance these forces.</p>
<p>This was also very powerful... I tend to stay very heavily on one side of this
balance... I am gracious but not competitive. I can be humble, but I am not
active. Going through a recent leadership summit at work introduced me to how I
excuse my weakness as part of my strengths, and this chapter drove home that I
need to work to fight my weaknesses and find that balance.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>I would like to read a few more perspectives on leadership. While this one is
practical and excellent, it's not written from the worldview I hold, and there
were a few things that I didn't agree with here in there, mostly in terms of
severity of expression.</p>
<p>Read this book. I will likely read it again soon-erish. I think it has
application as a leader and as a follower, and we are all leaders at one level
or another. I thought it would be an easy listen, but I wound up writing around
3k words of notes on the book and talking about it nearly incessantly. Highly
recommended.</p>
<h2><a href="#additional-resources" aria-hidden="true" class="anchor" id="additional-resources"></a>Additional Resources</h2>
<ul>
<li><a href="https://echelonfront.com/extreme-ownership/">Official Site</a></li>
<li><a href="https://gist.github.com/b8c5c1f5a86700f6ceeadc0ffd9e5282">My complete notes</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Enhancing search and replace in Neovim with inccomand</title>
       <link>http://evantravers.com/articles/2019/02/13/enhancing-search-and-replace-in-neovim-with-inccomand/</link>
       <pubDate>Wed, 13 Feb 2019 17:43:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/02/13/enhancing-search-and-replace-in-neovim-with-inccomand/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2019/02/icm.svg" alt="demo of using icm" /></p>
<p><a href="http://twitter.com/adamyonk">@adamyonk</a> recently pointed me towards Neovim's
enhanced <code>inccommand</code> feature. When you use <code>:set inc=&quot;split&quot;</code> or
<code>:set inc=&quot;nosplit&quot;</code>, you get a lovely live preview of both searches and
complex find and replace.</p>
<p>This is a pretty cool feature that if you are already on Neovim, you can just
get it for free.</p>
<p>If you are not using Neovim,
<a href="http://github.com/markonm/traces.vim">markonm/traces.vim</a> does nearly the same
thing as a plugin.</p> ]]></description>
    </item>
    <item>
       <title>Review: Deep Work by Cal Newport</title>
       <link>http://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/</link>
       <pubDate>Sat, 09 Feb 2019 06:58:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/02/09/review-deep-work-by-cal-newport/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2019/02/deep_work.jpg"></p><p>I heard about the book Deep Work during a presentation a colleague gave at
work. The ideas presented were intriguing, and I started to think about how I
might focus and work more deeply. I was particularly fascinated by the idea of
embracing boredom as a tool to promote creativity. I became keenly aware how
addicted I was to pulling out my phone to scan a timeline whenever &quot;nothing was
going on.&quot; I started using ScreenTime as soon as it was available to try
bring my screen addiction to a manageable level. I needed to learn more.</p>
<p>I had some credits on Audible, so I decided to get the audiobook to glean more
insight. I enjoyed the book immensely, taking copious notes… I wound up
creating a sort of new workflow for taking notes on books using
<a href="http://getdrafts.com/">Drafts</a>.</p>
<p>I'll open Drafts, quickly enter something based on what I've heard, then at the
end of the day I'll merge the notes together and activate my Append to
Booknotes action… which runs a Shortcuts workflow allowing me to choose from a
list of books I'm taking notes on and appends it to the end of that document.
This was a huge time saver… before I would open 1Writer, navigate to dropbox,
navigate to booknotes, choose the right file, scroll to the bottom of the file,
enter writing mode… then finally enter the note. Being able to just pop open
Drafts, write or dictate my thoughts and then close it and handle it later has
been a <em>wonderful</em> experience.</p>
<h2><a href="#what-i-learned" aria-hidden="true" class="anchor" id="what-i-learned"></a>What I learned</h2>
<p>The book is roughly split into two sections: first, discussing the nature and
&quot;history&quot; of deep work, intending to convince the reader that Deep Work is
important and valuable. It contains the usual litany of success stories from
history and personal experience that litter this genre of literature, but they
were mostly well chosen and interesting. The second part goes over some
specific strategies for fighting distraction and embracing depth in your work,
I'll list out what I did later.</p>
<p>For me, the idea of Deep Work is appealing as a means of excelling at work and
also in learning to make the most of my days and relationships. Mr. Newport
makes a compelling argument throughout the book that we have unwisely accepted
social media and other distractions as part of a Cult of the Internet, that all
new technologies are inherently helpful and good… I have found this very
convicting. I've hitched my wagon to nearly every network that has bubbled up.
(I was even quite active on Plurk and Pownce… nobody remembers those anymore…
It's all hay and stubble anyway.)</p>
<p>Mr. Newport introduced me to the concept of limited willpower… that much like a
muscle my ability to focus and resist distraction can tire over time and during
activities that are demanding. Not only has this affected how I permit email
notifications and other distractions to rob me of my focus muscle and
encouraged me to intentionally choose a focused life to train this skill, but
it's affecting how I interact with others. Will this email or message help my
friend or build them up, or will trying to answer me just steal a tiny bit of
their performance today? It also has adjusted my expectations for my sweet
little daughter... she has a very tiny focus muscle and is only able to resist
touching my guitar for a short time. I should simply put it away to keep her
from having to exhaust herself.</p>
<p>In attempting to cut down on my consuming of media and resisting my urge to
look up every fact that I can't remember on wikipedia… I'm slowly realizing how
intense are my urges towards distraction. Newport describes a simple method of
recording when I get distracted as a means of accountability… and it's
humbling. I suppose that ScreenTime pickups could give me nearly the same
method, but I like the discipline of physically recording the transgression.</p>
<p>Another big takeaway is that I'm slowly giving a higher priority to my time
spent in deep work. It is the most valuable contribution to my job. I love to
help people, to teach and to share. It often feels like responding to messages
and staying in the easy shallows of question/response is &quot;being helpful,&quot; but
as I have tried to say &quot;wait… I need thirty more minutes on this before I can
help you&quot; I'm finding that I'm able to do even <em>more</em> teaching and sharing and
still get my most important work done by choosing to put depth first.</p>
<p>Since reading the book I have become very excited about training my mind to
resist distraction… Not just for work benefits, but also spiritual disciplines,
and the ability to prioritize my family and my relationships over my phone… I'm
still working on it. Hold me to it.</p>
<h2><a href="#what-i-did" aria-hidden="true" class="anchor" id="what-i-did"></a>What I did</h2>
<p>I listened to the book rather slowly over the last few months, giving me lots
of time to take notes and slowly implement changes in my habits. Here are some
of the things I've tried:</p>
<p>I stopped using Outlook. Just by simply using a separate application for mail
and calendar means I can split up distracting messages and calendar
organization. I can avoid being late for meetings and still follow Mr.
Newport's strategy of budgeting every minute in the workday.</p>
<p>Before reading the book, I would occasionally set aside time for focus on my
calendar. While this helped tremendously, I've taken the next step and am
scheduling blocks of time for shallow tasks… and I always schedule deep first.
This has helped me put off my useless tendency to tackle smaller tasks while
hoping to &quot;gain momentum&quot;, and gives me a tool to fight distraction: whenever a
shallow task presents itself (checking my email, responding to a non-important
request) I can put it in a queue to be handled at the next shallow block. A lot
of these shallow tasks fix themselves in my absence, and also it has a
side-effect of batching like tasks, which is efficient. (AKA, answering five
emails one after the other rather than answering each on as it distractingly
came in.)</p>
<p>I've been using a mix of a bullet journal and Things.app to handle my tasks. As
recommended by Mr. Newport, I've taken up categorizing my work as deep and
shallow and aggressively pursuing the deep first. I have a tag for Essential,
and every day I have started by filtering to Essential so I'm not even
distracted by the shallower tasks.</p>
<p>I have had a shutdown routine for a year now that includes some journaling of
progress and gratefulness… now that includes classifying upcoming tasks and
scheduling out for next three days.</p>
<p>I don't presently have a sender filter. I have experimented with archiving
immediately any email on which I am only cc'd. I don't need it at the moment,
but it's there if I need it. At the moment I work with a relatively low amount
of email noise, for which I am very grateful.</p>
<p>I am trying to not access my email or Slack till the first shallow block of the
day… usually just before lunch. While this used to be the opening ritual of my
day, I have found as Mr. Newport predicted that my most essential tasks tend to
stay the same between closing of the previous day and this morning. Keeping my
inboxes closed helps me gain momentum without dithering about seeking inbox
zero… a useful state but not required for doing my best work.</p>
<p>I am tracking my deep work time as a lead measure with a simple checkbox system
on my bullet journal. I may expand this in the future, but I'm seeing results
already in terms of my output.</p>
<p>Probably the most difficult change, I am trying to intentionally say no to that
dreadful itch to google facts I've forgotten or buzz someone as soon as I've
thought of a question… instead putting these queries off for at least fifteen
minutes or entering into Things to be acted upon in the next shallow work
block. The hope is that by denying myself I'll build more focus, and so far
I've found that at work I often discover the answer to my own question in the
waiting, and I prevent myself from sending a coworker a distracting slack
message.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>I am sure there are a hundred other reviews and outlines available for the
book. I hate to add to that noise, but writing down what I learn is the surest
way to make it stick.</p>
<p>I'm grateful for the book, and hope to use the ideas wisely to be a good
steward of my time at work so that I can be a blessing at home. I also hope
that a more focused life will keep me from distraction and endless scrolling as
well as make me a more diligent student of scripture. Hopefully some of this is
useful info… if I didn't do a good job explaining something or if there's a
trick you've learned to train your focus, <a href="/contact">I would love to hear from
you</a>.</p>
<h2><a href="#further-reading" aria-hidden="true" class="anchor" id="further-reading"></a>Further Reading</h2>
<ul>
<li><a href="https://www.amazon.com/Deep-Work-Focused-Success-Distracted-ebook/dp/B00X47ZVXM/">Deep Work by Cal Newport</a></li>
<li><a href="https://gist.github.com/0d4fc67b65883ee7fca61496399d603a">My Full Booknotes from my listening</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>On Ungratefulness</title>
       <link>http://evantravers.com/articles/2019/02/06/on-ungratefulness/</link>
       <pubDate>Wed, 06 Feb 2019 03:20:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/02/06/on-ungratefulness/</guid>
       <description><![CDATA[ <blockquote>
<p>Luke 8:47</p>
</blockquote>
<blockquote>
<p>[47] And when the woman saw that she was not hidden, she came trembling, and
falling down before him declared in the presence of all the people why she
had touched him, and how she had been immediately healed.</p>
</blockquote>
<p>Lord. I am convicted that I don't approach you trembling. I don't approach you
in fear and wonder at my life-long fatal affliction has been healed. I come to
you in the edges of my &quot;spare time&quot;, my requests neatly lined up in one hand
and my distracting phone in the other like a teenage rebel collecting his
allowance.</p>
<p>Because I am not like the woman in the story… I wasn't merely suffering,
looking for a Great Physician. I was dead. Dead in my sins, no hope of any
future… and you called me and unmade my sinful bones and swallowed up my self
in your glorious new creation.</p>
<p>So forgive my season of ungratefulness. I am not hidden… I have done far more
than clutch your hem and I have received far more than physical healing. You
are Lord of all and Lord of my heart. Please let me not forget the lesson and
to walk in new fear of you. Raise my head and plant my feet. Thank you Lord. In
Jesus' name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Books and Links: January</title>
       <link>http://evantravers.com/articles/2019/01/30/links-january/</link>
       <pubDate>Wed, 30 Jan 2019 23:35:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/01/30/links-january/</guid>
       <description><![CDATA[ <h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<p>Having finally finished The 900 Days, I was able to enjoy getting into my queue
again. I blew through two or three sci-fi novels on my queue, a couple of them
were really interesting. I also got a chance to read &quot;Three Philosophies of
Life by Peter Kreeft,&quot; which I learned a lot from.</p>
<h2><a href="#links" aria-hidden="true" class="anchor" id="links"></a>Links</h2>
<p>I read a <em>lot</em> of blogs and posts this month. I'm not sure why. Here's a few of
the ones I liked or made notes on...</p>
<h3><a href="#cognitive-bias-cheat-sheet--better-humans" aria-hidden="true" class="anchor" id="cognitive-bias-cheat-sheet--better-humans"></a>Cognitive bias cheat sheet – Better Humans</h3>
<p>This article will be one I return to over and over. A great summary.</p>
<blockquote>
<p>Information overload sucks, so we aggressively filter. Noise becomes signal.
Lack of meaning is confusing, so we fill in the gaps. Signal becomes a story.
Need to act fast lest we lose our chance, so we jump to conclusions. Stories
become decisions.  This isn’t getting easier, so we try to remember the
important bits. Decisions inform our mental models of the world.</p>
</blockquote>
<p><a href="http://bit.ly/2bU1h6r">Read More…</a></p>
<h3><a href="#its-time-to-kill-the-web--mikes-blog" aria-hidden="true" class="anchor" id="its-time-to-kill-the-web--mikes-blog"></a>It’s time to kill the web – Mike’s blog</h3>
<p>I was kind of mad at the clickbait title, but I actually really enjoyed parts
of the discussion, like the following:</p>
<blockquote>
<p>Virtually all security problems on the web come from just a few core design
issues:</p>
<p>Buffers that don’t specify their length
Protocols designed for documents not apps
The same origin policy</p>
<p>Losing track of the size of your buffers is a classic source of
vulnerabilities in C programs and the web has exactly the same problem: XSS
and SQL injection exploits are all based on creating confusion about where a
code buffer starts and a data buffer ends. The web is utterly dependent on
textual protocols and formats, so buffers invariably must be parsed to
discover their length. This opens up a universe of escaping, substitution and
other issues that didn’t need to exist.</p>
</blockquote>
<p>This is intriguing.</p>
<p><a href="http://bit.ly/2fp6ESl">Read More…</a></p>
<h3><a href="#the-rand-corporation-the-think-tank-that-controls-america" aria-hidden="true" class="anchor" id="the-rand-corporation-the-think-tank-that-controls-america"></a>The Rand Corporation: The Think Tank That Controls America</h3>
<p>This article was utterly fascinating from front to back, not the least of which
because of this insane anecdote:</p>
<blockquote>
<p>But perhaps the thing that most solidified RAND's reputation in the public's
imagination was the release of the Stanley Kubrick film Dr. Strangelove or:
How I Learned to Stop Worrying and Love the Bomb in 1964. The movie's title
character, a deranged Nazi scientist, was modeled after RAND's eccentric
Herman Kahn. A military strategist, Kahn famously argued that America could
easily survive an all-out conflict with the Soviet Union if people took
refuge in shelters and rationed food. Although the radiation would cause
hundreds of thousands of genetic defects, Kahn insisted the American people
would endure.  Kahn's apocalyptic scenarios didn't end there. He also dreamed
up the Doomsday Machine, a device that could destroy all life on Earth, which
Kubrick used in Dr. Strangelove. In fact, Kubrick borrowed so many of Kahn's
sayings and ideas that the scientist began demanding royalties. Kahn was so
persistent that Kubrick finally had to tell him, &quot;That's not how things are
done, Herman.&quot;</p>
</blockquote>
<p><a href="http://bit.ly/XAGDi6">Read More…</a></p>
<h3><a href="#mini-stories-volume-6---99-invisible" aria-hidden="true" class="anchor" id="mini-stories-volume-6---99-invisible"></a>Mini Stories: Volume 6 - 99% Invisible</h3>
<blockquote>
<p>If you’ve ever watched an episode of Law and Order or NYPD Blue (or really
any criminal procedural TV show or film set in New York City), the odds are
good that you’ve seen at least one scene that takes place in a seedy back
alley. Regardless of what’s happening in the film or the television show, all
of these alley scenes help sell audiences on the same idea: that New York
City is a city of 10,000 alleys, each with its own secret history. There’s
just one problem: there are almost no alleys in New York City.</p>
</blockquote>
<p><a href="http://bit.ly/2RjRCPx">Read More…</a></p>
<h3><a href="#159-machiavellian-rules-for-warfare-and-lifethe-art-of-war-niccolo-machiavelli--jocko-podcast--overcast" aria-hidden="true" class="anchor" id="159-machiavellian-rules-for-warfare-and-lifethe-art-of-war-niccolo-machiavelli--jocko-podcast--overcast"></a>159: Machiavellian Rules for Warfare, and Life.”The Art of War”, Niccolo Machiavelli. — Jocko Podcast — Overcast</h3>
<p>I'm slowly listening to more of Jocko, and this one surprised me. I didn't
really think of Machiavelli as other than a showpiece for aspiring executive's
desks, but I may have to reconsider and do some reading on my own.</p>
<p><a href="http://bit.ly/2VBC2gt">Read More…</a></p>
<h3><a href="#the-great-divide--css-tricks" aria-hidden="true" class="anchor" id="the-great-divide--css-tricks"></a>The Great Divide | CSS-Tricks</h3>
<p>This article succinctly explained something I've noticed for a while now, and
did a good job of talking about it. There are front-end people, and there are
front-end people. An important discussion for product people and anyone hiring
for web development roles.</p>
<p><a href="http://bit.ly/2W8jgO8">Read More…</a></p>
<h3><a href="#css-utility-classes-and-separation-of-concerns" aria-hidden="true" class="anchor" id="css-utility-classes-and-separation-of-concerns"></a>CSS Utility Classes and &quot;Separation of Concerns&quot;</h3>
<p>I've been writing BEM for years and abhorring the rise of the utility classes
style of writing CSS, but this article may have persuaded me. I am often
wrong...</p>
<p><a href="http://bit.ly/2vKHKCn">Read More…</a></p>
<h3><a href="#365-rfcs" aria-hidden="true" class="anchor" id="365-rfcs"></a>365 RFCs</h3>
<p>I'm thoroughly enjoying this jaunt through the history of the internet, while
taking some notes on how to write good technical documents.</p>
<p><a href="http://bit.ly/2GNEQ71">Read More…</a></p>
<h3><a href="#who-is-horse_js" aria-hidden="true" class="anchor" id="who-is-horse_js"></a>Who is @horse_js?</h3>
<p>This is a stellar reminder that our &quot;private&quot; aliases on the internet are not
that private.</p>
<p><a href="http://bit.ly/2QXVAs9">Read More…</a></p>
<h3><a href="#facebook-pays-teens-to-install-vpn-that-spies-on-them" aria-hidden="true" class="anchor" id="facebook-pays-teens-to-install-vpn-that-spies-on-them"></a>Facebook pays teens to install VPN that spies on them</h3>
<p>It's almost as if Facebook doesn't even care that its actions look evil.</p>
<blockquote>
<p>Desperate for data on its competitors, Facebook has been secretly paying
people to install a “Facebook Research” VPN that lets the company suck in all
of a user’s phone and web activity...</p>
</blockquote>
<p><a href="https://tcrn.ch/2Upnb7q">Read More…</a></p>
<h3><a href="#6-92-small-cat" aria-hidden="true" class="anchor" id="6-92-small-cat"></a>6, 92: Small cat</h3>
<p>This article is an odd and well-written reflection. I enjoyed reading it,
though I think I'm still grappling with all the results.</p>
<p><a href="http://bit.ly/2FGVX9b">Read More…</a></p>
<h3><a href="#one-bag-travel---a-showcase-of-minimalist-carry-on-only-packing-lists" aria-hidden="true" class="anchor" id="one-bag-travel---a-showcase-of-minimalist-carry-on-only-packing-lists"></a>One Bag Travel - A showcase of minimalist, carry on only, packing lists.</h3>
<p>This amazing link is a cool source for inspiration for one bag travel.</p>
<p><a href="https://onebag.travel/">Read More…</a></p>
<h3><a href="#monologue-i-am-a-stryker-x-assault-backpack-and-this-airport-lounge-is-an-insult" aria-hidden="true" class="anchor" id="monologue-i-am-a-stryker-x-assault-backpack-and-this-airport-lounge-is-an-insult"></a>Monologue: I Am a Stryker-X Assault Backpack, and This Airport Lounge Is an Insult</h3>
<p>This delightful tongue-in-cheek article is a slap right in my millenial EDC
face, and I love it.</p>
<blockquote>
<p>Where did I go wrong? When I was a young backpack fresh off the production
line, I was a fearsome sight. Matte black Cordura fabric, reinforced zippers,
MOLLE…</p>
</blockquote>
<p><a href="http://bit.ly/2t4xnXD">Read More…</a></p>
<h3><a href="#a-weekly-review-for-your-goals" aria-hidden="true" class="anchor" id="a-weekly-review-for-your-goals"></a>A Weekly Review for Your Goals</h3>
<p>As always, awesome content from the Focus Course folks.</p>
<p><a href="http://bit.ly/2VeiezK">Read More…</a></p>
<h3><a href="#jrr-tolkien-reads-from-the-lord-of-the-rings-and-sings-sams-rhyme-of-the-troll-in-a-rare-recording" aria-hidden="true" class="anchor" id="jrr-tolkien-reads-from-the-lord-of-the-rings-and-sings-sams-rhyme-of-the-troll-in-a-rare-recording"></a>J.R.R. Tolkien Reads from The Lord of the Rings and Sings “Sam’s Rhyme of the Troll” in a Rare Recording</h3>
<blockquote>
<p>In the summer of 1952, sixty-year-old J.R.R. Tolkien (January 3,
1892–September 2, 1973) encountered a tape recorder for the first time...</p>
</blockquote>
<p>If you know me, you know why I immediately followed this link.</p>
<p><a href="http://bit.ly/1JNETeg">Read More…</a></p> ]]></description>
    </item>
    <item>
       <title>vim-sandwich vs. vim-surround</title>
       <link>http://evantravers.com/articles/2019/01/07/vim-sandwich-vs-vim-surround/</link>
       <pubDate>Mon, 07 Jan 2019 17:04:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/01/07/vim-sandwich-vs-vim-surround/</guid>
       <description><![CDATA[ <p>I was reading <a href="https://www.reddit.com/r/vim/comments/ad52j9/favorite_plugins/">a thread on
/r/vim</a> and
encountered a name I hadn't seen before...
<a href="https://github.com/machakann/vim-sandwich/">vim-sandwich</a>. I have been a
long-time user of <a href="https://github.com/tpope/vim-surround/">vim-surround</a>, and
was curious whether this was an heir apparent... we shall see.</p>
<p>It seems like sandwich is some fanciness on top of surround, suitable for those
who really want to tweak or have a problem with surround's defaults.</p>
<p>Here are some scattered thoughts from playing with it and reading the docs.</p>
<h2><a href="#what-i-like" aria-hidden="true" class="anchor" id="what-i-like"></a>What I like:</h2>
<h3><a href="#highlights-and-ui" aria-hidden="true" class="anchor" id="highlights-and-ui"></a>Highlights and UI</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2019/01/highlights.svg" alt="">
  <figcaption>Here I show a couple highlights as I decide what I need to
  delete.</figcaption>
</figure>
<p>This is something I didn't know I needed... but it is rather wonderful. Many
times while working with surround in a nested function, I'll inadvertently grab
the wrong level or delete too far because a parentheses is unmatched. Having
the little search-highlight appear as I'm working on it reminds me of what I've
seen of <a href="https://kakoune.org/">kakoune</a>, and feels natural without being
unobtrusive.</p>
<h3><a href="#insert-mode" aria-hidden="true" class="anchor" id="insert-mode"></a>Insert Mode</h3>
<figure>
  <img src="https://images.evantravers.com/articles/2019/01/insert.svg" alt="">
  <figcaption>
    <p>
      Using the insert magic char, I'm able to convert these keyword lists to
      maps!
    </p>
    <p>
      While in the keyword list, I can press <code>srbi%&lbrace;&lt;CR&gt;&rbrace;&lt;CR&gt;</code>.
    </p>
  </figcaption>
</figure>
<p>The &quot;insert mode&quot; replacement... I can use this for a short-hand change a
keyword list to a map in elixir... and it is repeatable by the <code>.</code> operator!</p>
<p>That's pretty neat!</p>
<h3><a href="#similar-interface" aria-hidden="true" class="anchor" id="similar-interface"></a>Similar Interface</h3>
<p>Just like vim-surround, vim-sandwich provides some &quot;magic&quot; commands like <code>f</code>
for function and <code>t</code> for tag.</p>
<p>I thought that surround allows for the jumping to the next match which I have
become accustomed... but it turns out that's part of targets.vim and is still
present without surround. :P It's just that the interfaced used by vim-surround
is consistent with targets.vim.</p>
<h3><a href="#extensibility-text-objects-file-types-surroundings" aria-hidden="true" class="anchor" id="extensibility-text-objects-file-types-surroundings"></a>Extensibility: text-objects, file-types, surroundings...</h3>
<p>If the above use case is something I do often, I could define a new recipe with
a magic character specific to the elixir filetype... that's pretty neat. I
could even define a superset of <code>&lbrace;</code> that was able to delete the leading &quot;%&quot; if
it existed...</p>
<p>vim-sandwich provides a <em>lot</em> of functionality for creating &quot;sandwich recipes&quot;,
almost <a href="https://github.com/machakann/vim-sandwich#expression-surroundings-and-regular-expression-matching">crazy levels of
customization</a>,
allowing you to create or tweak how sandwich handles spaces, evaluates the
context of the surround, etc.</p>
<h2><a href="#what-i-dont-like" aria-hidden="true" class="anchor" id="what-i-dont-like"></a>What I don't like:</h2>
<h3><a href="#new-interface" aria-hidden="true" class="anchor" id="new-interface"></a>New Interface</h3>
<p>I've been using vim-surround for nearly half a decade... It's going to be hard
to try something new. The author of vim-sandwich provides <a href="https://github.com/machakann/vim-sandwich/wiki/Introduce-vim-surround-keymappings">a configuration that
follows the old vim-surround
bindings</a>,
which does go to show how customizable this plugin is.</p>
<p>In addition, I was used to surround allowing for out of the box selection
between (foo) and ( foo ). It's nice... but in sandwich's defense I almost
always want the former and not the latter.  If you want to add this, <a href="https://github.com/machakann/vim-sandwich/wiki/Braket-with-spaces">there are
directions in the
wiki</a>.</p>
<h3><a href="#docs-are-nice-but-community-is-new" aria-hidden="true" class="anchor" id="docs-are-nice-but-community-is-new"></a>Docs are nice, but community is new</h3>
<p>It's just a factor of the new-ness of the plugin, but searching for &quot;vim
surround&quot; on stack overflow yields 400+ results, and &quot;vim sandwich&quot; yields 4.</p>
<p>The actual docs on github are nice and complete, but a little difficult if you
don't speak vimscript that well.</p>
<h3><a href="#no-nice-ruby-ish-defaults" aria-hidden="true" class="anchor" id="no-nice-ruby-ish-defaults"></a>No Nice Ruby-ish defaults</h3>
<p>Combined with <a href="https://github.com/tpope/vim-ragtag">ragtag.vim</a>, vim-surround
provides <a href="https://github.com/tpope/vim-ragtag/blob/master/doc/ragtag.txt#L72-L80">some nice
defaults</a>.
I think I may miss those... but we will see. You could absolutely manually
create some filetype specific sandwich recipes for these, but as a user who
just wants to work on ruby/elixir templates, it's a little sad.</p>
<p>(Full disclosure... while I did use the ragtag bindings to create those
surround objects, I didn't till just now know about the corresponding surround
objects... but now that I know they exist, I want them.)</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2019/01/renamefunction.svg" alt="">
  <figcaption>
    <p>
      Using `srff` I can rename a function from wherever my cursor is...
    </p>
  </figcaption>
</figure>
<p>I don't mind the change, I'm going to keep at it for a week or two. If you see
<a href="http://github.com/evantravers/dotfiles">my dotfiles</a> switch back... don't be
surprised, but I think I'm encouraged enough to give this a go, especially by
the power of being able to change a function from anywhere in an elixir pattern
match.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References:</h2>
<ul>
<li><a href="https://github.com/tpope/vim-surround/blob/master/doc/surround.txt">Surround docs</a></li>
<li><a href="https://github.com/machakann/vim-sandwich/blob/master/doc/sandwich.txt">Sandwich docs</a></li>
<li><a href="https://www.reddit.com/r/vimplugins/comments/4dlgaj/vimsandwich_yet_another_choice_to_edit_surrounded/d1s4ugc/">Sandwich author's comments on differences</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>2018</title>
       <link>http://evantravers.com/articles/2019/01/01/2018-year-in-review/</link>
       <pubDate>Tue, 01 Jan 2019 22:45:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2019/01/01/2018-year-in-review/</guid>
       <description><![CDATA[ <p><img alt="Sunrise over Charleston harbor..." src="https://images.evantravers.com/articles/2019/01/pano.jpg"></p><p>The new year is upon us, and I've been reading a bunch of folks' incredible
retrospectives on their years... this will not be that awesome, but I want to
start the practice.</p>
<p>One thing I've discovered as I learn about myself is that I typically have a
lower opinion of myself and my work than others do... therefore I'm taking time
this first week of the year to do things like this post: catalogs of God's
blessings and grateful moments to set my heart rightly as I look into 2019.</p>
<p>It's a little redundant, because I'm also doing a personal retrospective in my
diary, and another in Plan Your Year… oh well.</p>
<h2><a href="#goals" aria-hidden="true" class="anchor" id="goals"></a>Goals</h2>
<p>Sarah and I did the most of the excellent <a href="https://thefocuscourse.com/plan-your-year/">Plan Your
Year</a> last year... it was super
helpful and we are going through it right now for 2019. We concluded that this
year was mostly centered around settling into our new roles as parents…
solidifying disciplines and life patterns. I think by and large we succeeded,
and were able to pad our lives with more margin for rest.</p>
<p>I think my word of the year was Focus. I learned a lot and read a lot on the
topic, but mostly realized how my focus and discipline has atrophied.</p>
<h2><a href="#accomplishments" aria-hidden="true" class="anchor" id="accomplishments"></a>Accomplishments</h2>
<h3><a href="#sola-deo-gloria" aria-hidden="true" class="anchor" id="sola-deo-gloria"></a>Sola Deo Gloria</h3>
<p>God has been faithful to us this year. We have been largely healthy, happy,
and hopeful. All the good things we've been posting to our instagram stories
are blessings right from Him.</p>
<h3><a href="#family" aria-hidden="true" class="anchor" id="family"></a>Family</h3>
<p><img src="https://images.evantravers.com/articles/2019/01/family.jpg" alt="family" /></p>
<p>We have a one year old! A lot of my time and energy has gone into ensuring her
survival... but I have done nothing compared to my incredible and tirelessly
kind wife. It's been really fun learning and growing together. It is hard to
imagine life without the little one. She has changed so much in one year, and
my love grows with her.</p>
<h3><a href="#travel" aria-hidden="true" class="anchor" id="travel"></a>Travel</h3>
<p>We traveled a <em>lot</em> this year… mostly good, especially as our daughter has
learned to be content in the car.</p>
<ul>
<li>Rosemary Beach in April</li>
<li>Gulf Coast in August</li>
<li>Rafting In September</li>
<li>Charleston in July</li>
<li>DC in March, August and October</li>
</ul>
<p>Lots of fun family memories… maybe this year we will go bigger and go west…</p>
<h3><a href="#fitness" aria-hidden="true" class="anchor" id="fitness"></a>Fitness</h3>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2019/01/workout.jpg" alt="workout gear" />
</figure>
<p>A lot of the &quot;end of the year&quot; fitness posts I've read this year have one
thing in common: They all embraced a &quot;set out your workout clothes the
previous night&quot; mentality... and my story was no different. The two biggest
factors towards my success this year: Tracking in public, and preparation for
working out the night before every time.</p>
<p>I tracked nearly every workout in
<a href="https://www.strava.com/athletes/14238333">Strava</a> this year... follow me if
that's a tool you use.</p>
<p>I made this a major goal of the year. I am still working on running… almost
making it to a goal of an easy 5k twice a week, but not quite. Guess it'll be
this year! I ended up running 42 times for 159.7km in 2018.</p>
<p>I rucked around 40 times this year, mostly 3k or 5k a piece. A couple friends
and I did a Goruck Light, which was a highlight. I also did a 5k mud run with
the weight.</p>
<p>I'm grateful for rucking because I woke up earlier and went interesting places…
I rucked through <a href="https://www.strava.com/activities/1938654139">Washington DC</a>, <a href="https://www.strava.com/activities/1682249036">historic
Charleston</a>, <a href="https://www.strava.com/activities/1947406967">waterfalls</a>, <a href="https://www.strava.com/activities/1758431572">beach
sunrises</a>… good memories.</p>
<p>I also did a mixture of sandbag workouts… mostly outdoors using the excellent
Brute Force app. I think my functional fitness and endurance has increased,
just remembering how long it took me to complete a workout in Jan vs the end of
the year. I may need to boost the weight in the bag though.</p>
<p>I do miss climbing… not sure what my goals will be this year. I think it's
going to have to be diet.</p>
<h3><a href="#faith" aria-hidden="true" class="anchor" id="faith"></a>Faith</h3>
<p>With a new little one in the home, my morning routine was in flux for a few
months. I did a lot of shallow praying constantly, and from reading my journals
I did study and take notes, but I didn't invest like I ought. I always make a
goal every year about scripture memorization that I never follow through on…
let's go 2019!</p>
<h3><a href="#work" aria-hidden="true" class="anchor" id="work"></a>Work</h3>
<p><img src="https://images.evantravers.com/articles/2019/01/desk.jpg" alt="my desk at work" /></p>
<p>Work has been fun and scary. I've been moving into a 100% UX role from the
mixed roles I have had in the past. Spending more time in Sketch.app and
notebooks has been rewarding, but I'm also fighting new battles with imposter
syndrome.</p>
<p>I haven't fully retro'd my diary yet, but I do know that I was able to
contribute several useful concepts and ideas that are shaping our product… so I
do have some work I am proud of.</p>
<p>I am keeping up my code chops with side projects, OSS, and doing <a href="http://github.com/evantravers/adventofcode">code
puzzles</a>. I also started
blogging/speaking again about stuff I care about. It'd been scary and fun.</p>
<p>Work's increased demands has caused me to learn more about time ownership and
focus… hopefully good lessons. I do think I'm cycling through tools and
strategies too fast, I tend to be a <a href="/articles/2018/09/12/i-built-a-keyboard/">tweaker of
toys</a> rather than a <a href="/articles/2018/07/31/bullet-journal/">user of
tools</a>. Hmm.</p>
<p>We have a great team, we have a powerful product, and I'm now on five years at
the same office. I am grateful.</p>
<h3><a href="#photography" aria-hidden="true" class="anchor" id="photography"></a>Photography</h3>
<p>We took 18,000+ photos this year into my Lightroom library, including three full
wedding shoots, and at least one engagement shoot. Also having a baby will
cause you to take pictures.</p>
<p>I also launched a <a href="/photography/">new part of this blog for photography</a>...
check it out!</p>
<p>It's been really fun to watch our photos show up in my friends and family's
timelines at the end of 2018, and to have those memories shared with my wife
who has helped me so much with the photography &quot;business&quot; (my favorite shots
from a wedding are consistently hers!), although I apparently only posted 9
photos to Instagram all year… a far cry from my &quot;one per weekday&quot; policy I used
to follow.</p>
<h3><a href="#reading" aria-hidden="true" class="anchor" id="reading"></a>Reading</h3>
<p>I didn't read as many books as I wanted… But I actually read more than I
thought!</p>
<p>I started two new habits this year related to reading: One... I started saving
links to blogposts I liked so that I could start making
<a href="/articles/tags/links">linkposts</a>, and also I started taking serious notes on
serious books for better reading retention. Highly recommended.</p>
<p>In no particular order:</p>
<h4><a href="#you-and-me-forever-by-francis-and-lisa-chan" aria-hidden="true" class="anchor" id="you-and-me-forever-by-francis-and-lisa-chan"></a>You and Me Forever by Francis and Lisa Chan</h4>
<blockquote>
<p>We need to remember at every moment that God stands actively against us when
we are prideful (James 4: 6). You may think you are digging your heels in
against your spouse, but it’s ultimately God you’re opposing, and you’re
inviting His opposition in return.</p>
<p>— Francis Chan</p>
</blockquote>
<p>Very convicting and easy to read, highly recommended. We did a book study with
some friends on this one, and it was very profitable.</p>
<h4><a href="#parenting-by-paul-david-tripp" aria-hidden="true" class="anchor" id="parenting-by-paul-david-tripp"></a>Parenting by Paul David Tripp</h4>
<blockquote>
<p>Good parenting, which does what God intends it to do, begins with this
radical and humbling recognition that our children don’t actually belong to
us.</p>
<p>— Paul David Tripp</p>
</blockquote>
<h4><a href="#war-of-art-by-steven-pressfield" aria-hidden="true" class="anchor" id="war-of-art-by-steven-pressfield"></a>War of Art by Steven Pressfield</h4>
<p>I love to hate on this book, but I'm glad I read it.</p>
<p>I do think it’s worth reading: first as a source of reasonable counsel on work,
second as an apologetic exercise in identifying really blatant theology, and
third as a conversation piece on the nature of creativity.</p>
<p>There is incredibly good advice on work and creativity in this book, it's just
so sad that he's so close and so far away. His seemingly boundless optimism
about the good in every human soul enables him to encourage people to work for
their best life now, but I think he won't be able to cure cancer or stop wars.</p>
<h4><a href="#hole-in-our-holiness-by-kevin-deyoung" aria-hidden="true" class="anchor" id="hole-in-our-holiness-by-kevin-deyoung"></a>Hole in Our Holiness by Kevin DeYoung</h4>
<blockquote>
<p>Many people have spoken to me about being ethical, moral, spiritual, or even
pious. But nobody seems to want to talk about being righteous.</p>
<p>— Kevin DeYoung</p>
</blockquote>
<p>I need to re-read this... I read half of it in the woods while hunting and need
to revisit it.</p>
<h4><a href="#the-annihiliation-trilogy-by-jeff-vandermeer" aria-hidden="true" class="anchor" id="the-annihiliation-trilogy-by-jeff-vandermeer"></a>The Annihiliation Trilogy by Jeff Vandermeer</h4>
<p>Weird and awesome. SCP Foundation meets Lovecraft in a weirdly Cormac
McCarthy-esque middle ground.</p>
<h4><a href="#algorithms-to-live-by-by-brian-christian-and-tom-griffiths" aria-hidden="true" class="anchor" id="algorithms-to-live-by-by-brian-christian-and-tom-griffiths"></a>Algorithms to Live By by Brian Christian and Tom Griffiths</h4>
<p>Really great... I am trying to decide if I would have liked this book as much
if I wasn't already a programmer, but I liked it.</p>
<h4><a href="#habits-of-grace-by-david-mathis" aria-hidden="true" class="anchor" id="habits-of-grace-by-david-mathis"></a>Habits of Grace by David Mathis</h4>
<p>I thought at first that I wouldn't like this book. I thought it'd be too short
or foolish. It did challenge me greatly that I don't put myself in the path of
some of the avenues of grace provided to us, notably fasting.</p>
<h4><a href="#randomly" aria-hidden="true" class="anchor" id="randomly"></a>Randomly...</h4>
<p>I also read some other parenting books like Moms On Call… and a slew of random
sci-fi books I picked up from giveaways and tor.com Some I finished, some I put
down because of disagreeable content or being boring.</p>
<ul>
<li>Oathbringer</li>
<li>The Quantum Thief</li>
<li>A Darker Shade of Magic</li>
<li>A Shadow in Summer</li>
<li>The Black Company</li>
<li>etc…</li>
</ul>
<p>I'm still working on:</p>
<ul>
<li>The 900 Days by Harrison E. Salisbury</li>
<li>Deep Work by Cal Newport</li>
</ul>
<h2><a href="#regrets" aria-hidden="true" class="anchor" id="regrets"></a>Regrets</h2>
<p>I focused on fitness more than faith. It's been a season of joy and peace, but
1 Cor 10:12 reminds me to be afraid of plateauing.</p>
<p>We were responsible with the resources God gave us, but I stressed out over
money more than I should.</p>
<p>I've become more and more aware at how poor a leader I am in my family… I
abdicate decisions that matter, and push too hard and overwhelm over things
that matter too little. At least I know now, and am working to fight my
tendencies.</p>
<h2><a href="#summary" aria-hidden="true" class="anchor" id="summary"></a>Summary</h2>
<p>It's been a pretty wonderful year… our cameras and phones are filled with sweet
memories, work stayed a dull angry buzz and didn't dominate my home life, I
made some things and encouraged some people, and I feel closer to my tiny
family and to God. I'm excited about next year!</p> ]]></description>
    </item>
    <item>
       <title>What&#39;s in my bag?</title>
       <link>http://evantravers.com/articles/2018/12/10/whats-in-my-bag/</link>
       <pubDate>Mon, 10 Dec 2018 16:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/12/10/whats-in-my-bag/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2018/12/beach.jpg"></p><div class="admonition tldr">
<p>I like my Goruck GR1. I have a system of pull-out organizers to keep me going. Jump to <a href="#conclusions">conclusions</a> for big thoughts...</p>
</div>
<p>I've had this conversation over text a couple of times… so I figured I'd write
it down more formally.  I'm not a hardcore &quot;EDC&quot; guy, nor am I a true one-bag
world traveler… I'm somewhere in between.</p>
<h2><a href="#the-mission" aria-hidden="true" class="anchor" id="the-mission"></a>The Mission</h2>
<p>My mission has changed since I started all this. There were a couple of phases,
but they inform what's in my bag as I realized what I lacked:</p>
<ol>
<li>College. I commuted an hour to school, and frequently spent the night in
town. I had an overnight duffel in my car with a couple of changes of
clothes, and a Timbuk2 Commuter 2.0 for textbooks and laptop. Towards my
senior year, I sent my Timbuk2 back for an RMA, and while using a temp
backpack realized how much better my back felt.</li>
<li>Early work. I graduated, and had <em>four</em> bags in my car at all times… one for
work, one for overnight, one with workout/climbing gear, and one for Just In
Case(TM). Right before I graduated, my family had experienced (along with
most of Alabama) <a href="http://evantravers.blogspot.com/2012/04/april-27th.html">being in the middle of a couple
tornadoes</a>. We were
fine praise the Lord, but I realized the value of having a few things with
me at all times.</li>
<li>One bag. I started to realize I over packed, and was tired of lugging stuff
in and out of my car each day so it wasn't stolen. During a mild snowstorm,
I realized it was horrible to travel on foot with three bags you can't leave
in the car. I also got my luggage misplaced on a trip to NZ, and realized
how <em>freeing</em> it was to only have a little. I started reading and learning
about people who lived out of one bag… and finally I got a bag that could
support this lifestyle.</li>
</ol>
<p>I currently commute a very short distance by car.</p>
<h2><a href="#the-bag" aria-hidden="true" class="anchor" id="the-bag"></a>The Bag</h2>
<p>I eventually purchased an OG Goruck GR1. I knew of the company in college, and
admired the bag's design, but was unwilling to pay the price. As a result, I
slowly made my way through the following bags (I'm actually skipping some):</p>
<h3><a href="#timbuk2-commuter" aria-hidden="true" class="anchor" id="timbuk2-commuter"></a>Timbuk2 Commuter</h3>
<p>Not a backpack. Surprisingly big, but as I packed too much it hurt my back.</p>
<h3><a href="#bfg-jedburgh" aria-hidden="true" class="anchor" id="bfg-jedburgh"></a>BFG Jedburgh</h3>
<p>Great little bag. I thought it'd be a cheaper GR1, but it was pretty bulky,
stiff, uncomfortable and lacked internal admin abilities.</p>
<h3><a href="#grey-ghost-operator-pack" aria-hidden="true" class="anchor" id="grey-ghost-operator-pack"></a>Grey Ghost Operator Pack</h3>
<p>Great daypack. Not big enough for a onebag and no laptop slot. I was using this
as the emergency bag, but it was pretty large for that.</p>
<h3><a href="#grey-ghost-steath-operator" aria-hidden="true" class="anchor" id="grey-ghost-steath-operator"></a>Grey Ghost Steath Operator</h3>
<p><em>Great</em> daypack. Slim and packed well. Not good for onebag, but lovely hiking
bag.</p>
<h3><a href="#vertx-gamut-plus" aria-hidden="true" class="anchor" id="vertx-gamut-plus"></a>Vertx Gamut Plus</h3>
<p>Too big. Too much organization. Looked like I was wearing a parachute. I
didn't have this bag long, I almost forgot about it.</p>
<h3><a href="#topo-designs-klettersack-32" aria-hidden="true" class="anchor" id="topo-designs-klettersack-32"></a>Topo Designs Klettersack 32</h3>
<p><img src="https://images.evantravers.com/articles/2018/12/topo.jpg" alt="topo klettersack" /></p>
<p>This is the first bag I was able to live out of. Large enough to pack
overnight, workout, EDC, and some needful just in case stuff. I <em>loved</em> the
look of this bag, but a top-loader like this is a pain to get in and out of
all day long… I would wind up unpacking the whole thing just to grab a
charger.</p>
<p>Eventually a friend bought a GR1. I got to handle it, walked back to my desk
and ordered one in December 2014. I haven't regretted it since. I carry it
every day, I work out with it, I travel with it… the internet is full of raving
reviews of this bag, and I won't try to add to them… but here are some pics of
my ruck on adventures.</p>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2018/12/mudrun.jpg" alt="unneccessarily epic mudrun epic">
  <img src="https://images.evantravers.com/articles/2018/12/stream.jpg" alt="playing in the stream with the girls">
</figure>
<figure class="thirds">
  <img src="https://images.evantravers.com/articles/2018/12/waterfall.jpg" alt="waterfall">
  <img src="https://images.evantravers.com/articles/2018/12/dc_ruck.jpg" alt="rucking in DC">
  <img src="https://images.evantravers.com/articles/2018/12/tandem.jpg" alt="tandem biking in Versailles">
</figure>
<p>I started to go through my library to find specific epic photos... but the list
got too long. Since I bought it 4 years ago, the GR1 has been with me on every
vacation, every work trip, every weekend adventure. I've gone one two trips to
Europe for at least a week, countless beach/mountain trips, I packed for the
hospital stay for my daughter's birth... I think I've got my money's worth.</p>
<h2><a href="#organization" aria-hidden="true" class="anchor" id="organization"></a>Organization</h2>
<p>I'll keep daily stuff like keys, sunglasses, and lip balm in the internal admin
pocket. It tends to become quite messy, so I try to keep it clear.</p>
<p>The GR1 has a few major pockets, but most of your organization will come from
internal packers. I'm going to separate these out by purpose.</p>
<h3><a href="#mission" aria-hidden="true" class="anchor" id="mission"></a>Mission</h3>
<p>I have been a software developer, and am presently working as a UX Designer. My
daily mission of making money requires a few tools:</p>
<h4><a href="#laptop" aria-hidden="true" class="anchor" id="laptop"></a>Laptop</h4>
<p>Sits in the laptop compartment of my GR1. If for some reason I need two
laptops, the document slot/holder on the inside can work in a pinch.</p>
<h4><a href="#goruck-wire-dopp" aria-hidden="true" class="anchor" id="goruck-wire-dopp"></a><a href="https://www.goruck.com/wire-dopp/">Goruck Wire Dopp</a></h4>
<img src="https://images.evantravers.com/articles/2018/12/doppkit.jpg" alt="">
<p>I love this little thing. Most days, all I have to do to know I'm ready for
work is have my Wire Dopp and my Laptop. If I'm going on an outdoor adventure
and am leaving my tech behind... I yank the laptop and the dopp and my bag is
ready to go.</p>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/12/doppkitexterior.jpg" alt="">
</figure>
<p>Always:</p>
<ul>
<li>Laptop Charger</li>
<li>Lacie Rugged with photography library</li>
<li>USB Drive</li>
<li>Dongles</li>
<li>Laptop Cleaning Screen</li>
</ul>
<p>Maybe:</p>
<ul>
<li>Camera Charger</li>
<li>Extra Battery for Camera</li>
</ul>
<h4><a href="#camera" aria-hidden="true" class="anchor" id="camera"></a>Camera</h4>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/12/familyhike.jpg" alt="mountainsmith case">
</figure>
<p>I almost always have a small Fuji camera riding in a <a href="https://www.amazon.com/gp/product/B00EWNJ5AM/ref=oh_aui_search_detailpage?ie=UTF8&amp;psc=1">Mountainsmith
case</a>
seen above. <a href="/articles/2014/04/21/every-day-camera/">I wrote about it</a>, but
since then I've upgraded to an X100F.</p>
<p>Sometimes when working photography, I'll use karabiners to dangle a <a href="https://fstopgear.com/products/icu/shallow-icu-small">F-Stop
ICU</a> from the top of the
bag. That way I can unzip the first half of the clamshell, access the gear, and
close it up. In that Small Shallow ICU I can carry an Xpro-2, 4 lenses, and
gear.</p>
<h4><a href="#notebook-and-pens" aria-hidden="true" class="anchor" id="notebook-and-pens"></a>Notebook and Pens</h4>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/12/notebookpens.jpg" alt="notebook and pens">
</figure>
<p>I use <a href="http://baronfig.com/">Baron Fig</a> notebooks and <a href="https://www.amazon.com/Staedtler-Triplus-Fineliner-Black-0-3mm/dp/B009CQKL3Y">Staedler
Pens</a>.
I <a href="/articles/2018/07/31/bullet-journal/">wrote a little about it</a> a while back.</p>
<p>I'll stick the notebook in the front document slot of the Goruck with a
<a href="https://nockco.com/cases/chimneytops">Nock.co pen case</a> (it's surprisingly
hard to find a minimal pen case that doesn't store 50 pens!) holding a pen, an
extra, and a little brass ruler I picked up on Amazon.  It's there because once
upon a time a water bottle leaked in my backpack and ruined a notebook. It
hasn't happened since, but that's still where I stick my notebook. I'm thinking
about moving the Wire Dopp out there, since it's more often that I'm pulling
that out first when I arrive a location... but tradition is hard to break.</p>
<p>I'll often also have my Kindle Paperwhite riding up front with the notebook.</p>
<h4><a href="#headphones" aria-hidden="true" class="anchor" id="headphones"></a>Headphones</h4>
<p>In prior years, I would carry a pair of
<a href="https://www.amazon.com/Audio-Technica-ATH-M50x-Professional-Monitor-Headphones/dp/B00HVLUR86/ref=sr_1_3?ie=UTF8&amp;qid=1544461416&amp;sr=8-3&amp;keywords=ath-m50">ATH-M50s</a>
back and forth. I currently just have a pair stashed at work and one at home.
:P</p>
<p>Up till a few months ago, I carried my newest pair of Apple headphones... handy
for podcasts, working out, calls, or just signalling that you are focusing in a
coffeeshop. I now have a pair of AirPods, which are very nice. I have a ghetto
Alfred 2 workflow for quickly switching them to my mac from my iPhone, I wish
that was more seamless.</p>
<p>If I was going to buy new headphones, I would consult Marco Arment's
<em>incredible</em> super-review of either
<a href="https://marco.org/headphones-bluetooth">bluetooth</a> or <a href="https://marco.org/headphones-closed-portable">closed
ear</a> headphones.</p>
<h4><a href="#external-battery" aria-hidden="true" class="anchor" id="external-battery"></a>External Battery</h4>
<p>I currently have an external battery for phones in small case with cables for
phones and kindle.</p>
<h3><a href="#water" aria-hidden="true" class="anchor" id="water"></a>Water</h3>
<figure class="dual">
  <img src="https://images.evantravers.com/articles/2018/12/bottleinbag.jpg" alt="photo of the bottle inside the bag">
  <img src="https://images.evantravers.com/articles/2018/12/bottleoutsidebag.jpg" alt="photo of a bottle outside">
</figure>
<p>One common criticism of the Goruck GR1 is the lack of an external water bottle
pouch. When I know I'm going to be jaunting around and will want water/coffee,
I'll typically either bring a standard Nalgene or <a href="https://www.yeti.com/en_US/drinkware/rambler-18-oz-bottle/">Yeti Rambler
18</a>. Whatever I
bring, it's going to be hard-sided, with a <em>solid</em> screw down lid with an
o-ring and a handle that supports a karabiner. I once had a with a d-ring
closure burst in the bag and ruin a precious journal.</p>
<p>When I place a bottle inside the bag, I will always karabiner the lid to the
top of the bag so that it hangs down vertically... this should lower the chance
of seepage dramatically.</p>
<figure>
</figure>
<p>As to quick access outside the bag for a walking commute... I have an <a href="http://www.itwnexusadvanced.com/content/grimloc">ITW
Grimloc</a> on the shoulder
strap. It works great for attaching water bottles to the front, which is more
convenient for quick coffee access on the subway.</p>
<p>On days when I don't have room or don't think I <em>need</em> a water bottle, I have a
<a href="https://store.itstactical.com/products/its-vapur-eclipse-anti-bottle">Vapur Eclipse Anti-Bottle</a>
stashed in the Just In Case of my GR1. It's come in handy on days when I
suddenly find myself on my way to a hike after work, or for filling up with
water after passing security in the airport.</p>
<h3><a href="#shelter" aria-hidden="true" class="anchor" id="shelter"></a>Shelter</h3>
<h4><a href="#edc" aria-hidden="true" class="anchor" id="edc"></a>EDC</h4>
<p>I live in Alabama, and I drive to work every day. Most seasons, the worst
conditions I face are a quick 200 ft of downpour between my car and the office.</p>
<p>Always in my bag: My trusty <a href="https://www.outdoorresearch.com/us/en/mens-helium-ii-jacket/p/2429691344006">Outdoor Research Helium II</a>.
It packs really well, sheds rain like a duck, and has a single pocket for my
phone. It's small enough that I can always have it with me... sometimes on
quick jaunts I'll clip it to the MountainSmith Camera bag.</p>
<p>The rain shell fits well over my optional <a href="https://www.mountainhardwear.com/mens-ghost-whisperer-down-jacket-1560901.html?cgid=ghostWhisp&amp;dwvar_1560901_variationColor=073#start=2">Mountain Hardwear Ghost Whisperer</a>
I love this jacket. Once again, very minimal as when I bought both these
jackets I was trying to figure out the smallest packing system that can handle
Alabama's coldest weather and nastiest rain.</p>
<p>I've hiked, climbed, hunted, and run in this gear, and while expensive I've
been really happy with it.</p>
<p>I also count sunglasses as shelter, so I have a pair of Raybans riding in the
mesh pocket.</p>
<h4><a href="#overnightworkout" aria-hidden="true" class="anchor" id="overnightworkout"></a>Overnight/Workout</h4>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/12/packing.jpg" alt="packing for paris">
</figure>
<p>If I'm packing for a few days, I will pack in my trusty <a href="https://www.eaglecreek.com/shop/organizers/pack-it-specter-compression-cube-set-s-m-ec041186#hero=0">Eagle Creek Specter
Compression Cube set</a>
and Arcteryx Index Folder (sadly discontinued!) The compression zipper feature
is super helpful for packing several days of clothes in 32L of bag.</p>
<p>I'll also use the <a href="https://www.eaglecreek.com/shop/toiletry-kits/pack-it-specter-quick-trip-ec041170">Eagle Creek Specter Quick Trip</a>
just works as a bathroom organizer in my drawer until it's time to travel, and
I'll throw it entire in the bag.</p>
<p>Of course, packing in a minimal bag is not possible without a minimal wardrobe.
There are many blog posts about what clothing brands to buy, etc. My advice?
Don't overthink it. Bring less than you need and wash on the way. Good
underwear and good socks go a long way.</p>
<p>Here's a sample packing list for a 12 day trip to Paris:</p>
<p><strong>Worn:</strong></p>
<ul>
<li>Mountain khaki pants</li>
<li>T shirt</li>
<li>Button up shirt</li>
<li>Blazer</li>
<li>Boots</li>
<li>Socks</li>
<li>Underwear</li>
</ul>
<p><strong>Packed:</strong></p>
<ul>
<li>1 jeans</li>
<li>1 shorts</li>
<li>1 sweatshirt</li>
<li>1 Myles running shorts/swimsuit</li>
<li>5 t-shirts</li>
<li>4 underwear</li>
<li>3 pairs of socks</li>
<li>Allbirds runners</li>
<li>gear</li>
</ul>
<p>I also really like my <a href="https://xeroshoes.com/sandals/minimalist/">xero
sandals</a>... I workout in them, run
in them, hit the beach in them, walk between bouldering problems, jaunt around
the hotel in them... great use of space in my bag.</p>
<h3><a href="#fire-and-other-niceities" aria-hidden="true" class="anchor" id="fire-and-other-niceities"></a>Fire and Other Niceities</h3>
<p>While my main purpose for my bag's contents is making code to help students
succeed, a secondary purpose is still being able to handle Just In Case(TM)
situations.</p>
<p>I take a lot of inspiration from <a href="https://hillpeoplegear.com/Education/Equipage">Hill People Gear's Equipage
List</a>, but I diverge slightly
because my environment and mission is different.</p>
<p>I typically have a small bag in my EDC that contains a variety of Just In
Case(TM) tools and gadgets. In the past, it's been in a variety of neat
organizers, my favorites being the <a href="https://www.goruck.com/padded-field-pocket-gr1/">GR1 Field
Pocket</a> and the <a href="https://hillpeoplegear.com/Products/CategoryID/7/ProductID/55">HPG Tool
Roll</a>. The Field
Pocket is nicely repurposable and less obvious if you have &quot;odd&quot; objects in it,
while the HPG Tool Roll is lighter weight and has the awesome roll out and use
ability.</p>
<p>Having all the &quot;dangerous&quot; stuff in one bag means that making my bag &quot;TSA
ready&quot; is as simple as pulling out one organizer out of the bag and I'm ready
for the airport.</p>
<p><img src="https://images.evantravers.com/articles/2018/12/basics.jpg" alt="basic EDC kit" /></p>
<p>Currently, the kit rides in a small <a href="https://store.kifaru.net/ultralight-pullouts-p22.aspx">Kifaru Ultralight
Pullout</a> and contains:</p>
<ul>
<li>a small <a href="https://www.packtowl.com/">packtowl</a> (Hitchhiker's Guide, anyone?)</li>
<li>Surefire Earplugs</li>
<li>some 550 cord</li>
<li>an <a href="https://store.itstactical.com/products/its-boo-boo-first-aid-kit">ITS BooBoo Kit</a></li>
<li>a <a href="http://www.multitool.org/tools/leatherman/leatherman-fuse-review">Leatherman Fuse</a></li>
<li>a <a href="https://www.surefire.com/titan-b.html">Surefire Titan Plus</a></li>
<li>bic mini lighter</li>
</ul>
<p><img src="https://images.evantravers.com/articles/2018/12/wilderness.jpg" alt="wilderness kit" /></p>
<p>I'll occasionally supplement that with a larger &quot;wilderness&quot; kit, today also
riding in a slightly bigger Kifaru pull out:</p>
<ul>
<li>fixed blade (today, an <a href="https://eseeknives.com/knives/esee-knives/esee-3/">Esee 3</a>)</li>
<li><a href="https://store.itstactical.com/products/its-mini-survival-kit-msk">ITS survival kit</a></li>
<li>3 Chemlights for signaling</li>
<li>An entry kit</li>
</ul>
<p>I always have some level of trauma gear on me. My favorites for EDC are both
made by <a href="http://darkangelmedical.com/">Dark Angel Medical</a>:</p>
<ul>
<li><a href="http://darkangelmedical.com/every-day-carry-edc-trauma-kit/">DAK EDC</a></li>
<li><a href="http://darkangelmedical.com/pocket-d-a-r-k-mini-trauma-kit/">DAK Pocket Dark Mini</a></li>
</ul>
<p>Don't just carry the gear, <a href="https://www.bleedingcontrol.org/">get some
training</a> on how to use it.</p>
<h3><a href="#food" aria-hidden="true" class="anchor" id="food"></a>Food</h3>
<p>I usually maintain a couple cliff bars in the mesh pocket of my bag. It's
always important to have a snack... you never know.</p>
<p>Just take it out before you fly, or they will flag you in some airports.</p>
<h3><a href="#random-other-stuff" aria-hidden="true" class="anchor" id="random-other-stuff"></a>Random Other Stuff</h3>
<p>Here are some honorable mentions that aren't currently riding in the bag.</p>
<h4><a href="#magpul-daka-pockets" aria-hidden="true" class="anchor" id="magpul-daka-pockets"></a><a href="https://www.magpul.com/products/magpul-daka-pouch-medium">Magpul DAKA Pockets</a></h4>
<p>These are awesome. Useful for lots of things, reusable, labelable... very
handy. I have a couple that I'll pull in for things like food, baby wipes,
documents I don't want to get wet... think of them as a rugged reusable
sandwhich bag, and I'm sure you'll find good uses. They work quite well as bags
for cables and small electronics, because of their heft they hold their shape
and stay slim which is great for packing.</p>
<h4><a href="#hpg-tool-roll" aria-hidden="true" class="anchor" id="hpg-tool-roll"></a>HPG Tool Roll</h4>
<p>I know I mentioned this before, but it's a great piece of gear. I store tools
and gear that I only need every once in a while, but the ability to lay out all
my tools out to fix a bike or build a fire is just wonderful.</p>
<h4><a href="#planck-light" aria-hidden="true" class="anchor" id="planck-light"></a>Planck Light</h4>
<p>Once upon a time, I used to take a KBC Poker II back and forth to work as a
main keyboard, but now I'm playing with this uber minimal keyboard. It's quite
fun, and rides with me most of the time, but it's not required. I have <a href="/articles/2018/09/12/i-built-a-keyboard/">other
keyboards</a> at work, and don't work
from a coffeeshop that often these days.</p>
<h4><a href="#razer-orochi" aria-hidden="true" class="anchor" id="razer-orochi"></a>Razer Orochi</h4>
<p>Another discontinued gem.This was the best mobile mouse I've ever seen, with
bluetooth and wired support in a nice little portable package. Back in my
college days of laddering SC2, this was always with me, but now it's handy for
long days of design or editing.</p>
<h4><a href="#diaper-bag" aria-hidden="true" class="anchor" id="diaper-bag"></a>Diaper Bag</h4>
<p>I'll throw my daughter's changing mat wipes/diaper combo in there for outings.
I've thought of making a more robust system out of a maxpedition medical bag,
including some contractor bags for waste disposal... but later I suppose.</p>
<h4><a href="#rucking-as-a-workout" aria-hidden="true" class="anchor" id="rucking-as-a-workout"></a>Rucking as a workout</h4>
<p><img src="https://images.evantravers.com/articles/2018/12/gorucklight.jpg" alt="goruck light" /></p>
<p>I've taken up hiking as a hobby, it's a fun cardio that's not as hard on my
knees. I actually completed my first Goruck Light recently, and so that's the
patch currently proudly displayed on the front of my bag.</p>
<p>I've got the 20lb and 30lb weights, sometimes I'll bring them in the bag in the
laptop slot when traveling as a little extra workout.</p>
<p>To learn more about rucking, check out this page: <a href="https://www.goruck.com/what-is-rucking/">&quot;What is
rucking&quot;</a>.</p>
<h2><a href="#problems" aria-hidden="true" class="anchor" id="problems"></a>Problems</h2>
<p>None whatsoever, can't you tell I have it all together? Seriously though, it's
not perfect for a few reasons:</p>
<h3><a href="#the-gr1-isnt-expandable" aria-hidden="true" class="anchor" id="the-gr1-isnt-expandable"></a>The GR1 isn't expandable.</h3>
<p>Constraints are a good design inspiration, and working 99% of my trips
completely in one bag has encouraged me to bring a little less and live a
little more. However, for longer trips or when carrying camera gear or caring
for family... it'd be nice to have 10 more liters. <em>cough</em> I can't afford a
GR2, <em>cough</em>.</p>
<p>I haven't seen a good way to expand the volume of a GR1. For extended trips,
I'll typically take a small duffel or day bag as a &quot;personal item&quot; and put some
of the stuff I'll want on the plane in there like cameras and kindles, or extra
shoes. I have been using <a href="https://www.amazon.com/Bomber-Company-Small-Weekender-Duffle/dp/B00Y7QH6UA">Bomber
Duffle</a>,
but I've burned through <em>five</em> of them, three of which disentegrated within
five minutes of me trying to zip them up.</p>
<p>I've got my eye on the <a href="https://tripleaughtdesign.com/shop/azimuth-duffel/">TAD Azimuth
Duffel</a>, being packable and
not too big.</p>
<h3><a href="#the-gr1-is-too-expensive" aria-hidden="true" class="anchor" id="the-gr1-is-too-expensive"></a>The GR1 is too expensive.</h3>
<p>Goruck recently hiked up their prices dramatically. When I bought my GR1, it
was a really good purchase, but with the price increase it's a harder sell. If
I was buying an EDC today, I'd probably take a look at offerings from:</p>
<h4><a href="#tom-bihn" aria-hidden="true" class="anchor" id="tom-bihn"></a><a href="https://www.tombihn.com">Tom Bihn</a></h4>
<p>A favorite of the <a href="http://reddit.com/r/onebag">onebag</a> community, these bags
are often found on the backs of some hardcore travelers. Well made, well
organized, and not so fashionable or military that they scream &quot;steal me!&quot;</p>
<h4><a href="#evergoods" aria-hidden="true" class="anchor" id="evergoods"></a><a href="http://evergoods.us">Evergoods</a></h4>
<p>A relative newcomer, evergoods CPL24 is probably the bag I'd end up trying
today for EDC. If I'm going to buy a slightly bigger travel bag, their new 40L
Civic Transport is where my money will go.</p>
<h4><a href="#pdw" aria-hidden="true" class="anchor" id="pdw"></a><a href="https://prometheusdesignwerx.com/">PDW</a></h4>
<p>Another hipster favorite, these bags are a nice blend of backcountry and city.
I don't care for the hipbelt on a bag that size, and it's a little too...
woodsy, but they are nice.</p>
<h4><a href="#hill-people-gear" aria-hidden="true" class="anchor" id="hill-people-gear"></a><a href="http://hillpeoplegear.com">Hill People Gear</a>.</h4>
<p>A backcountry favorite of mine. Not very conducive to EDC with laptops, but
incredibly comfortable weight harness and well built.</p>
<h4><a href="#mystery-ranch" aria-hidden="true" class="anchor" id="mystery-ranch"></a><a href="https://www.mysteryranch.com">Mystery Ranch</a></h4>
<p>While a tried and true bag company, I used to ignore MR for my usages because
they weren't particularly laptop/EDC friendly. Some of their newer bags are
<em>really</em> close to what I want though... the urban assault 21L and the
Prizefighter are steps in the right direction.</p>
<h4><a href="#triple-aught-design" aria-hidden="true" class="anchor" id="triple-aught-design"></a><a href="https://tripleaughtdesign.com">Triple Aught Design</a></h4>
<p>This EDC fanboy favorite isn't less expensive... and until their Axiom line
they didn't really have a laptop or normal workspace friendly option.
Howevever, their brand new Axiom 24L is just about the right size and feature
set. I'm also interested in their Spectre series.</p>
<h4><a href="#kifaru" aria-hidden="true" class="anchor" id="kifaru"></a><a href="https://kifaru.net">Kifaru</a></h4>
<p>Traditionally a hunting/military pack company, although some of their new
entries look tasty. The Antero 2.0 is expensive but featureful: <a href="https://kifaru.net/store/packs/day-packs/antero-2-0/">Antero
2.0</a></p>
<h4><a href="#crye-precision" aria-hidden="true" class="anchor" id="crye-precision"></a><a href="https://www.cryeprecision.com/ProductDetail/poubp300000_exp-1500-pack">Crye Precision</a></h4>
<p>Crye Precision's Exp 1500 and Exp 2100 bags look pretty ideal... not terribly
cheaper than the GR1 but almost certainly well made.</p>
<h4><a href="#goruck" aria-hidden="true" class="anchor" id="goruck"></a><a href="http://www.goruck.com">Goruck</a></h4>
<p>Who am I kidding? I'd probably buy another GR1.</p>
<h2><a href="#conclusions" aria-hidden="true" class="anchor" id="conclusions"></a>Conclusions</h2>
<p>To pack minimally, don't buy more bag, own less stuff.</p>
<p>Use modular lightweight organizers based on function to make your bag more
universal.</p>
<p>Audit your stuff regularly to remove that which isn't used.</p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="http://www.reddit.com/r/onebag">r/onebag</a></li>
<li><a href="http://www.redteams.net/">redteamsblog</a></li>
<li><a href="http://www.packhacker.com/">Packhacker</a></li>
<li><a href="http://www.carryology.com/">Carryology</a></li>
<li><a href="http://www.loadedpocketz.com/">loadedpocketz</a></li>
<li><a href="https://marco.org/headphones-closed-portable">marco arment's portable headphone review</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>What I&#39;m Reading: November-ish Edition</title>
       <link>http://evantravers.com/articles/2018/11/29/what-i-m-reading-novemberish-edition/</link>
       <pubDate>Thu, 29 Nov 2018 21:52:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/11/29/what-i-m-reading-novemberish-edition/</guid>
       <description><![CDATA[ <p>I need to do some more writing, but here's some articles I liked out of my
Instapaper account... I'm still reading the same books. These days I read
really slowly, and that 900 Days book is going to take a while.</p>
<h2><a href="#antitrust-the-app-store-and-apple" aria-hidden="true" class="anchor" id="antitrust-the-app-store-and-apple"></a>Antitrust, the App Store, and Apple</h2>
<p>I am really liking Stratechery as a blog, and this post is no exception. Really
interesting discussion with good examples on a complex issue.</p>
<p><a href="https://stratechery.com/2018/antitrust-the-app-store-and-apple/">Read...</a></p>
<h2><a href="#30-things-ive-learned" aria-hidden="true" class="anchor" id="30-things-ive-learned"></a>30 Things I’ve Learned</h2>
<p>I'm going to re-read this one a few times, there's a number of good nuggets in
there. Among my favorites:</p>
<blockquote>
<p>Working hard at the wrong thing will only take you where you don't want to go
faster.</p>
</blockquote>
<p><a href="https://seanwes.com/2018/30-things-ive-learned/">Read...</a></p>
<h2><a href="#the-amazing-story-of-frank-barker-and-campus-outreach" aria-hidden="true" class="anchor" id="the-amazing-story-of-frank-barker-and-campus-outreach"></a>The Amazing Story of Frank Barker and Campus Outreach</h2>
<p>A sweet portrait of a man that shaped my life as a pastor and as my
grandfather's boss.</p>
<p><a href="https://www.thegospelcoalition.org/article/amazing-story-frank-barker-campus-outreach/">Read...</a></p>
<h2><a href="#regret-stergram--dhh--medium" aria-hidden="true" class="anchor" id="regret-stergram--dhh--medium"></a>Regret-stergram – DHH – Medium</h2>
<blockquote>
<p>Funny thing, as soon as I made the choice, it seemed so perfectly clear. Why
had I been stuck here for so long? Why had I kept feeding Facebook the fodder
they were using to addict others?</p>
</blockquote>
<p>DHH usually is a bit more pugilistic than I aspire to be, but this article is
great.</p>
<p><a href="https://medium.com/@dhh/regret-stergram-ea4073a64911">Read...</a></p>
<h2><a href="#how-technology-is-hijacking-your-mindfrom-a-magician-and-google-design-ethicist" aria-hidden="true" class="anchor" id="how-technology-is-hijacking-your-mindfrom-a-magician-and-google-design-ethicist"></a>How Technology is Hijacking Your Mind — from a Magician and Google Design Ethicist</h2>
<blockquote>
<p>And this is exactly what product designers do to your mind. They play your
psychological vulnerabilities (consciously and unconsciously) against you in
the race to grab your attention.</p>
</blockquote>
<p>As a UX practictioner, this was a good challenge to my thinking of how I
construct choice architectures... just by copying some UI from another product
I can be continuing a dark pattern.</p>
<p><a href="https://medium.com/thrive-global/how-technology-hijacks-peoples-minds-from-a-magician-and-google-s-design-ethicist-56d62ef5edf3">Read...</a></p>
<h2><a href="#trailer-they-shall-not-grow-old" aria-hidden="true" class="anchor" id="trailer-they-shall-not-grow-old"></a>Trailer: They Shall Not Grow Old</h2>
<p>I remember hearing about this a while back, but this is the first that I've
seen of it and I'm <em>so</em> excited to see this... hopefully with my history-loving
grandfather.</p>
<p><a href="https://kottke.org/18/11/they-shall-not-grow-old">Watch...</a></p> ]]></description>
    </item>
    <item>
       <title>Tools for Habit-Building</title>
       <link>http://evantravers.com/articles/2018/11/26/tools-for-habit-building/</link>
       <pubDate>Mon, 26 Nov 2018 16:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/11/26/tools-for-habit-building/</guid>
       <description><![CDATA[ <p>I got into a conversation about disciplines and habits as we head into the
holidays (where my disciplines go to die) and into the new year (where my
habits are often reborn for the fifth time…) While talking several of us
reaffirmed how some form of accountability has been incredibly helpful for
developing a successful habit… either a mental accountability to yourself (i.e.
the streak method), a mentor accountability (i.e. coaches and trainers) or
mutual accountability (i.e. a team or tribe)</p>
<p>The insight that helped me finally make changes in my discipline came from the
excellent <a href="https://shawnblanc.net/2017/12/plan-your-year-workbook/">plan your
year</a> workbook: Choose
one habit per month to focus upon. Make deliberate sacrifices to put off
distraction in order to put on this habit. Forgive yourself when you fail to
follow through, and always start again immediately. I'm excited to be a steward
of twelve more months, twelve more opportunities to forge new habits in 2019.</p>
<p>As usual, there are apps for that… so I thought I'd pass on some good ones I'm
researching as I plan on implementing my own personal habit-building machine
for this upcoming year. I haven't used all of them, but they come highly rated
from what I've read.</p>
<p>Here are some tools you can consider using to help you build habits that form
the disciplines that shape your life:</p>
<h2><a href="#pen-and-paper" aria-hidden="true" class="anchor" id="pen-and-paper"></a>Pen and Paper</h2>
<p>There is no reason to add another app to the mix… <em>especially</em> if your phone is
part of the distraction you are trying to overcome.</p>
<p>There are a myriad of gorgeous habit tracker examples on the Internet, but
don't be overwhelmed by the illustrations and hand-lettering… for the past six
months I've just written down the dates in the month, and put a little dot next
to each day for each habit. At the end of the day, I put an <code>x</code> through the
habits I complete. It's very satisfying to check them off… and you don't need
<em>anything</em> more than a pen and paper.</p>
<p>You can read more about the method I used in a <a href="/articles/2018/07/31/bullet-journal/">previous article about my
journal</a>.</p>
<p>I have found very little is better for a habit than to write it down… and
show/tell <em>one</em> person. No need to get complicated at first, just start.</p>
<h2><a href="#your-task-manager" aria-hidden="true" class="anchor" id="your-task-manager"></a>Your Task Manager</h2>
<p>Many of us use some form of todo list or task manager like iOS Reminders,
Omnifocus, Things, or trello… the list goes on. Wherever you go to track your
progress, it's probably a good idea for your habits to be present where your
attention is. It may help you sacrifice or change priorities in order to
protect your habits.</p>
<p>I have just started using Things 3 as my task manager… I will likely use Things
to handle my habits since it will stare me in the face all day.</p>
<h2><a href="#productive" aria-hidden="true" class="anchor" id="productive"></a>Productive</h2>
<p>Productive is a great tool for personal habits. The free version is quite full
featured… especially if you intend to focus on two or three habits at a time.</p>
<p>It largely follows the streak methodology, with a few nice twists. I suppose
the notifications are the nudge methodology… if you are willing to pay their
subscription they give you neat features like location based reminders.
(Stretch when I get home, take a moment to pray/meditate when I get to work,
etc.)</p>
<p>This may be a good choice for personal habits that you may not want to share
with anyone but the Lord… as far as I can tell it doesn't have a built in
sharing/accountability feature other than texting people screenshots.</p>
<p>As I said… I would be <strong>very</strong> cautious about using your phone for habits if
you tend to get sucked into social media or email in the tender hours of the
morning. (This is a big problem for me.) I have been fighting this problem with
some success by using the new iOS Downtime feature… I simply block all apps
other than ones related to my habits until it's time to go to work.</p>
<p><a href="https://itunes.apple.com/us/app/productive-habit-tracker/id983826477?mt=8">Productive</a></p>
<h2><a href="#coachme" aria-hidden="true" class="anchor" id="coachme"></a>Coach.me</h2>
<p>I haven't used this one, but I love the concept. Pick a habit, and get
connected with a tribe of people all working towards personally implementing
the same habit.</p>
<p>This would be really handy for exercise habits or learning a new skill… some of
us are isolated by location, schedule, or personality. This seems to be a way
to ease into finding encouragement for your journey, as well as sharing tips
for making your habit stick.</p>
<p><a href="https://www.coach.me/">Coach.me</a></p>
<h2><a href="#references" aria-hidden="true" class="anchor" id="references"></a>References</h2>
<ul>
<li><a href="https://betterhumans.coach.me/how-to-create-any-habit-with-advice-from-the-four-greatest-habit-masters-9b96528db259">How to create any habit with advice from the four greatest habit masters</a></li>
<li><a href="https://medium.com/s/story/the-simple-truth-behind-reading-200-books-a-year-1767cb03af20">The simple truth behind reading 200 books a year</a></li>
<li><a href="https://thesweetsetup.com/apps/best-habit-tracking-app-ios/">best habit tracking apps for iOS</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>What I&#39;m reading: October-ish Edition</title>
       <link>http://evantravers.com/articles/2018/11/13/what-i-m-reading-octoberish/</link>
       <pubDate>Tue, 13 Nov 2018 04:31:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/11/13/what-i-m-reading-octoberish/</guid>
       <description><![CDATA[ <p>I used to insta-share everything I liked on Instapaper immediately on
Twitter/Slack... I'm going to try a different path and accumulate links into
posts like this. Just thinking about trying something different. I'm not going
to turn into Daring Fireball, I promise.</p>
<p>Here's a sampling of what I've been reading...</p>
<h2><a href="#books" aria-hidden="true" class="anchor" id="books"></a>Books</h2>
<h3><a href="#deep-work-by-cal-newport" aria-hidden="true" class="anchor" id="deep-work-by-cal-newport"></a>Deep Work by Cal Newport</h3>
<p>Still working through this on audible. I'll likely post a summary/review when
I'm done.</p>
<h3><a href="#900-days-the-siege-of-leningrad-by-harrison-e-salisbury" aria-hidden="true" class="anchor" id="900-days-the-siege-of-leningrad-by-harrison-e-salisbury"></a>900 Days: The Siege of Leningrad by Harrison E. Salisbury</h3>
<p>I've been meaning to finish this for years. It's a fascinating study of flawed
leadership principles and brave souls making the best of the worst situation
I've ever read.</p>
<h3><a href="#you-and-me-forever-by-francis-and-lisa-chan" aria-hidden="true" class="anchor" id="you-and-me-forever-by-francis-and-lisa-chan"></a>You and Me Forever by Francis and Lisa Chan</h3>
<p>Almost done with this one. Highly recommended.</p>
<h2><a href="#blogs" aria-hidden="true" class="anchor" id="blogs"></a>Blogs</h2>
<h3><a href="#the-experience-economy" aria-hidden="true" class="anchor" id="the-experience-economy"></a>The Experience Economy</h3>
<p>The phrase “The Experience Economy”, like the worst sort of corporate speak,
sounds less like a viable business plan than it does a discarded slogan for
Las…</p>
<p><a href="https://stratechery.com/2018/the-experience-economy/">read more…</a></p>
<h3><a href="#the-source-history-of-cat" aria-hidden="true" class="anchor" id="the-source-history-of-cat"></a>The Source History of Cat</h3>
<p>I once had a debate with members of my extended family about whether a
computer science degree is a degree worth pursuing. I was in college at the
time and trying…</p>
<p><a href="https://twobithistory.org/2018/11/12/cat.html">read more…</a></p>
<h3><a href="#the-american-grandmaster-who-could-become-world-champion" aria-hidden="true" class="anchor" id="the-american-grandmaster-who-could-become-world-champion"></a>The American Grandmaster Who Could Become World Champion</h3>
<p>If you ask the people who know Fabiano Caruana what Fabiano Caruana is like,
they will tell you that Fabiano Caruana is, you know, just a normal guy.  He
likes movies. He likes music. He likes to eat. He works out. He goes on dates.
Just a normal guy.  Just a normal guy who is ranked second in the world in
chess...</p>
<p><a href="https://fivethirtyeight.com/features/the-american-grandmaster-who-could-become-world-champion/">read more…</a></p>
<h3><a href="#whats-in-my-bag-2018-edition" aria-hidden="true" class="anchor" id="whats-in-my-bag-2018-edition"></a>What’s in My Bag, 2018 Edition</h3>
<p><a href="https://ma.tt/2018/10/whats-in-my-bag-2018-edition/">read more…</a></p>
<h3><a href="#deep-work-update" aria-hidden="true" class="anchor" id="deep-work-update"></a>Deep Work Update</h3>
<p>Last week I made the decision to schedule every minute of my day, and wanted to
share a quick update. In short, this is working out very well for me so far.</p>
<p><a href="http://bradfrost.com/blog/post/deep-work-update/">read more…</a></p>
<h3><a href="#writing-a-screencast-video-editor-in-haskell" aria-hidden="true" class="anchor" id="writing-a-screencast-video-editor-in-haskell"></a>Writing a Screencast Video Editor in Haskell</h3>
<p>For the last six months I’ve been working on a screencast video editor called
Komposition, and it’s now released and open source. This is an experience
report, based on a talk from Lambda World Cádiz 2018, that’ll give an overview
of Komposition’s design, implementation, testing, and planned future work.</p>
<p><a href="https://wickstrom.tech/programming/2018/10/26/writing-a-screencast-video-editor-in-haskell.html">read more…</a></p>
<h3><a href="#the-psychology-of-design" aria-hidden="true" class="anchor" id="the-psychology-of-design"></a>The Psychology of Design</h3>
<p>There are a number of debates about which additional skills designers should
learn. Should designers code, write, or understand business? These skills are
incredibly valuable but perhaps not essential. However, I would argue that
every designer should learn the fundamentals of psychology...</p>
<p><a href="https://alistapart.com/article/psychology-of-design">read more…</a></p> ]]></description>
    </item>
    <item>
       <title>Git Gud at Vim 4: Plugins and Configs</title>
       <link>http://evantravers.com/articles/2018/11/06/git-gud-at-vim-4-plugins-and-configs/</link>
       <pubDate>Tue, 06 Nov 2018 20:25:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/11/06/git-gud-at-vim-4-plugins-and-configs/</guid>
       <description><![CDATA[ <p>Our quick jaunt through some of Vim's features is coming to a close. In this
article, I'd like to explore some of the settings that I have in my .Vimrc file
to help you get set up in an optimal way. I'd also like to highlight some
hidden Vim magic by touching on some plugins that both benefit and extend that
functionality.</p>
<p>In my opinion, everyone should start a bare file, and add slowly as they
realize what they need.</p>
<p>When I started out I used a &quot;starter pack&quot; style configuration someone else had
put together, and as a result I didn't learn a lot of the neat abilities of Vim
that I've outlined in previous articles because I didn't know what was Vim and
what was a plugin.</p>
<p>I also don't recommend using plugins to &quot;make Vim an IDE&quot; or &quot;make Vim behave
like [insert other editor here]&quot;. This also will take you down a path of
ignoring the strengths that Vim posesses and frustrate you as you try to force
Vim to behave in a way it wasn't designed. Vim is designed in a manner
consistent with *NIX philosophy: <a href="https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well">do one thing, and do it
well</a>.</p>
<p>I intend to opinionatedly recommend a few useful plugins that fit this
strategy. This is not going to be a comprehensive list of <em>all</em> useful plugins
or cool plugins, there are other websites for that kind of thing.</p>
<p>If you want to just look at my current config file (I use <a href="http://neovim.org/">neovim</a>
so it's located usually in ~/.config/nvim/init.vim), look
<a href="https://github.com/evantravers/dotfiles/blob/b37162bc66ed55538f50b100096b8e71b3dcc9f3/nvim/.config/nvim/init.vim">here</a>.
My configuration is opinionated and specific to me. I write a lot of markdown,
HTML, and elixir for fun. I would advise in general, if you don't know what
something does, don't add it to your configuration.</p>
<p>I wrote an annotated version of the current configuration file
<a href="https://gist.github.com/4d086b26f75d3ef7b79f7d121c0888fc">here</a> if you need
more commentary on what everything does.</p>
<h2><a href="#config-essentials" aria-hidden="true" class="anchor" id="config-essentials"></a>Config Essentials</h2>
<p>There are a number of &quot;sanity&quot; settings that I consider useful for most Vim
usage. I'll sum them up here:</p>
<pre class="lumis"><code class="language-vim" translate="no" tabindex="0"><div class="line" data-line="1">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; turn off compatibility mode with vi</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">no</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">compatible</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">backspace</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span>indent,eol,start
</div><div class="line" data-line="4">
</div><div class="line" data-line="5">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; turn on filetype plugins</span>
</div><div class="line" data-line="6">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">filetype</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">plugin</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">indent</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span>
</div><div class="line" data-line="7">
</div><div class="line" data-line="8">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; turn on colors</span>
</div><div class="line" data-line="9">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">termguicolors</span>
</div><div class="line" data-line="10">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">syntax</span> <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">on</span>
</div><div class="line" data-line="11">
</div><div class="line" data-line="12">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; ignore case in search</span>
</div><div class="line" data-line="13">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">ignorecase</span>
</div><div class="line" data-line="14">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">smartcase</span>
</div><div class="line" data-line="15">
</div><div class="line" data-line="16">  <span style="color: light-dark(#57606a, #8b949e); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot; enable buffers to be hidden</span>
</div><div class="line" data-line="17">  <span style="color: light-dark(#cf222e, #ff7b72); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">set</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">hidden</span>
</div></code></pre>
<p>If you have questions about what these do, you can always search <code>:help</code> for
them.</p>
<p>You can also use tpope's <a href="https://github.com/tpope/vim-sensible/">vim-sensible</a>
plugin to achieve most of this in one plugin.</p>
<h3><a href="#language-files-and-omnicomplete" aria-hidden="true" class="anchor" id="language-files-and-omnicomplete"></a>Language Files and Omnicomplete</h3>
<p>Vim ships with compatibility for <em>many</em> languages, but you may want to add an
updated package for improved syntax highlighting, and more importantly:
omnicomplete functions! (Fun to say <em>and</em> fun to use!)</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/11/complete_modes.svg" alt="">
  <figcaption>
    <ol>
      <li>
        <code>&lt;c-p&gt;</code> to complete in file to complete a word from in the file.
      </li>
      <li>
        <code>&lt;c-x&gt;&lt;c-f&gt;</code> can autocomplete files on your
        filesystem... I think it'll even work over ssh/ftp!
      </li>
      <li>
        Using <code>&lt;c-x&gt;&lt;c-o&gt;</code> I can view the methods
        available in python on the objects I'm referencing. Notice how the
        omnifunc even puts the documentation in a buffer split above the file?
        Awesome!
      </li>
    </ol>
  </figcaption>
</figure>
<p>Vim ships with a capable completion engine that you can read about in
<code>:help ins-completion</code>. You can complete words, spell check and synonyms, whole
lines, filenames, tags... or using the omnifunc. You may need to add an updated
language file and install some external packages to make an omnifunc work
properly, but when it does it can provide information like all the methods
available on an object.</p>
<blockquote>
<p>Pro tip: For some reason, <code>:help omnicomplete</code> doesn't find the right help
file. Try <code>:help compl-omni</code>.</p>
</blockquote>
<h2><a href="#plugins" aria-hidden="true" class="anchor" id="plugins"></a>Plugins</h2>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/11/update.svg" alt="">
  <figcaption>plug-vim has an awesome async update!</figcaption>
</figure>
<p>Vim plugins are (mostly) written in <a href="https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script">vim
script</a>, a sort of
lisp-y like language. As the editor has been around for a long time, there are
a whole range of plugins to solve nearly any problem that you face.</p>
<p>In fact, some core Vim functionality is implemented as a plugin, including the
<em>very</em> awesome <a href="https://www.vim.org/scripts/script.php?script_id=1075">netrw</a>.</p>
<div class="clear"></div>
<blockquote>
<p>One of the main reasons to learn Vim is that it's everywhere. It is worth
noting... if you customize your Vim instance, those customizations won't be
present on every box you SSH into. It is really valuable to know how to use
Vim with no customizations present, so that in that situation you aren't
totally lost.</p>
</blockquote>
<p>I use <a href="https://github.com/junegunn/vim-plug">plug-vim</a> to manage my plugins.
There are several excellent ways to download and load plugins, but this is my
favorite. It lets you define all your plugins and easily keep them up to date.</p>
<p>Now that we have a way to download and update our plugins, let's look at a few:</p>
<h3><a href="#core-must-have-plugins" aria-hidden="true" class="anchor" id="core-must-have-plugins"></a>Core: Must Have Plugins</h3>
<p>These plugins or configurations I think are very useful no matter what kind of
text files you are working on.</p>
<h4><a href="#fugitivevim" aria-hidden="true" class="anchor" id="fugitivevim"></a>fugitive.vim</h4>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/11/fugitive.svg" alt="">
  <figcaption>Showing some of fugitive's time travel at work</figcaption>
</figure>
<p>I use this plugin <em>every</em> day. To be honest, I probably use 20% of its
functionality, but I use the <code>:Gblame</code> command nearly constantly. It allows me
to travel back in time through code (that has a git history) to see who added
what work when and why. This allows me to see who was the last person to touch
this code, to find out from their commit message why they did it, and follow up
with them if I have more questions.</p>
<p>For those who don't need to time travel... fugitive.vim also has <code>:Gbrowse</code>, an
awesome command that opens the current file or range on github.com for easy
sharing. I use this almost every day to send someone a question or a fragment
of code over a chat program like slack.</p>
<h4><a href="#fzf" aria-hidden="true" class="anchor" id="fzf"></a>fzf</h4>
<p>This plugin is the main way I open files in vim. Those who have used &quot;fuzzy
finder&quot; interfaces that have become common in every editor will feel right at
home. It consists of an executable <em>and</em> a Vim plugin. I use fzf's CLI
executable in addition to the Vim plugin, it's awfully nice to have the same
interface to find and select files in and out of my editor.</p>
<p>FZF has the ability to help you do <em>many</em> other things, like switch buffers and
git branches, but I honestly only use it for selecting files. It is really nice
to have an extendable interface that is useful in and out of vim though.</p>
<h4><a href="#targetsvim-and-surroundvim" aria-hidden="true" class="anchor" id="targetsvim-and-surroundvim"></a>targets.vim and surround.vim</h4>
<p>Both <a href="https://github.com/wellle/targets.vim">targets.vim</a> and
<a href="http://github.com/tpope/vim-surround">vim-surround</a> extend Vim with new text
objects and motions that make working with text surrounded by delimiters,
parameters, or strings easier. Since most code has blocks, tags,
<code>(&lbrace;[&quot;'``'&quot;]&rbrace;)</code>, of all kinds... it is worth looking into.</p>
<p>Once again, these plugins don't drastically change Vim's behavior, just extend
and enhance the superpowers already there.</p>
<h4><a href="#tpopery" aria-hidden="true" class="anchor" id="tpopery"></a>tpopery</h4>
<p>It turns out that
<a href="https://github.com/tpope?utf8=%E2%9C%93&amp;tab=repositories&amp;q=vim&amp;type=&amp;language=">tpope</a>
has written <em>so</em> many plugins... I might as well just list him as a sponsor of
my work. I've already mentioned fugitive and surround.vim, I'm just going to
list just a few more that I use constantly:</p>
<ul>
<li><a href="http://github.com/tpope/vim-commentary">commentary</a> provides an operator for
commenting out code.</li>
<li><a href="http://github.com/tpope/vim-endwise">endwise</a> automatically ends certain
code structures. (i.e., adds an <code>end</code> for ruby)</li>
<li><a href="http://github.com/tpope/vim-eunuch">eunuch</a> lets you save, delete, move, or
sudo save files you already have open in your editor.</li>
<li><a href="http://github.com/tpope/vim-ragtag">ragtag</a> provides operators and motions
for web templating languages. (HTML tags, get it?)</li>
<li><a href="http://github.com/tpope/vim-repeat">repeat</a> extends the repeat operator <code>.</code>
to work in more places and with more plugins.</li>
<li><a href="http://github.com/tpope/vim-unimpaired">unimpaired</a> adds a host of useful
bindings and toggles for common Vim actions.</li>
<li><a href="http://github.com/tpope/vim-vinegar">vinegar</a> cleans up :netrw views to make
browsing easier.</li>
</ul>
<h3><a href="#cool-neat-stuff" aria-hidden="true" class="anchor" id="cool-neat-stuff"></a>Cool: Neat Stuff</h3>
<h4><a href="#gundo-wait-go-back" aria-hidden="true" class="anchor" id="gundo-wait-go-back"></a>Gundo: Wait, go back!</h4>
<p>Vim doesn't just store a straight undo/redo path... it stores a tree of states.
If you use a normal editor and undo a few changes then make some new changes,
the changes you made previously are lost. Vim keeps track of all your changes,
and you can traverse this tree (natively) using the <code>g-</code> and <code>g+</code> operators, as
well as the <code>:earlier</code> and <code>:later</code> commands which take arguments. Several
times I've been saving and re-saving a config file to fix some server, and then
lost some critical part of the configuration in all the changes. <code>:earlier 1h</code>
throws the file back to its state from one hour ago, and saved the day!</p>
<figure class="right">
  <img src="https://camo.githubusercontent.com/02d40619ef8e5559acabb28df959a42e0c783d74/687474703a2f2f6661726d352e7374617469632e666c69636b722e636f6d2f343131332f353039333131343630355f656263343664363439342e6a7067" alt="">
</figure>
<p>If these native commands aren't clear enough, there's an awesome plugin in
<a href="https://github.com/sjl/gundo.vim">gundo.vim</a>. Gundo gives you the ability to
visualize this tree of changes and move around it with ease.</p>
<h4><a href="#emmetvim" aria-hidden="true" class="anchor" id="emmetvim"></a>Emmet.vim</h4>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/11/emmet.svg" alt="">
  <figcaption>
    Emmet.vim at work. Notice how I can undo the operation of expanding the
    abbreviation, adjust it, and then expand it again until I get what I want.
  </figcaption>
</figure>
<p><a href="https://en.wikipedia.org/wiki/Emmet_(software)">Emmet</a> has been a constant
companion of my professional career for a <em>long</em> time. The first time I used it
it was known as Zen Coding, and I used it as a plugin for Textmate or Coda.app.
It's nice that the editor ecosystem is robust enough that I can use the same
cool interface in multiple editors, including my beloved Vim.</p>
<p>In short, Emmet is a shorthand notation for generating HTML and CSS. I used to
use it a lot more than I do now, but it's still been handy even while writing
this series of articles. When I want to put in a photo in a figure, I can
write: <code>figure.right&gt;img+figcaption&lbrace;This will be the caption&rbrace;</code>, then press
<code>y&lt;leader&gt;</code> to generate:</p>
<div class="clear"></div>
<pre class="lumis"><code class="language-html" translate="no" tabindex="0"><div class="line" data-line="1"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figure</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">class</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">right</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="2">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">img</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">src</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span> <span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">alt</span><span style="color: light-dark(#0550ae, #79c0ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">=</span><span style="color: light-dark(#0a3069, #a5d6ff); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&quot;&quot;</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="3">  <span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>This will be the caption<span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figcaption</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div><div class="line" data-line="4"><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&lt;/</span><span style="color: light-dark(#116329, #7ee787); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">figure</span><span style="color: light-dark(#1f2328, #e6edf3); font-weight: light-dark(normal, normal); text-decoration: light-dark(none, none);">&gt;</span>
</div></code></pre>
<p>If you don't really write HTML, then a snippets engine like
<a href="https://github.com/SirVer/ultisnips">ultisnips</a> may be a better option for
you.</p>
<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2>
<p>There's honestly too much to cover. There are <em>so</em> many ways that you can
customize and tweak vim, tons of colorschemes, autocomplete functions, etc. I
just hope that this quick peak gives you a hint as to how I use Vim, and ways
that you can use and customize Vim for your maximum effectiveness.</p>
<p>If you have questions or need help customizing your setup, <a href="/contact">drop me a
line</a>! Let me know how I can help!</p>
<h2><a href="#read-more" aria-hidden="true" class="anchor" id="read-more"></a>Read More:</h2>
<ul>
<li><a href="https://github.com/evantravers/dotfiles/blob/b37162bc66ed55538f50b100096b8e71b3dcc9f3/nvim/.config/nvim/init.vim">my config</a></li>
<li><a href="https://gist.github.com/4d086b26f75d3ef7b79f7d121c0888fc">my config with waaaaay more comments</a></li>
<li><a href="https://vimawesome.com/">vim awesome</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Git Gud at Vim 3: Registers and Macros</title>
       <link>http://evantravers.com/articles/2018/10/30/git-gud-at-vim-3-registers-and-macros/</link>
       <pubDate>Tue, 30 Oct 2018 15:08:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/10/30/git-gud-at-vim-3-registers-and-macros/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>Macros let you record complex edits into a register to make tedious editing tasks easier.</p>
</div>
<p>The last two weeks we've talked through the basics of how Vim thinks and talks
about the files and buffers, and how you can describe an edit to Vim. This week
we are going to pull all that together with macros.</p>
<pre>
<strong>macro</strong> <em>_| ˈmakrō |_</em>
noun (plural macros)

1 (also macro instruction) _Computing_ a single instruction that expands
automatically into a set of instructions to perform a particular task.
</pre>
<p>As the dictionary describes, a macro essentially lets you group multiple
changes and motions together into a single instruction. You can write macros
that strip M$soft Word HTML tags out of documents, save backup copies of files,
fix line endings, or even <a href="https://github.com/isaacs/.vim/tree/master/macros/maze">solve
mazes</a>.</p>
<p>I used to use macros as a last-ditch effort for solving a complex problem that
crops up over and over, but over the years I've realized that it is so quick to
make them... I make little temporary ones all the time.</p>
<p>In order to be an effective user of macros, it helps to have an understanding
of registers and marks. We will also discuss some other neat Vim features that
play into macros.</p>
<h2><a href="#registers" aria-hidden="true" class="anchor" id="registers"></a>Registers</h2>
<p>In computing theory, a register is a small memory spot for storing things that
you are using currently. That's exactly how Vim treats its registers. There are
a number of named registers, and some special registers. You can see the states
of all currently set registers by running <code>:registers</code>.</p>
<p>Vim lists <em>ten</em> kinds of registers! (Don't worry, we'll only discuss a few in
detail.)</p>
<pre>
1. The unnamed register ""
2. 10 numbered registers "0 to "9
3. The small delete register "-
4. 26 named registers "a to "z or "A to "Z
5. three read-only registers ":, "., "%
6. alternate buffer register "#
7. the expression register "=
8. The selection and drop registers "&#42;, "+ and "~
9. The black hole register "&#95;
10. Last search pattern register "/
</pre>
<h3><a href="#0-10" aria-hidden="true" class="anchor" id="0-10"></a>&quot;[0-10]</h3>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/10/show_registers.svg"
       alt="showing the results of the `:registers`">
  <figcaption>
    In this mini-cast, I show how Vim remembers your deletions in the numbered
    registers, and has a separate register for your yank (copy). Notice how the
    delete includes the "^J" which signifies it copied the line-feed character
    as well.
  </figcaption>
</figure>
<p>Register 0 contains the text from the most recent yank (<code>y</code>) command, unless
the command specified another register.</p>
<p>The registers under the numbers 1-9 are automatically filled when you delete
(<code>d</code> or <code>x</code>) characters unless you specify a different register. As you might
guess, the first thing you delete goes under 1, then when you delete something
new it moves to 2 and the newest goes to 1, etc. There is some complexity to
this, but it's nice to know that the things you delete are &quot;saved&quot; somewhere,
if only temporarily.</p>
<h3><a href="#a-za-z" aria-hidden="true" class="anchor" id="a-za-z"></a>&quot;[a-zA-Z]</h3>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/10/show_append.svg" alt="">
  <figcaption>
    <p>I didn't do this very elegantly, but here are the basic steps:</p>
    <ol>
      <li>I moved the cursor to a <code>&lt;p&gt;</code> tag.</li>
      <li><code>"Myit</code> (appending to register m, yank inside tag)</li>
      <li>In insert mode, <code>&lt;c-r&gt;m</code> to insert the contents of m.</li>
      <li><code>:registers</code> to show you all the registers including m.</li>
    </ol>
  </figcaption>
</figure>
<p>The main registers you'll use for macros are under the letters [a-z]. If you
put something in a register under its lowercase character, it'll replace that
register's contents. If you use its uppercase character, it'll append to the
register's current contents, very handy for grabbing content out of multiple
locations (like &lt;p&gt; tags on a page!)</p>
<p>To specify a register for a yank or delete, start with <code>&quot;&lt;registername&gt;</code>
followed by the rest of the command. (For example: <code>&quot;ax</code> will delete the
current character and put it in register <code>a</code>, and <code>&quot;Ax</code> will delete the current
character and append it to register <code>a</code>)</p>
<h3><a href="#the-expression-register-" aria-hidden="true" class="anchor" id="the-expression-register-"></a>The Expression Register &quot;=</h3>
<p>This is an odd one, and I tend to leave it alone. When you access it, it
prompts for an expression to put in... you can put in some simple math, a
function, really anything you can run in vimscript. I have mostly used this one
a simple calculator. There are more ideas on this <a href="https://stackoverflow.com/questions/7027741/what-is-the-purpose-of-the-expression-register">stack overflow
question</a>.</p>
<h3><a href="#last-search-pattern-register-" aria-hidden="true" class="anchor" id="last-search-pattern-register-"></a>Last Search Pattern Register &quot;/</h3>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/10/search_register.svg">
  <figcaption>
    <ol>
      <li><code>5j</code> to move to the line with the horrid variable</li>
      <li><code>fG</code> to move to that word</li>
      <li><code>gd</code> to put that word in the search register</li>
      <li>Start a global search/replace <code>%s</code></li>
      <li>
        Use <code>&lt;c-r&gt;/</code> to insert the results of the search register
        <strong>into</strong> a command, complete with word barriers to replace
        with "SHORTCUTS".
      </li>
      <li>
        Repeat the first 3 steps to show how SHORTCUTS has now replaced all
        over the file.
      </li>
    </ol>
  </figcaption>
</figure>
<p>This is one of my favorite weird vim tips. There are a couple ways to &quot;search&quot;
for something... you can search using <code>/</code> in normal mode, or you can hit <code>gd</code>
on a word and it'll put the current word in the search register as it attempts
to find a local declaration. I'll often do this intentionally to dump the
current word into the search register, to then use it in a <code>%s/&lt;from&gt;/&lt;to&gt;/g</code>
find and replace.</p>
<blockquote>
<p>Protip: You can use registers in commands, in buffers... even in other
registers.</p>
</blockquote>
<h2><a href="#macros" aria-hidden="true" class="anchor" id="macros"></a>Macros</h2>
<p>Now that we have learned a little bit about Vim's registers, we are ready to
discuss Vim's macros. We learned in week 2 that we control vim through a series
of combined Operators and Motions, and all through that article we showed how
you can write out those changes as strings. Well, that's all a macro is: A
string of text stored in a register representing a series of recorded actions
to be replayed.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/refactor.svg">
  <figcaption>
    <p>Once again, not my smoothest work, but it's real life so here it is.</p>
    <ol>
      <li>
        Move the cursor to the beginning and use <code>qq</code> to start
        recording a macro to register "q".
      </li>
      <li>
        Use <code>^</code> movement to start the macro, making sure I'm at the
        beginning of the line.
      </li>
      <li>
        <code>/href</code> to search for the line with the &lt;a&gt; tag.
      </li>
      <li>
        <code>"byit</code> to yank inside tag into register b (for "body!")
      </li>
      <li>
        <code>?href</code> search backwards for that href again.
      </li>
      <li>
        <code>f"</code> to move forward to the quotes. I'm headed to grab the
        URL.
      </li>
      <li>
        <code>"ui"</code> to yank inside quotes into register u (for you
        guessed it, URL.)
      </li>
      <li>
        <code>?&lt;li&gt;</code> to find the opening &lt;li&gt; element
      </li>
      <li>
        <code>&lt;shift-v&gt;</code> to start a visual selection
      </li>
      <li>
        <code>/&lt;\/li&gt;</code> to search forward for the closing &lt;li&gt;
        tag.
      </li>
      <li><code>d</code> to delete selection.</li>
      <li>
        Type in the new template, using <code>&lt;c-r&gt;b</code> and
        <code>&lt;c-r&gt;u</code> paste in the body and the URL.
      </li>
      <li>
        <code>v</code> to start selection, <code>%</code> to jump to the
        matching "&lt;" character, and <code>&lt;shift-j&gt;</code> to join the
        lines to remove most of the troubling whitespace.
      </li>
      <li><code>j</code> to move down a line</li>
      <li>repeat by running the macro with <code>@q</code></li>
    </ol>
  </figcaption>
</figure>
<p>I use macros especially for small, tedious refactor tasks. I've spent a lot of
time working with HTML and CSS as a front-end developer. I often will come
across a bug in my front-end where I can't solve it just in CSS, I need to
refactor some crufty old HTML that has been copy-pasted in this file for years.
This is where macros <em>shine</em>. I need to preserve content, reorganize and use
some new CSS classes... Vim makes me faster at doing these small changes, but
why should I do them more than once? If I can use Vim to fix one of the broken
<code>&lt;div&gt;</code> tags, I can record those changes and replay them on every example
in the file, or in the project.</p>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/10/macro_as_register.svg">
  <figcaption>
    Here, I use the macro from the previous example and show you some neat
    things with it.
  </figcaption>
</figure>
<p>To record a macro, starting in Normal mode, you press <code>q&lt;register&gt;</code>, where
<code>&lt;register&gt;</code> is the name of the register you wish to store this sequence in.
You then will see a message in the statusline letting you know you are
recording to that register, and then as you move and type your actions are
recorded as a string to that register. You can see that string by typing
<code>:registers</code>.</p>
<p>To run the contents of a register as a macro, in Normal mode you use
<code>@&lt;0-9a-zA-Z&gt;</code>, you can think of this as &quot;run the macro <em>at</em> (name of
register)&quot;.</p>
<blockquote>
<p>Pro Tip: If you are working on a macro and you do something you don't like...
you can even paste out that register to a buffer (make sure to hit
<code>&lt;c-r&gt;&lt;c-r&gt;</code> to paste the register <em>exactly</em>, a single <code>&lt;c-r&gt;</code> will evaluate
the content of the registers referenced in the macro), edit it in Vim, and
yank it back into that register to replay later as a macro.  Because macros
are just text, you can share, modify, even have one macro change the text of
another register in order to modify the next macro. Meta!</p>
</blockquote>
<h2><a href="#marks" aria-hidden="true" class="anchor" id="marks"></a>Marks</h2>
<p>Marks are a way of saving a location in a file. You can set a mark in Normal
mode by pressing <code>m&lt;0-9a-zA-Z&gt;</code>. You recall a mark's line with <code>'&lt;0-9a-zA-Z&gt;</code>
and a mark's full location with <code> `&lt;0-9a-zA-Z&gt;</code> Lowercase marks are
local to a file, but uppercase marks work between files. Before I learned about
Vim's jumps I'd use marks to jump between files that I'm looking at, like an
HTML and CSS file.</p>
<p>Marks are used for several things in Vim internally. We haven't discussed the
visual modes except in passing at the moment, but if you set the marks for &quot;&lt;&quot;
and &quot;&gt;&quot; you'll actually be doing the same thing as making a visual selection.
You can try this out by setting those marks and then pressing <code>gv</code> for &quot;go
visual&quot; in Normal mode.</p>
<p>Now, I use marks inside macros as a way to set locations for the cursor while
working on a fragment of code. I'll yank to registers and mark locations as I
go, so that it makes it easier to work my way back through them on a second
pass.</p>
<h2><a href="#jump-lists" aria-hidden="true" class="anchor" id="jump-lists"></a>Jump Lists</h2>
<p>Jump lists are like marks that are set automatically as you move through the
buffers in Vim. You can see them at any time using <code>:jumps</code>. You can move back
to the previous location using <code>&lt;c-o&gt;</code> (out) and move back using <code>&lt;c-i&gt;</code>(in).
I use this <em>constantly</em>. If I use go to tag (<code>&lt;c-]&gt;</code>), and I want to go back to
the file I was just editing, I just hit <code>&lt;c-o&gt;</code> to move back out to the
previous file. Once it gets under your fingers it is wonderful.</p>
<h2><a href="#moar-macros" aria-hidden="true" class="anchor" id="moar-macros"></a>MOAR MACROS</h2>
<h3><a href="#hooks" aria-hidden="true" class="anchor" id="hooks"></a>Hooks</h3>
<p>Now that we have a lot of cool tools to choose from, let's talk about the
strategy of using a macro to refactor. (There are many other uses for a
macro... pretty much anything that you find yourself doing over and over in
Vim is a good candidate for a macro.)</p>
<p>When facing some code that would benefit from a macro (3+ code structures with
deep similarities in structure or content that all have to be changed the same
way,) the first thing I do is to take a quick scan down the structures I need
to change looking for <em>unique</em> markers that I can use <code>f</code> or <code>t</code> to jump to. I
call this &quot;looking for hooks.&quot; I'm looking for the commonalities that will make
this change repeatable.</p>
<p>More often than not, those unique markers are delimiters like quotes or
brackets, but you have to look for &quot;gotchas&quot;.</p>
<p><code class="block">&lt;li&gt;
&lt;a class=&quot;link&quot; href=&quot;/help&quot;&gt;
Get Help
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a class=&quot;link&quot; href=&quot;/about-us&quot;&gt;
About &lt;em&gt;Our&lt;/em&gt; Team
&lt;/a&gt;
&lt;/li&gt;
</code></p>
<blockquote>
<p>One common mistake with macros is to not &quot;reset&quot; the state at the beginning
and end of a macro. I will often use a <code>0</code> (placing the cursor at the first
column in a file) or <code>^</code> (placing the cursor at the beginning of a line)
before I start working commands.</p>
</blockquote>
<p>In this example, if I'm trying to robustly copy the content of the <code>&lt;a&gt;</code> tag, I
would have problems if I searched for the <code>&lt;</code> character to find the next HTML
tag. It would work for the first <code>&lt;li&gt;</code>, but the second has an HTML tag in its
content. Searching for <code>&lt;/</code> won't work either... I'd probably wind up using
<code>yit</code> (yank inside tag) to trust Vim's built in parser to pull the whole
content inside the tag and sidestep this problem entirely... and then probably
have to deal with the extra whitespace I just yanked.</p>
<h3><a href="#nested-macros" aria-hidden="true" class="anchor" id="nested-macros"></a>Nested Macros</h3>
<p>One strategy I've employed is to break up a large macro into smaller macros.
This is a good strategy when you are writing a macro that transforms a whole
file in multiple passes, or a macro that needs to work on multiple files.
Because macros are just Vim commands, there's nothing that you couldn't do in
a macro.</p>
<blockquote>
<p>Protip: If you find yourself using a macro like a command that you use often,
it's usually better to put it into your Vim config file as an actual command.
One macro that migrated from my registers into my config is one that strips
trailing spaces out of a file.</p>
</blockquote>
<h2><a href="#modal-editing--macros--awesome" aria-hidden="true" class="anchor" id="modal-editing--macros--awesome"></a>Modal Editing + Macros = Awesome</h2>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/fun_with_registers.svg">
  <figcaption>
    More magic with registers... using them as a simple templating system.
    Registers can refer to other registers, so why do what I did before and
    type out the whole thing when you can a template that references other
    registers and swap the registers out using macros?
  </figcaption>
</figure>
<p>When I first stated using macros, they were a very specialized tool for when I
was most frustrated. After nearly a decade of using Vim, I use them nearly any
time I have a repetitive editing activity that's more demanding than the repeat
operator and less intense than a script in some programming language that I
should check into source control. They are a central part of why I can't seem
to quit vim, and not for the <a href="https://stackoverflow.com/questions/11828270/how-to-exit-the-vim-editor">main
reason</a>
that others make that claim.</p>
<p>If you enjoyed what you've learned so far, <a href="/contact">shoot me a line</a> or check
out some of the great links below.</p>
<h2><a href="#more-reading" aria-hidden="true" class="anchor" id="more-reading"></a>More Reading:</h2>
<ul>
<li><a href="https://thoughtbot.com/upcase/vim">thoughtbot's new vim course</a></li>
<li><a href="https://sanctum.geek.nz/arabesque/advanced-vim-macros/">advanced vim macros</a></li>
<li><a href="https://www.hillelwayne.com/post/vim-macro-trickz/">vim macro trickz</a></li>
<li><a href="https://robots.thoughtbot.com/recursive-macros-in-vim">recursive macros in vim</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Git Gud at Vim 2: Movement and Editing</title>
       <link>http://evantravers.com/articles/2018/10/23/git-gud-at-vim-movement-and-editing/</link>
       <pubDate>Tue, 23 Oct 2018 18:41:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/10/23/git-gud-at-vim-movement-and-editing/</guid>
       <description><![CDATA[ <div class="admonition tldr">
<p>Vim is controlled by expressions that take the form of operator + motion. Learning operators and motions gives flexible power to concisely edit text in a repeatable fashion.</p>
</div>
<p><a href="/articles/2018/10/16/get-gud-at-vim-buffers/">Last week</a> we touched on the
idea of buffers, and some basic commands like <code>:e</code>, <code>:ls</code>, and <code>:b</code> that let us
open and manipulate buffers. This week, we are going to talk a little bit about
the heart of vim... editing.</p>
<p>Vim is designed for efficient and repeatable editing. It understands that as
you work with a document, much of your time is spent finding just the right
place to make a change, making that change, then repeating that same sort of
change in a few more places.</p>
<p>Vim is unusual because its commands for a sort of language. Nearly every change
you make is a repeatable algorithm that can be re-used! This &quot;language&quot; usually
takes the form of an
<a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#operator">Operator</a> followed
by a <a href="http://vimdoc.sourceforge.net/htmldoc/motion.html">Motion</a>.</p>
<p>Operators and Motions are orthogonal... if you learn a new motion, it will work
with all the operators you know, and vice versa. Listing all the operators and
motions is the job of the <code>:help</code> system. Instead, I'm going to list some of my
favorite combinations so that you can maybe see the power that Vim has. There
is often more than one way to do the same task, you can use the tools within
Vim that you know.</p>
<p>There are man pages for listing all the operators and motions available in vim,
and more operators and motions available in plugins. Rather than try to list
all of them I will group a sampling of them by the steps in a typical editing
cycle: First scanning for the right place to change, then placing the cursor in
the correct spot, finally changing or adjusting the text.</p>
<h2><a href="#scanning" aria-hidden="true" class="anchor" id="scanning"></a>Scanning</h2>
<p>Before you can fix the problem, you have to see it. Usually this will mean
scrolling the current window up and down the buffer as you read, or by
searching for a pattern that you know is close to the problem.</p>
<h3><a href="#scrolling" aria-hidden="true" class="anchor" id="scrolling"></a>Scrolling</h3>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/10/scanning.svg" alt=""> <figcaption>
  Scanning using <code>&lt;c-d&gt;</code> and <code>&lt;c-u&gt;</code>.
  </figcaption>
</figure>
<p>There are a number of ways to move up and down the buffer. You can use
<code>:&lt;line-number&gt;</code> to jump to a specific line (if you know where you are
going!). <code>G</code> jumps to the bottom of the file (good for appending when you know
you will be adding to the bottom,) and <code>gg</code> jumps to the top. There are a
number of other jump style motions under the prefix of <code>g</code>, so it's good to
remember that <code>g</code> = &quot;go.&quot;</p>
<p>If I know where I'm going (I have a backtrace with a line number) I'll use
<code>:&lt;number&gt;</code>, otherwise I typically end up using <code>&lt;c-d&gt;</code> for &quot;down&quot; and <code>&lt;c-u&gt;</code>
for &quot;up&quot;.</p>
<h3><a href="#searching" aria-hidden="true" class="anchor" id="searching"></a>Searching</h3>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/10/search.svg" alt=""> <figcaption>
  <ol>
    <li><code>/Layer</code> (no matches)</li>
    <li><code>/layer</code> (some matches)</li>
    <li><code>n</code> and <code>N</code> to move back and forth</li>
  </ol>
  </figcaption>
</figure>
<p>You can search at any time in normal mode by typing <code>/</code> followed by a pattern
you are searching for. There are of course regexes and wildcards available to
you. Once you are searching, you can press <code>n</code> for next to cycle through the
matches, and <code>N</code> will cycle you in the reverse direction.</p>
<p>Searching has the added benefit of placing the cursor on the match, which makes
also an excellent tool for the next phase.</p>
<h3><a href="#placing-the-cursor" aria-hidden="true" class="anchor" id="placing-the-cursor"></a>Placing the cursor</h3>
<p>The next step after scanning is to place your cursor where you want to make
your changes. This step and the actual editing itself are probably the hardest
things for people new to vim, so stay with it! Eventually it will feel natural.</p>
<figure class="left">
  <img src="https://images.evantravers.com/articles/2018/10/row.svg" alt="">
  <figcaption>
    <ol>
      <li><code>2j</code> to move down two rows</li>
      <li><code>fI</code> to move to the "I"</li>
      <li><code>cw</code> to "change word"... more on that later!</li>
    </ol>
  </figcaption>
</figure>
<p>I will often just use a <code>/</code> search to place the cursor. This works well if
there's a relatively unique string that you can match against, especially if I
can accomplish this in two characters or less.</p>
<p>If there isn't an apparent or easy search pattern, I will use a combination of
row-wise and column-wise motions to get the same effect. For vertical
(row-wise) motion, I will either jump to a line or I'll use the default motion
keys <code>hjkl</code> with a count, something like <code>11j</code> or <code>7k</code>.</p>
<p>For column-wise motion, we have many many options at our disposal, but there
are two that I end up using daily: <code>f</code> and <code>t</code>.</p>
<p><code>f</code> is for &quot;forward&quot;, and both it and it's corresponding reverse motion <code>F</code>
move the cursor directly on top of the next character pressed (called the
target)</p>
<p><code>t</code> is for &quot;till&quot;, and it does the same thing as <code>f</code>, execept it stops just
short of the target. It <em>also</em> has a corresponding reverse motion, <code>T</code>.</p>
<p>With some practice, we should be right on our target and ready to edit!</p>
<h3><a href="#a-note-about-modal-editing" aria-hidden="true" class="anchor" id="a-note-about-modal-editing"></a>A Note About Modal Editing</h3>
<p>Vim gives us commands all across the keyboard to communicate commands to it.
However, we still have to type sometimes... so it gives us a toggle between two
modes: Normal (command) mode, and Insert mode. We'll talk about a few ways to
enter Insert mode in a minute, but for now, just know that once in Insert
mode, you have to hit <code>ESC</code> or <code>&lt;c-c&gt;</code> return to Normal mode.</p>
<p>This is very confusing to some people but it's worth getting used to. We have
been talking about the process of editing: scanning the text, placing the
cursor, making a change. Of those three steps, only <em>one</em> of them requires
inserting text, and then it doesn't always. More often than not you are just
removing text, adjusting indentation, changing a delimiter... all tasks that in
Vim don't require leaving Normal mode. Therefore, Vim takes the step of making
the mode in which we are instructing the editor what to do the default Normal
mode, and gives us an Insert mode to enter and leave when required.</p>
<h3><a href="#changing-adjusting-and-adding" aria-hidden="true" class="anchor" id="changing-adjusting-and-adding"></a>Changing, Adjusting, and Adding</h3>
<p><code>d</code> stands for delete. It deletes in the motion you give it, if you just hit
<code>dd</code> it'll delete the current line, and <code>D</code> will delete from the cursor to the
end of the line (roughly equivalent to <code>d$</code>, where <code>$</code> is the movement to the
end of a line. Regex fans will notice that that's the part of regex that
matches an end of line, and there's more where that came from.)</p>
<p>There are a number of operators that will enter insert mode.</p>
<pre>
    O
    |
I--i_a--A
    |
    o
</pre>
<p>Here are the main ones I end up using. If the cursor is on the underscore, each
operator listed will move the cursor to the spot listed. <code>o</code> and <code>O</code> are
particularly notable, because they start new lines and place the cursor there.</p>
<figure class="right">
  <img src="https://images.evantravers.com/articles/2018/10/change.svg" alt="">
  <figcaption>
    <ol>
      <li><code>f(</code> to move to the parens</li>
      <li><code>ci(</code> to change inside parens</li>
      <li>Type in correct "bar" argument</li>
      <li><code>ESC</code> to re-enter normal mode</li>
      <li><code>A</code> to put the cursor at the end of the line</li>
      <li>Add ":"</li>
    </ol>
  </figcaption>
</figure>
<p>The operator I find myself using the most frequently when refactoring or
editing is the <code>c</code> or change operator. This operator deletes according to your
motion, and places the cursor in the place of the removed text. <code>C</code> behaves
much the same as <code>D</code>, except leaving you in insert mode. I have found that
together with a solid use of text-objects, <code>c</code> probably my most-used operator.</p>
<h3><a href="#tweaking" aria-hidden="true" class="anchor" id="tweaking"></a>Tweaking</h3>
<p>Staying in normal mode is good, it means you have the freedom to keep moving
and you are constantly teaching yourself and your editor more things about the
text you are editing. There are a bunch of commands that I call &quot;tweaking&quot;
commands... they are little actions just to make simple tasks easier.</p>
<p><code>&gt;</code> and <code>&lt;</code> are operators that indent and unindent code. <code>=</code> will auto-indent
based on your syntax file.</p>
<p><code>&lt;c-a&gt;</code> and <code>&lt;c-x&gt;</code> increment and decrement the character under the cursor...
handy for budging a number or a range of numbers.</p>
<p>There are a bunch of neat extended commands available in plugins and scripts,
I'm fond of one that handles encoding and decoding strings, or escaping
characters. Combined with the text-object for quotes and single quotes, very
powerful!</p>
<h3><a href="#text-objects" aria-hidden="true" class="anchor" id="text-objects"></a>Text Objects</h3>
<p>This family of motions are motions, but they tend to make more sense in the
context of an operator. Vim is aware of ranges or blocks in your text... things
like parentheses, brackets, braces, quotes, double quotes, paragraphs,
sentences, even XML tags. I use these constantly!</p>
<p>They are pretty easy to use too... most text objects can be accessed by using
<code>i&lt;delimiter&gt;</code> or <code>a&lt;delimiter&gt;</code> where <code>&lt;delimiter&gt;</code> is something like <code>(&lbrace;['&quot;</code>.
It is one of the easiest to read &quot;sentence&quot; commands... change inside
parentheses becomes <code>ci(</code>.</p>
<p>There are also motions to move the cursor along text-objects, which can be
handy for reading or working with prose.</p>
<h2><a href="#step-4-profit-with-the-power-of-repeat" aria-hidden="true" class="anchor" id="step-4-profit-with-the-power-of-repeat"></a>Step 4. Profit! (with the power of repeat)</h2>
<p>The amazing thing about the expressions we've been learning, the orthogonal
combinations of operators and motions is that they are scriptable and
repeatable. The way we interact with the editor is also the way we can
&quot;program&quot; Vim to do a task more than once!</p>
<p>I experienced this power in the course of writing this very blog post. I was
refactoring the examples and putting them inside the <code>&lt;figure&gt;</code> tags you see
here, and the <code>&lt;modifier-key&gt;</code> form was being interpreted as an XML tag and
breaking the blog post. Trouble is, I had written dozens of them across the
page.</p>
<p>I remembered seeing an operator that would HTML encode a string, found it in
<code>:help</code>, (the operator is <code>[x</code> from vim-unimpaired) and was able to use <code>[xit</code>
to HTML encode the string inside the tag.</p>
<p>Armed with this expression, I searched for &quot;&lt;c-&quot; in the file, hit <code>n</code> to
move to it, and hit the repeat operator (<code>.</code>) to fix each occurence in the blog
post. It took mere seconds to do a refactoring activity that would have taken
me probably a half an hour a few years ago when I didn't use vim.</p>
<h2><a href="#example-numbering-a-list" aria-hidden="true" class="anchor" id="example-numbering-a-list"></a>Example: Numbering a list</h2>
<p>There's always more than one way to do a task in vim... people who have been
using vim for a while will engage in <a href="https://www.vimgolf.com/">vim golf</a>, a
contest to find the fewest keystrokes to accomplish a task. It's partly a
competition, partly a way to absorb and learn new operators and motions.</p>
<h3><a href="#manually-typing" aria-hidden="true" class="anchor" id="manually-typing"></a>Manually typing</h3>
<p>Here I'm just typing in the list like I would when I first starting vim. I use
<code>I</code> to jump to the beginning of the line and typing in a number.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/manually.svg" alt="">
  <figcaption>
    <ol>
      <li>use <code>hjkl</code> to move the cursor</li>
      <li><code>I</code> to jump to the beginning of the line</li>
      <li>type in the new number</li>
      <li>repeat</li>
    </ol>
  </figcaption>
</figure>
<h3><a href="#using-an-external-command" aria-hidden="true" class="anchor" id="using-an-external-command"></a>Using an external command</h3>
<p>Here I'm using a trick I learned from Steve Spicer... <code>cat -n</code>
prints out a file with line numbers. This trick is really cool because it works
on any length file with just one line!</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/using_cat.svg" alt="">
  <figcaption>
    <ol>
      <li>
        <code>%!</code> passes the buffer to an external command and reads from
        stdout
      </li>
      <li><code>cat -n</code> takes from stdin and numbers the lines</li>
      <li>
        <code>&lt;c-v&gt;</code>starts a visual block so I can select the empty
        space.
      </li>
      <li><code>d</code> to delete the selected block.</li>
    </ol>
  </figcaption>
</figure>
<h3><a href="#using-some-new-vim-magic" aria-hidden="true" class="anchor" id="using-some-new-vim-magic"></a>Using some new vim magic</h3>
<p>While researching this talk, I learned that a familiar command extra
features. I knew that <code>&lt;c-a&gt;</code>learned that a familiar
command extra features. I knew that <code>&lt;c-a&gt;</code> will increment
the integer under the cursor, but I didn't know that
<code>g&lt;c-a&gt;</code> would incremement a block of integers and
increment each one by one more.</p>
<p>Therefore I used a search and replace to put a &quot;1.&quot; at the beginning of
every line, and used <code>g&lt;c-a&gt;</code> to increment the line
numbers.</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/magic.svg" alt="">
  <figcaption>
    <ol>
      <li>
        <code>%s/^/1. /g</code> replaces the beginning of every line in the
        buffer with the string "1."
      </li>
      <li>
        <code>&lt;c-v&gt;</code> allows me to select a visual block from :2 on
        to <code>G</code>
      </li>
      <li>
        <code>g&lt;c-a&gt;</code> increments all the integers in the selection
        by one + each additional line ending.
      </li>
    </ol>
  </figcaption>
</figure>
<h2><a href="#more-resources" aria-hidden="true" class="anchor" id="more-resources"></a>More Resources</h2>
<ul>
<li><a href="https://vim-adventures.com/">an interactive vim game</a></li>
<li><a href="https://whileimautomaton.net/2008/11/vimm3/operator">operator, the true power of vim</a></li>
<li><a href="https://blog.carbonfive.com/2011/10/17/vim-text-objects-the-definitive-guide/">vim text-objects guide</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>Git Gud at Vim 1: Buffers</title>
       <link>http://evantravers.com/articles/2018/10/16/get-gud-at-vim-buffers/</link>
       <pubDate>Tue, 16 Oct 2018 15:42:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/10/16/get-gud-at-vim-buffers/</guid>
       <description><![CDATA[ <p>I'm doing a four part little workshop in Birmingham over lunch for some vim
enthusiasts, and I thought I'd record my rough outline as a blog post for the
rest of the internet.</p>
<p>I've been a user of vim for about ten years, and I'm still constantly learning
new things that I didn't know before... it's a super fun tool. I got into it
originally as a step in reducing the number of tools I used as part of
work/school. I had eclipse for java homework, homesite+ for web development
work, textmate for c homework... and my friend Tom had challenged me to learn
one editor <em>well</em>. I chose vim, and I haven't regretted it one bit. I can't
stop using it... it's too powerful. It would be like giving up superpowers.</p>
<p>Vim was designed to edit text, which is what most of us spend a lot of our
time doing. It is also installed on pretty much <em>every</em> *nix system out there,
so if your job ever involves ssh'ing into a server (and it will!) vi will be
there, so I think everyone should have at least a rudimentary knowledge.</p>
<h2><a href="#concepts" aria-hidden="true" class="anchor" id="concepts"></a>Concepts</h2>
<p>How vim thinks about files and buffers (from <code>:help buffers</code>):</p>
<figure>
  <img alt="buffers and windows" src="https://images.evantravers.com/articles/2018/10/buffersandwindows.png">
  <figcaption>
    <pre>
    Summary:
       A buffer is the in-memory text of a file.
       A window is a viewport on a buffer.
       A tab page is a collection of windows.
    </pre>
  </figcaption>
</figure>
<p>It's worth briefly thinking about how <em>totally</em> different this is from most
other text editors we use! Most of the time, we open files into tabs... and
when we close that tab, the file is closed and we lose all the undo history,
state... even unsaved changes. If we try to open the same text file twice, the
application will usually present you with the same window on the file. <em>A file
in most editors is exactly the same as the view on the file.</em></p>
<p>Vim doesn't think this way exactly. As you open files in vim
using <code>:e</code> or by passing the filename as an argument when you start vim
(<code>vim foo.txt</code>), those files are loaded in memory as Buffers. Usually, that
file will <em>also</em> be presented to you in a single Window, which is where we
work. We can split the current Window (using <code>:vs</code> or <code>:sp</code>) which without an
argument will open a Window on the current Buffer... two views on the <em>same</em>
file. You can of course look at multiple files in splits, but this is
important: Multiple Windows, open on the same buffer. It's a viewport, a
literal Window on the Buffer, not the file itself like it is in Textmate. I can
have one Window open on the top of a long .c file to look at the includes, and
one Window 300 lines down the file looking at a particular function, both
editing the same buffer.</p>
<p>Very powerful. But you may not realize it yet... Just hold those definitions in
your mind as we go forward.</p>
<h2><a href="#commands" aria-hidden="true" class="anchor" id="commands"></a>Commands</h2>
<p>We are going to talk more about Command mode later, but for now, to enter a
command you just type <code>:</code> while in Normal mode and start typing the command...
tab completion works and all that just like your terminal.</p>
<h3><a href="#e" aria-hidden="true" class="anchor" id="e"></a><code>:e</code></h3>
<p>This lets you <code>:e[dit]</code> files... but it has a few tricks up it's sleeve:</p>
<p>For instance, you can open .zip and other archive files, and see what's inside!</p>
<p>Network capabilities... you can even edit over ftp and ssh using <code>:e ftp://</code>
and <code>:e ssh://</code>. (Vim has a powerful tool called <code>netrw</code> that powers all the
reading, writing, browsing of files over network or locally.)Try <code>:e http://tired.com/</code> to see the source code of a website. If you wonder if vim
can open it or work over some connection... the answer is probably yes. :P</p>
<figure>
  <img src="https://images.evantravers.com/articles/2018/10/ewithglobbing.svg" alt="example of using vim :e with globbing">
  <figcaption>Here I'm using globbing to fuzzy find a path I never can remember...</figcaption>
</figure>
<p>One of the powerful things you can do with <code>:e</code> is you can use globbing to edit
a file deep in a file structure.  For instance, the last time I opened the
firmware keymap for my keyboard, I used <code>:e **/*fullmods/keymap*</code> to open
<code>layouts/community/ortho_4x12/fullmods/keymap.c</code>. Very powerful... and yes, it
even works over <code>:netrw</code>, so you can use it over ftp!</p>
<p><code>:e</code> has a lot hidden inside it thanks to vim's handling of files and <code>netrw</code>,
so if you are having difficulty moving through your project, do some reading.
There's probably a better way.</p>
<h3><a href="#ls" aria-hidden="true" class="anchor" id="ls"></a><code>:ls</code></h3>
<p>This lists your currently open buffers, along with some useful flags to let you
know their current state (current buffer, modified, unmodified, read-only,
etc.)</p>
<h3><a href="#buffer" aria-hidden="true" class="anchor" id="buffer"></a><code>:b[uffer]</code></h3>
<p>This lets you switch the window between open buffers... either by the number
coming from <code>:ls</code>... or by a loose fuzzyfind string. <code>:b css</code> -&gt; &quot;style.css&quot; if
that's a buffer you have open.</p>
<h3><a href="#bnext-and-bprevious" aria-hidden="true" class="anchor" id="bnext-and-bprevious"></a><code>:bn[ext]</code> and <code>bp[revious]</code></h3>
<p>If you want you can go back and forth between two files. I used to use these a
lot to move between my open buffers, until I learned I can jump right to the
buffer I want using <code>:b</code>, I use it still less since I use the <code>jumplist</code>
which we'll talk about in a later post.</p>
<h3><a href="#bdelete" aria-hidden="true" class="anchor" id="bdelete"></a><code>:bd[elete]</code></h3>
<p>This will unload a buffer and remove it from the buffer list. I mostly use this
if I accidentally opened a lot of files trying to find the file I <em>actually</em>
need to edit, and I want to avoid collisions when switching buffers using
<code>:b &lt;pattern&gt;</code>. I'll pass some patterns or buffer indexes to it to close the
buffers I don't want.</p>
<h2><a href="#nearly-everything-is-secretly-a-buffer" aria-hidden="true" class="anchor" id="nearly-everything-is-secretly-a-buffer"></a>(Nearly) Everything is secretly a buffer...</h2>
<figure>
  <img alt="using `q:` to access the command history buffer" src="https://images.evantravers.com/articles/2018/10/historybuffer.svg">
  <figcaption>Here, I'm using <code>q:</code> to access the command history buffer, then
  using reverse search (<code>?</code>) to find a previously run command and repeat
  it!</figcaption>
</figure>
<p>Why is it soooo important to understand the idea of Buffers vs. Windows vs.
Tabs?  Because so much of vim is actually a buffer in disguise. Your search
history?  Actually a buffer (you can see it using <code>q/</code>). Help system? It's a
buffer.  The quickfix list that's returned from a plugin? It's a special
buffer.  Understanding what a buffer <em>is</em> and how to move and interact with it
will help you interact with nearly every other part of vim.</p>
<h2><a href="#further-reading" aria-hidden="true" class="anchor" id="further-reading"></a>Further Reading:</h2>
<ul>
<li><a href="https://twobithistory.org/2018/08/05/where-vim-came-from">Where vim came from</a></li>
<li><a href="https://dockyard.com/blog/2013/10/22/vim-buffers">Buffers, Windows, Tabs... Oh My! Part 1: Vim Buffers</a></li>
<li>(I'm using <a href="https://asciinema.org/">asciicast</a> to record terminals, and
<a href="https://github.com/marionebl/svg-term-cli">svg-term-cli</a> to make the
animated svg)</li>
</ul> ]]></description>
    </item>
    <item>
       <title>Pomodoro in Hammerspoon</title>
       <link>http://evantravers.com/articles/2018/10/02/pomodoro-in-hammerspoon/</link>
       <pubDate>Tue, 02 Oct 2018 13:52:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/10/02/pomodoro-in-hammerspoon/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2018/10/pomodoro.gif" alt="pomodoro example" /></p>
<p>Thanks to the encouragement I got from <a href="https://www.youtube.com/watch?v=FS1mnISoG7U">this
video</a> I have been trying to use
the <a href="https://en.wikipedia.org/wiki/Pomodoro_Technique">pomodoro method</a>. I am
afraid I'm a bit of an information addict, so unplugging from my feeds and
dedicating time to focus is becoming more and more important.</p>
<p>I haven't been able to find a simple pomodoro timer that did exactly what I
wanted, so I wrote one. <a href="https://github.com/evantravers/hammerspoon-config/blob/b4bffc38c0f8e7717875c9ee78e4484d5e3594f1/pomodoro.lua">Here it
is.</a></p>
<p>Like a normal timer, you can start/stop it, and pause/resume a running timer.
Because I typically work in full screen without menubar and dock, invoking the
hotkey to show the timer gives you the current remaining time.</p>
<p>The feature I really wanted was to close apps that distract me. In my
<a href="https://github.com/evantravers/hammerspoon-config/tree/b4bffc38c0f8e7717875c9ee78e4484d5e3594f1">hammerspoon config</a> I can specify
applications that are distractions... the pomodoro script will close these
apps on timer start, and open any that were closed when the timer completes or
is stopped at any point.</p>
<p>I'd like to go further and change my slack status to away with some API calls,
or even block distracting websites via <code>/etc/hosts</code>, but I think I'll just use
this for a while and enjoy it.</p> ]]></description>
    </item>
    <item>
       <title>Catching Up to the Conversation: Code Spelunking in Git</title>
       <link>http://evantravers.com/articles/2018/09/28/code-spelunking/</link>
       <pubDate>Fri, 28 Sep 2018 18:15:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/09/28/code-spelunking/</guid>
       <description><![CDATA[ <h2><a href="#code-as-a-conversation" aria-hidden="true" class="anchor" id="code-as-a-conversation"></a>Code as a Conversation</h2>
<p>Have you ever joined a conversation a little too late... and made the
horrifying mistake of assuming you heard correctly what the conversation was
about? You bounce up to a group of your friends, with a hilarious quip based on
what you heard... then watch in horror as your joke bleeds on the floor.  They
weren't talking about that at all... nearly the opposite. There's almost no
recovery. You have no choice. You just have to change your identity and move to
a different state. Just me? Ok. Imagine my pain, and bear with me.</p>
<p>Code isn't static, it moves and breathes with product decisions, tech changes,
and language shifts. It is the result of a conversation of commits and
decisions that lead up to this point.</p>
<p>We can make almost the same mistake in code that we can talking with our
friends... we make assumptions about definitions and their meaning, and assume
that we fully understand the conversation. We often dive in without spending a
little time listening to the conversation in the code and git history before we
begin to speak.</p>
<p>I've spent most of my career staring at legacy code... and I was showing a
friend of mine some of the tricks I've picked up over the years to help me
deal with the complexities of joining the conversation in other people's code.
I figured it'd be helpful to post a list.</p>
<h2><a href="#git-pickaxe-git-log--s" aria-hidden="true" class="anchor" id="git-pickaxe-git-log--s"></a>git pickaxe (<code>git log -S</code>)</h2>
<p>The git pickaxe is a tool I always forget... but is incredibly useful. In
short, the pickaxe (so called because of the resemblance of a <code>-S</code> to a
pickaxe) will search through all the diffs in history for occurrences of a
string. This means you can read the cliff's notes (of all the commits) that
affected this string all the way to the Dawn of Git Init. This can be a great
way to learn who might be an expert, who has touched this last, what else it
touches and where... useful stuff. Also handy for finding renames, although
that requires a little more work.</p>
<h2><a href="#git-follow-git-log---follow" aria-hidden="true" class="anchor" id="git-follow-git-log---follow"></a>git follow (<code>git log --follow</code>)</h2>
<p>A feature I learned about recently is that git log has a <code>--follow</code> option
that will follow file renames and moves. I used to follow history back in time
until a commit that was clearly a rename/refactor, and then use
<code>git log -- &lt;filename&gt;</code> to chase the original filename further back in time...
now I can just use <code>git log --follow &lt;filename&gt;</code> it is a <em>lot</em> easier.</p>
<h2><a href="#git-blame" aria-hidden="true" class="anchor" id="git-blame"></a>git blame</h2>
<p><code>git blame</code> is my favorite tool for listening in to the conversation that
happened on this source code before you. You can use it to walk back and
forwards in time to understand a little more about what is going on. You may
not discover why the code you are looking at is broken, but you may learn how
it came to be in this state. <code>git blame</code> at its lowest level shows you each
line in the file and the commit sha1 and commit title for each one. At very
least, <code>git blame</code> allows you to recognize who is part of the conversation
most recently. It can be very helpful to know who touched this part of code
last, and how long ago that change occurred.</p>
<p>Where <code>git blame</code> really becomes useful for me is when it is given super powers
by some other tool for extra-magic code exploration.</p>
<p>You can do this in github's blame view as well...there's a little icon that
looks like layers that allows you to &quot;reblame&quot; the file at that point in
history. I use this to chase a piece of logic or definition back in time, to
the very first moment it appeared in the code base. This can be very handy to
watch the code evolve and change. Sometimes I validate hunches about the
validity of the code, sometimes I discover that someone already tried and
failed the approach I'm considering attempting. More often than not, as I
chase the logic back through time, I also find that it was named something
different at one point in the past, and I realized that this code was attached
to some other piece of business logic that I never realized. All this can
change and inform my approach, with just a little bit of scanning and
listening to the existing conversation.</p>
<p>Being a vim user, I use <a href="https://github.com/tpope/vim-fugitive/">vim-fugitive</a> by Tim Pope in
vim for exploring history... I can type <code>:Gblame</code> and not only see who last
touched my file, but I can even dig backwards through history, by pressing
<code>&lt;CR&gt;</code> on the SHA in the left split. It's very handy to be able to do this in my
editor right in my workspace. There are similar plugins for VSCode, Emacs, you
name it, it is worth the time to add that plugin and learn how your particular
tool works.</p>
<p>If you can't find a suitable one for your editor, a lot of graphical git
interfaces (including <a href="https://github.com/jonas/tig">tig</a>, a favorite of mine!)
have really cool interfaces for crawling backwards and forwards through
history. Just released, <a href="https://www.sublimemerge.com/">sublime merge</a> appears
to have such functionality in a very nice interface.</p>
<h2><a href="#go-to-definition" aria-hidden="true" class="anchor" id="go-to-definition"></a>Go To Definition</h2>
<p>This is kind of unrelated to the main thought of using <code>git</code> to explore the
code base, but I think it's still <em>very</em> helpful. A lot of editors have
functionality that lets you search for a keyword under the cursor, and call
that &quot;jump to definition.&quot; I'm not talking about that. I'm talking about a
true, context sensitive, jump to definition. I use <a href="https://github.com/universal-ctags/ctags">universal
ctags</a> in vim to accomplish this,
although if you are using a more IDE-esque editor you can do this in several
ways. The key thing I wanted to mention is the workflow of using the shortcut
to dive into a definition, read through, and back out. In vim, you can
accomplish this by going to tag (<code>&lt;C-]&gt;</code>), and then jumping out (<code>&lt;C-O&gt;</code>) to
the previous location in the jumplist. This lets you swim easily through the
whole logic of a function, regardless of where the flow takes you, kind of
like stepping through a debugger. I use it a lot when understanding the
context of a file in code review or just when I'm working through some code.</p>
<h2><a href="#joining-the-conversation" aria-hidden="true" class="anchor" id="joining-the-conversation"></a>Joining the Conversation</h2>
<p>You may have seen a pile of rocks like this during a walk in a woodsy park.
It has grown in popularity thanks to instagram and pinterest... but the
original concept is to raise a &quot;cairn&quot; as a trail marker. Its a message to
those who follow. If your cairn has a trail or rocks leading off a
direction... then you now know the direction the &quot;author&quot; has walked. Find
three piles nearby? Someone needs help, or wants you to beware.</p>
<p>Once you start traversing the trails and history in your codebase, you'll
learn to appreciate and read the more helpful markers that others have left...
and if you are like me you will be inspired to be more thoughtful about the
markers we leave behind in our code.</p>
<p>Although the author's personal behavior is in question at the moment, he has
left a <a href="https://github.com/git/git/commit/81b50f3ce40bfdd66e5d967bf82be001039a9a98">great example of a commit that explains not what the author did, but
why.</a></p>
<p>He wasn't content to just say what he did, he knows that's what the diff says.
He used the description to explain to anyone walking the same trail <em>why</em> he
made this choice, so that we have direction on our own paths. That's a helpful
commit. A good example for us as we contribute to history and add our voice to
the conversation, and make someone in the future's life a little easier as they
use these tools to try and understand the code conversation that has gone
before.</p>
<p>References:</p>
<ul>
<li><a href="/git/">my living essay on git</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>I Built a Keyboard</title>
       <link>http://evantravers.com/articles/2018/09/12/i-built-a-keyboard/</link>
       <pubDate>Wed, 12 Sep 2018 02:46:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/09/12/i-built-a-keyboard/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2018/09/keyboard1.jpg"></p><p>I have been using mechanical keyboards since college... it's just nice to have
a good tool to do my best work on. The best comparison I can give is
musical... regardless of your skill level as a musician, there's a difference
in feel and ability when you handle a truly nice instrument. The same is true
of a good keyboard. My accuracy, speed, and comfort are improved by a
predictable, consistent keypress. I started out with a WASD with MX Blues,
then had a WASD with MX Browns (after coworkers complained about the noise!).
I eventually settled on a work Pok3r with MX Clears, which I have been using
for years until I bought the Planck Light off of Massdrop.</p>
<p>The Planck quickly became my main board, and I sold all my other boards off to
fund more ortholinear projects. I have really come to love the ortholinear
layout and ability to program and customize my own key maps and macros. The
theory behind ortholinear is two-fold: First, a simple grid is easier to hack
and put clever things into, like a tenkey. Second, the grid allows your
fingers to move up and down the whole board. I used to hit pretty much every
modifier except shift with my thumb, now I'm using my whole hand and my thumb
RSI is getting a little reprieve.</p>
<p>Even before the keyboard arrived, I was starting to tweak and design a split
layout. QMK even let me use the same layout on my Planck light that I will use
on my split, and any changes I make can go back and forth between the two! As
a UX designer and a software engineer, being able to customize and tailor my
main tool to my exact needs is <em>really</em> fun and satisfying. For instance, I
use Sketch.app at work for UI designs, and I was able to put a macro layer on
the left hand of my split so that I don't have to move my hand around to reach
for handy shortcuts while using my mouse/tablet to design.</p>
<p>If you are interested, <a href="https://github.com/evantravers/qmk_firmware/tree/evans_4x12/layouts/community/ortho_4x12/fullmods">here's a link to my current layout system.</a></p>
<p>I started planning for more ortho/QMK keyboards quite soon after I started
working with the Planck Light, the first of which is a split ortholinear that
I've been working on for about a month or so. I had just decided that at some
point, I'd like to build a split, and lo and behold some extra PCBs surfaced
after the group buy had ended. I snapped them up and started looking for a
cheap case design, fully intending to do a simple budget build to see if I
liked the idea. That didn't exactly go as planned.</p>
<p><img src="https://images.evantravers.com/articles/2018/09/keyboardspecs.jpg" alt="keyboard schematic" /></p>
<p>The PCB was designed by <a href="http://maple-computing.com/">Maple Computing</a>… it
known as the Let's Split Eh. It has USB-C, and backlighting built in… all I
had to do was solder on switches.  While researching 3d printed cases, I found
<a href="https://imgur.com/a/nsXCSEo">a beautiful design for a let's split</a> on reddit,
and contacted the original poster who put in me touch with the designer
(/u/smuttenDK) who not only kindly shared his CAD files with me, but helped me
modify them to fit the PCB.  He spent a lot of time answering my questions and
helping me figure everything out, so I really owe him. My friend Andrew very
kindly helped me print them on his fancy 3d printer, going through a couple
iterations and colors. It's a simple design... a 3d printed shell that cradles
the PCB and the plate sits on top. 3D printed sockets accept M3 nuts for
standard M3 screws to hold the whole sandwich together. I'm already toying
with the idea of printing a tented variant, but I'm just going to enjoy it as
it is for now.</p>
<p>I ordered the plate lasercut from a laserboost.com in Barcelona Spain… it was
surprisingly cheap and fast. I was impressed with their customer service
response time, and the ease of making the order through their web app. This
was probably the most nerve-wracking part of the build because do-overs would
have been really expensive. It was really satisfying when I got to dry fit it
to the case and could see that it was going to fit and work. I also got to dry
fit the Zealio 67g tactile switches... they are very nice, a worthy successor
to the MX Clears that I have loved for years.</p>
<p><img src="https://images.evantravers.com/articles/2018/09/keyboard2.jpg" alt="let's split eh keyboard" /></p>
<p>A friend who owns a phone repair shop was kind enough to lend me his worktable
to solder on… he has all the fancy toys including very nice soldering irons
and one of those magnifying stations. One of the guys in there started toying
with the 3d print, and he turned out to have been a model-building hobbyist
growing up. He spent fifteen minutes cleaning up the print with an Exacto
knife, and suddenly everything fit nearly perfectly flush.</p>
<p><img src="https://images.evantravers.com/articles/2018/09/keyboard3.jpg" alt="let's split eh keyboard" /></p>
<p>Finally on this Monday… the SA Ice Caps from
<a href="https://pimpmykeyboard.com/">PMK</a> and custom TRRS cable from
<a href="https://zapcables.com/">ZapCables</a> came in so I can finally write this blog
post on it. :P I really like it. Earlier today on a typing test on
<a href="http://typingclub.com">typingclub.com</a> I peaked at 99wpm with 100% accuracy…
the weird layout has forced me to iron out some things that were wrong about
the way I touch-typed earlier. I think it's a keeper.</p>
<p><img src="https://images.evantravers.com/articles/2018/09/keyboard4.jpg" alt="let's split eh keyboard" /></p>
<p>Anyway… it's been a satisfying and nerdy experience. I am really grateful to
all the people on reddit, discord, and my friends in Birmingham who helped me
put together this unique tool that I get to now enjoy every day at work. One
of my favorite things is building tools for others, and now I get to enjoy this
one for myself.</p> ]]></description>
    </item>
    <item>
       <title>Bullet Journaling: A Six Month Review</title>
       <link>http://evantravers.com/articles/2018/07/31/bullet-journal/</link>
       <pubDate>Tue, 31 Jul 2018 00:37:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/07/31/bullet-journal/</guid>
       <description><![CDATA[ <p><img alt="An image of my bullet journal on a desk." src="https://images.evantravers.com/articles/2018/07/notebook_1.JPG"></p><p>At the beginning of this year, I decided to upgrade my personal organization
system. Between increased responsibilities at work and being newly married I
had a few more things on my plate, and I wanted to do a better job of keeping
track of the plates spinning in my world.</p>
<p>At first, I turned to my familiar digital tools, particularly my favorite
<a href="http://trello.com">Trello</a> and Apple's Reminders.app. However I wasn't
satisfied.  Trello has the ability to store <em>too</em> much context, and Reminders
too little. After thinking about it for a little while, I realized I probably
needed a separate family and a personal system. The family system would need
the ability to store upcoming issues/events/projects for collaboration with my
wife, the ability to track ongoing family projects, and to estimate our total
family commitment level. (We are trying hard to avoid overcommitment!) Trello
is a great fit for this, and one we continue to use. As opportunities or ideas
come up (needed car repairs, visits with friends, paperwork to fill out) it
gets added to Trello and discussed once a week during our Sunday afternoon
meeting.</p>
<p>The personal system would need to be primarily for me: my work and my personal
goals. It doesn't need collaboration, but it needed to enhance and encourage my
focus. I've been thinking a lot about focus this year... and my lack of it.
Trello usually gets me lost in details, and I wanted something a little more
high level that could keep me focused on the most important things.</p>
<p>I took a quick look around the world of todo apps (of which there are legion!)
and made a quick trial of <a href="https://culturedcode.com/things/">Things.app</a>.
Things is a <em>wonderful</em> application with great design. I enjoyed it
immensely, but ultimately decided to pass on it for two reasons: first, my
phone is too old and full to run it quickly. It takes entirely too long to
enter an entry! (This isn't Things fault, it's mine.) The second and more
important reason is that I really want to spend less time on my phone, and I
feared that continuing to use my phone as the place where I go to find my next
item to focus on would ultimately prove futile as 90% of the distraction in my
life comes from that tiny screen.</p>
<p>While searching for systems to organize myself, I came across Shawn Blanc's
articles about bullet journaling, and how he uses a <a href="https://thesweetsetup.com/hybrid-producitivy-method-using-both-analog-and-digital-for-task-management/">combined digital and
analog</a>
system. My mom had already been using bullet journaling for some time and
loves it, so I started googling around to learn more.</p>
<p>It was overwhelming... but fascinating.</p>
<p><a href="http://bulletjournal.com/">Bullet Journaling</a> is a concise but extendable
system of patterns to use to organize physical journals and notebooks.</p>
<p>There is not a special notebook, or any <em>correct</em> way to do bullet journaling.
It is just a short set of core principles to start from, and then the rest is
up to your creativity solving your particular set of focus/organization
problems. This is the thing I love most about the system. You aren't buying a
system made for other people... you get the opportunity to sculpt it just for
you!</p>
<p>I've been tweaking and working with mine for about six months, and having gone
through the process of filling one journal and opening another, I thought I'd
share what I've learned.</p>
<h2><a href="#focus-on-the-main-thing" aria-hidden="true" class="anchor" id="focus-on-the-main-thing"></a>Focus on the main thing.</h2>
<p>I find that the <a href="https://help.bulletjournal.com/article/7-rappid-logging">rapid
logging</a> style of
bullet journaling lends itself to strengthening my focus. I have been trying
to take five minutes at the end of every day to solidify my notes and to
choose the most important task for the next work day. I migrate this item to
the next work day, so that when I arrive at work, I have no decisions to make
and no excuses, I can merely get into flow.</p>
<h2><a href="#retrospection-is-key" aria-hidden="true" class="anchor" id="retrospection-is-key"></a>Retrospection is key.</h2>
<p>Up to this point, I've been using Apple's Reminders.app as my main todo list.
While really convenient to be able to dictate my todos to Siri, it was
discouraging to be constantly carrying around the list of what I need to do.
In a bullet journal, your tasks that you are focusing on exist in the context
of what you have already accomplished. Just seeing the little &quot;x&quot;s that
represent the work I've already finished behind the work I have yet to do is
hugely motivating.</p>
<p>I have also started taking time at the end of each month, to review my lists
and events to build in a sort of month-review. I use this to both bolster my
gratitude and sense of accomplishment (&quot;Oh yeah, I really did a lot of useful
things this month!&quot;) and I also try to learn from my mistakes as Sarah and I
plan the next month. (&quot;Hmm... we felt stressed due to commitments last month,
let's cut back and do more with less this month.&quot;)</p>
<p><img src="https://images.evantravers.com/articles/2018/07/notebook_3.JPG" alt="my montly spread in a bullet journal" /></p>
<p>A couple months ago, I was convicted that I wasn't waking up early like I
ought, and that was eating into the time I normally spend praying and reading
in the morning. (In my defense, it was probably a little due to getting used
to having a baby in the house.) As a result of talking about this with Sarah,
I added a habit tracker to my next month's planner, and have been slowly
turning that around.  Its been really encouraging to look back over the past
six months, and see the slow changes in myself and in my journal.</p>
<h2><a href="#build-in-flexibility" aria-hidden="true" class="anchor" id="build-in-flexibility"></a>Build in flexibility.</h2>
<p>I've been trying to develop my system slowly... there is a ton of information,
layouts, strategies, stickers, and systems out there, and it was overwhelming
at first.</p>
<p>I just started with what I needed... a todo list.</p>
<p>After using it for two weeks, I realized I needed a way to schedule things out
a week, so I found a simple design that worked for me.</p>
<p><img src="https://images.evantravers.com/articles/2018/07/notebook_2.JPG" alt="my weekly spread in a bullet journal" /></p>
<p>Each time I came up with a need, I made a note of it, so that I could think
about it and experiment with a solution in the next week or month. I love that
it has slowly grown around my needs, rather than me attempting to fit my life
around someone else's system.</p>
<p>For example: After realizing my home projects were getting lost in the larger
work list, I borrowed from Things.app's concept of Evening tasks. For each day,
I put workday tasks at the top of the day, and tasks for the evening after I
get home at the bottom. That simple separation persists to several areas of my
journal, helping me separate work from home life.</p>
<h2><a href="#dont-be-afraid-of-smudges" aria-hidden="true" class="anchor" id="dont-be-afraid-of-smudges"></a>Don't be afraid of smudges.</h2>
<p>This is hard for me to admit, but I want it to be perfect. It's not going to
be perfect though... pens will smudge, your brain will betray you and write
the word someone else is saying instead of what you intended to write...  cross
it out and move on.</p>
<p><img src="https://images.evantravers.com/articles/2018/07/smudges.jpg" alt="There's a bit more smudgey here than I'd like but that's ok!" /></p>
<h2><a href="#record-it-all-focus-on-a-little" aria-hidden="true" class="anchor" id="record-it-all-focus-on-a-little"></a>Record it all, focus on a little</h2>
<p>In college, I developed a <em>really</em> weird notebook habit. I used 3-ring binder
style notebooks, and I hated that I could not really use the left side as a
right-handed person. Therefore, I would use the left side for scratch paper...
equations, half-answered questions, drawings off the white board, and the
right side was as close to perfect notes as I could muster: drawn from and
distilled from the sprawl on the left. I also started keeping a todo list on a
giant sticky note, moving it from page to page as the day's classes wore on.
This way, I wouldn't lose class assignments and important reminders in the
mess of scratch paper or polluting my condensed notes.</p>
<p>I completely stole this from <a href="https://twitter.com/mattragland">Matt Ragland</a>,
but I'm using a really similar pattern in my bullet journal now, and I <em>love</em>
it: One side of the bullet journal is purely concise organization, and if you
flip the whole book over, that's my mess. If I want to focus on what I should
be doing today, it's on the organization side, but if I'm dreaming up a UI, or
taking notes during a call, it goes on the <em>other</em> side of the notebook. I
link the notes using a modified version of the
<a href="http://bulletjournal.com/threading/">threading</a> concept from Bullet Journal.
That means if a meeting in my organizer has an underlined number beside it,
that's the reference to the page number of the extended notes on the other
side of the book. I'll often take the one or two big ideas from the messy
notes and record it next to it to help me remember what I learned there. It
works perfectly for me, both helping me stay focused on my left-brain side of
the book and allowing for me to sprawl out and be creative on the right-brain
side.</p>
<h2><a href="#make-it-your-own" aria-hidden="true" class="anchor" id="make-it-your-own"></a>Make it your own.</h2>
<p>These are just suggestions. Make a list of todo items in your pocket notebook?
That's your bullet journal. Start with what you have, change it to become what
you need.</p>
<p>I really have enjoyed my journey through bullet journaling. I feel that I am
keeping my world in order, focusing more on the moment and remaining grateful
for what has already happened. It is not perfect, but it is a great fit for me
at the moment.</p>
<p>Do you bullet journal, or do you have a system that has helped you stay
focused and in the moment? I would love to hear about it!</p>
<h2><a href="#addendum" aria-hidden="true" class="anchor" id="addendum"></a>Addendum:</h2>
<ul>
<li><a href="https://shawnblanc.net/2015/06/the-note/">A post on focus that helped me a lot</a></li>
<li><a href="https://shawnblanc.net/2018/05/number-one-productivity-tip/">A post that encouraged me to try personal retrospectives</a></li>
<li><a href="https://www.youtube.com/watch?v=ADreC5svqk0">The video that got me excited to try bullet journaling</a></li>
<li><a href="https://www.baronfig.com/products/shopconfidant">My favorite journal</a></li>
<li><a href="https://www.staedtler.us/en/products/ink-writing-instruments/fineliners/triplus-fineliner-334-triangular-fineliner/#id=20041&amp;tx_solr%5Bq%5D=triplus">My favorite pens</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>The Last Tab</title>
       <link>http://evantravers.com/articles/2018/02/12/the-last-tab/</link>
       <pubDate>Mon, 12 Feb 2018 02:22:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/02/12/the-last-tab/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2018/02/yes-no-tab.png"></p><p>When I &quot;research&quot; or shop for things on the internet, I usually fall into an
easy comparison shopping mentality. I open all my options in a giant blooming
tree of tabs, and as my browsing reveals reviews or insights, I prune branches
until I arrive with one last tab left. It's a powerful and effective means of
choosing a product, and in the world of Amazon Prime, it's an easy and common
workflow.</p>
<p>Traditional critical thinking skills start out with nearly the same gathering
process as comparison shopping. We set out through the world, exploring linked
topics and an ever widening tree of facts, hypothesises, and opinions. At some
point we take each claim and fact, compare it with our worldview, our
experience and research. We consider whether to accept or reject it. We
borrow, remix, and reform the information we've collected into an opinion of
our own.</p>
<p>The difference between the two modes is whether the information is gathered
naively or with a critical mindset. It is a subtle difference, and obtaining
that time-honored perspective has become harder in this age of immediate
information access. I am not that old or wise, but I'm old enough to remember
a time before AOL, where my search for knowledge was enabled by reams of books
and tempered by the speed of which I could return to a library or find that
book I lost. The search was interwoven with gaps in which I daydreamt and
thought, considered and reconsidered, doubted my assumptions, re-read old
information with new insights.</p>
<p>Unfortunately, I think that because this comparison shopping, &quot;last tab&quot; method
of choosing is so convenient, I've been reflexively applying it to choices that
deserve more thought. Many times I tend to do more &quot;shopping&quot; for my opinions
than I do forming my own. I tend to do less collecting and critical analysis in
favor of more instinctual pruning, winnowing opinions that seem to be
conflicting from my own. When I find myself with &quot;one tab left&quot; I tend to just
adopt that as my own.</p>
<p>I'm afraid of the intellectual atrophy my mind has undoubtably suffered as a
result. I'm convicted that eliminating less desirable &quot;tabs&quot; narrows my world
and diminishes my compassion for those who disagree with me.  Most of all, I
suspect that by surrendering what little sense God has granted me to Google, I
endanger myself and my family by resigning from my social awareness and
decision making.</p>
<p>It is one thing when I'm choosing a shoe: However creative I may be I can't
make a running shoe from scratch. It's entirely another if I adopt the author's
opinion or persona when considering a news event... or theology.</p>
<p>Comparison shopping is not entirely an anathema. I don't have the time or funds
to purchase, evaluate, and become an expert on twenty pairs of running shoes.
It is wise and useful to consult the incredible resources available to us on
the internet to make a good decision. However, I want to thoughtfully return my
brain back to a mode of critical study, internalization, consideration...  to
no longer simply winnow through opinions and pundits until I find the least
terrible option.</p>
<p>I was talking to a wise friend... when faced with <em>any</em> problem he is choosing
to forgo the dash to search google for other people with the same problems.
While this is a useful skill, he has found the value in stopping. Considering.
Praying and meditating upon truth and God's character...  taking time to
understand the problem and himself. He's not alone in this: Warren Buffet
famously spends hours in thought each day. The more I think about it, the more
this pattern is <a href="http://www.vmi.edu/media/content-assets/documents/museums/stonewall-jackson-house/Jackson_Daily_Routine.pdf">identifiable</a> <a href="http://26theodore.tumblr.com/post/26415909053/mattorgorg-the-daily-schedule-of-theodore">in</a> <a href="https://redeeminggod.com/writing-routine-of-c-s-lewis/">history</a> or even in <a href="https://www.youtube.com/watch?v=PrvtOWEXDIQ">really simple (although
naive) tests</a> for what is desirable.</p>
<p>I want this to be a part of my life... not to entirely give up the information
superpowers we have received in this day and age, but to understand how the
convenience of search has programmed me to lazily trust in the seemingly
infallible web. Hopefully, with practice I will learn to choose a moment of
consideration before leaning on the crutch of &quot;the last tab.&quot;</p>
<h2><a href="#what-im-reading" aria-hidden="true" class="anchor" id="what-im-reading"></a>What I'm reading:</h2>
<ul>
<li><a href="https://thesweetsetup.com/shawn-blanc-ulysses-setup/">Shawn Blanc’s Ulysses Setup</a></li>
<li><a href="https://thesweetsetup.com/keeping-commonplace-book-part-1/">Keeping a Commonplace Book: Part 1</a></li>
<li><a href="http://bittersoutherner.com/a-hardworking-man-named-bob-mcdill-country-music/">A Hardworking Man Named Bob McDill</a></li>
<li><a href="http://www.imdb.com/title/tt6438096/">Becoming Warren Buffet</a></li>
<li><a href="https://en.wikipedia.org/wiki/PDCA">PDCA</a></li>
<li><a href="http://www.43folders.com/2005/09/01/ben-franklin-keeper-of-his-own-permanent-record">Ben Franklin: Keeper of his own 'Permanent Record'</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>On unplugging</title>
       <link>http://evantravers.com/articles/2018/01/25/on-unplugging/</link>
       <pubDate>Thu, 25 Jan 2018 00:06:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/01/25/on-unplugging/</guid>
       <description><![CDATA[ <p>(I swear, I hate clickbait titles but my brain could not help but think of at
least fifteen <em>horribly</em> punny titles for this post, all of which I threw
away. If you just love puns, <a href="/contact/">shoot me a line</a> and I will tell you
a few of them or contact you next time for a good title.)</p>
<p>For a while now, I've played with the idea with unplugging from social media.
People I respect and admire have done it, and report unrivaled productivity
and unperturbed hearts from the other side of the veil. What has kept me from
making the leap is (the valid and relatively noble) argument of &quot;I don't want
to lose touch with loved ones and family members... I don't want to feel
disconnected.&quot; This is not a bad urge...</p>
<p>I am coming to believe that for me Instagram and Facebook are numbing the
symptoms of my real problem.</p>
<p>The urge to be connected, to be up to date, to be engaged and involved is a
good one. That tickle in the back of head saying &quot;I haven't heard from John in
a while, I wonder how he's doing&quot; is a great thing. I am slowly understanding
that my current response to this tickle... flipping open Facebook to reassure
myself of John's overall health and relative good fortune isn't adequate Who
actually puts the state of their heart on Facebook? What if John really needs
a faithful friend right now?</p>
<p>I am going to turn off notifications. I'm unplugging... so that my heart can
finally plug in. I am in no way damning Facebook or Instagram... I'm going to
continue to pop in now and again to share cute baby photos or wish folks happy
birthday... or share verbose and virtually useless rants like this one. I just
don't want to render numb my God-given need to connect and bless you with a
shallow sweep over your profile picture, a quick laughing face reaction to
your most recent post, and gallivant off into a storm of cute cat videos and
30 second cooking tips.</p>
<p>So let's grab coffee. We haven't talked in too long.</p> ]]></description>
    </item>
    <item>
       <title>Too busy to be bored</title>
       <link>http://evantravers.com/articles/2018/01/14/too-busy-to-be-bored/</link>
       <pubDate>Sun, 14 Jan 2018 00:38:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2018/01/14/too-busy-to-be-bored/</guid>
       <description><![CDATA[ <p>I set myself a goal to write a blog post this weekend... and almost didn't find
the time.</p>
<p>It's not that I had no time on my hands, it's that I have too much. Too much
of my time gets sunk into endless scrolling, researching (many people call it
&quot;shopping&quot;,) diving headlong into instagram tags, endless trails of comments
and rather useless drivel. It was really fun, very draining, and I wasn't
bored at all.</p>
<p>That's the problem.</p>
<p>As a kid, I was bored all the time. So I built forts in the woods, I
learned photography, I read books, I took up skateboarding, I wrote
half-baked adolescent fantasy novels, I mapped the woods behind my house, I
build endless successions of better and better lego mechwarrior clones... I
made <a href="https://vimeo.com/1789237">terrible action movies</a> starring my siblings.</p>
<p>I miss being bored. I know the old adage... idle hands and all that... and
it's true. The world, the flesh, and the devil can do a lot of harm with too
much time and not enough wisdom. What I am realizing is that my new situation
is that I am spending so much time consuming that I have no time left to
create.</p>
<p>I would like to change that this year, and this meandering post is the first
part of that. I'm trying to change my phone homescreen and my habits, paying
much less attention to the red dots littering my digital devices with their
siren call of &quot;pay attention to <em>meeeee!</em>&quot; and more time with my nose in a book,
a pencil in my hand, a camera by my side... and my family with me. Blogging may
seem counter-productive, but it may be the last public creative outlet I have
that doesn't bombard me with a constant stream of notifications and likes,
slowly besieging my heart till it marches in lockstep with the generally
approved set of opinions and behaviors. (I've become all to aware of what gets
likes on Instagram... and that's not really the thought I want running through
my subconscious when I'm taking pictures of my family.)</p>
<p>I can not afford to be distracted any longer. I'm really excited to spend more
of my year with purposeful, boring margin... lots of room for magic and
memories.</p>
<h3><a href="#further-reading" aria-hidden="true" class="anchor" id="further-reading"></a>Further Reading:</h3>
<ul>
<li><a href="https://shawnblanc.net/2018/01/things-which-matter-most/">Shawn Blanc</a></li>
<li><a href="http://www.businessinsider.com/what-happens-to-your-brain-like-instagram-dopamine-2017-3">What happens to your brain when you get a like on Instagram</a></li>
<li><a href="https://medium.com/the-mission/why-calendars-are-more-effective-than-to-do-lists-9bc6ce3bee50">Why Calendars are More Effective Than To Do Lists</a></li>
</ul>
<h3><a href="#bonus-what-ive-been-reading-recently" aria-hidden="true" class="anchor" id="bonus-what-ive-been-reading-recently"></a>Bonus: What I've been reading recently:</h3>
<ul>
<li><a href="https://www.amazon.com/Hole-Our-Holiness-Paperback-Godliness/dp/1433541351">The Hole in our Holiness</a></li>
</ul> ]]></description>
    </item>
    <item>
       <title>New year, new site!</title>
       <link>http://evantravers.com/articles/2017/01/28/new-year-new-site/</link>
       <pubDate>Sat, 28 Jan 2017 01:24:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2017/01/28/new-year-new-site/</guid>
       <description><![CDATA[ <p><img alt="Sarah and me, by Meghan Murphy" src="https://images.evantravers.com/articles/2017/01/newyear.jpg"></p><p>It's been too long guys.  I'm sorry I've been away... I've been... busy.</p>
<p><img src="https://images.evantravers.com/articles/2017/01/sarahandme.jpg" alt="my wedding" /></p>
<p>It's been a wild ride, but the Lord has been very good, and for some reason I
haven't felt the need to post angsty/honest prayers to the world. I spent a
couple of years praying for joy... and the Lord provided me the greatest source
of joy I have ever known. I love her dearly, and consider myself the most
blessed man ever.</p>
<p>I have missed writing though, even though I've written quite a bit just for
myself, but each time I sat down to share something I got caught
fixing/tweaking my website rather than writing, and eventually got so far down
the rabbit hole that my site didn't even build anymore... so I tore it down to
the ground and rebuilt it. This is the result.</p>
<p>I've got some code thoughts, some prayers, some random stories and rants
brewing in my brain, so hopefully this is a first step to sharing some Phil 4:8
style posts.</p>
<p>I'll likely keep tweaking too... I've learned a lot and I want to try it out on
my website, but I figured I'd get the basics up first.</p>
<p><em>Engagement and wedding images by <a href="http://www.astillbreath.com/">Meghan
Murphy</a>.</em></p> ]]></description>
    </item>
    <item>
       <title>Delighting In The Bride</title>
       <link>http://evantravers.com/articles/2015/10/05/delighting-in-the-bride/</link>
       <pubDate>Mon, 05 Oct 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/10/05/delighting-in-the-bride/</guid>
       <description><![CDATA[ <p><img alt="dress" src="https://images.evantravers.com/articles/2015/10/dress.jpg"></p><blockquote>
<p>As for the saints in the land, they are the excellent ones, in whom is all my
delight.</p>
<p>Psalm 16:3</p>
</blockquote>
<p>Jesus, teach me to delight in the company and love of the brothers and sisters
I have in Your grace. You were killed by sinners, but it was You who executed
Your plan from before time to make a new people for Yourself, bringing all
nations and tongues under a single banner, the cross itself, once a symbol of
torture and Roman rule, now and forever an emblem of love and Your dominion
over death itself!</p>
<p>Lord forgive me for my pride and arrogance. I have treated members of Your
precious bride as unlovely, when indeed it was I who have been unloving. I have
quibbled over words, looked down upon past behaviors, sneered at sin. Forgive
me Lord. The family of the church is beautiful and excellent because of Your
grace… and I will learn to celebrate Your goodness in every blood-washed soul.
Train my eyes to see the world as You see it… every man and woman in the scope
of eternity and your matchless grace covering all their life in Your perfect
righteousness.</p>
<p>You look upon us with love, not because of who we are and what
we've done, but because of who You are and what You've done. I too must learn
to see this truth in those around me. Remove the logs from my eyes, keep me
from being speck-centered in my relationships. Help me to love unconditionally,
so that the world will see and know that I am a Your disciple. Above all else,
may I see every conversation and interaction as a service opportunity, to
glorify and serve You by serving those You love and died for. Thank You for
this challenge and truth. I love You Lord. I pray this in Your life-giving
name, amen.</p> ]]></description>
    </item>
    <item>
       <title>His love endures forever!</title>
       <link>http://evantravers.com/articles/2015/08/02/his-love-endures-forever/</link>
       <pubDate>Sun, 02 Aug 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/08/02/his-love-endures-forever/</guid>
       <description><![CDATA[ <p><img alt="view from the mountain" src="https://images.evantravers.com/articles/2015/08/england.jpg"></p><blockquote>
<p>Give thanks to the God of heaven, for his steadfast love endures forever.
(Psalm 136:26 ESV)</p>
</blockquote>
<p>My Father, I have always loved this anthem of a Psalm, but today through it I
praise you still deeper. Thank you for what you showed me buried in its
treasure-trove this morning. I love the list of great works, and have always
triumphantly recounted with the psalmist your wonders of old: victory over
enemies, freedom from unjust oppression, power over creation's bounds and the
rules of physics itself… but for some reason I have missed the whole point of
the song. These actions describe You yes, but the psalmist calls us to joyous
praise because of a still deeper truth: Your love endures forever! He recounts
your works in Israel's history with joy, but to him they are a side note to the
work of redemption. Thank you that you love <em>endures</em>, it was conceived, begun,
planned in the time before time, it continued, was promised, executed and
brought to life in the past, and continues gloriously on into eternity, for
Your love has a name and His name is Jesus. Thank you that your love endures…
for without it I certainly will not. God you are great. You are truly awesome.
Worthy is your name! Hallelujah!</p> ]]></description>
    </item>
    <item>
       <title>Starving</title>
       <link>http://evantravers.com/articles/2015/05/05/starving/</link>
       <pubDate>Tue, 05 May 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/05/05/starving/</guid>
       <description><![CDATA[ <p><img alt="golden path" src="https://images.evantravers.com/articles/2015/05/goldenpath.jpg"></p><p>Heavenly Father, thank you for your graciousness in creating our bodies and our
souls to mirror each other in some ways... your patterns in creation are like
your fingerprint, allowing us foolish men and women to discover your hand in
the physical world, and to better understand our spiritual selves. As people we
are born, we drink milk, are weaned, mature, eat meat, reproduce... and the same
words and concepts you have used for our spiritual lives as well.</p>
<p>When a sailor falls into the icy cold Atlantic, miles from rescue, the water
slowly lowers his body temperature to deadly levels. His experience will slide
from simple cold, intense shivering, incredible pain, the ironic sensation of
burning, numbness...  But the moment that he is most in peril of death is a
slowly spreading feeling of bliss, that all is well, and he has nothing to
fear. The cold floats away, and soon, so will his mind. A similar shutdown
occurs to those dying of thirst. The most horrifying moment is when the
sufferer no longer feels thirsty. The end is very near.</p>
<p>In my brief life, I have never been at the precipice of death by cold or
thirst, but I have found that this is has certainly been true of my foolish
soul. The times that I have found that I feel like I don't need to drink of the
Word are the moments I am most in peril of spiritual dehydration... and I
confess that these moments are far too common.</p>
<p>Heavenly Father... please bring me to your Word. I want to partake daily,
hourly, constantly. I know I'm promised that the more I drink, the more I'll
feel the thirst for your Truth in a Holy addiction. Keep me from the pride of
thinking that I'm doing well and can skip this morning, I know that this is a
dangerous time, near to exhaustion. Please draw me near to Yourself, and grant
me a sweet time of communion and encouragement. In your Son's precious name I
pray, amen.</p> ]]></description>
    </item>
    <item>
       <title>Forget Not His Benefits</title>
       <link>http://evantravers.com/articles/2015/04/14/forget-not-his-benefits/</link>
       <pubDate>Tue, 14 Apr 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/04/14/forget-not-his-benefits/</guid>
       <description><![CDATA[ <p><img alt="cracks" src="https://images.evantravers.com/articles/2015/04/cracks.jpg"></p><blockquote>
<p>Bless the Lord, O my soul, and forget not all his benefits, who forgives all
your iniquity, who heals all your diseases, who redeems your life from the pit,
who crowns you with steadfast love and mercy, (‭Psalm‬
‭103‬:‭2-4‬ ESV)</p>
</blockquote>
<p>This whole passage is glorious, but I've been reflecting on being crowned with
steadfast love and mercy... God is a good father, and it seems to me that He
would not &quot;crown&quot; us unless He had already provided for all our basic needs.
Washed clean by His blood, fed by His Word, clothed in His righteousness,
crowned by His faithfulness and mercy.</p>
<p>I'm convicted that I have often forgotten this benefit, indeed I even enter
prayer without acknowledging any of these glorious truths... Asking for so
much, I end up praising for so little. I'm going to spend some serious time
this week revisiting &quot;his benefits.&quot; It's already been a sweet thing for my
soul. Thank you Lord!</p> ]]></description>
    </item>
    <item>
       <title>A Beautiful Inheritance</title>
       <link>http://evantravers.com/articles/2015/01/21/a-beautiful-inheritance/</link>
       <pubDate>Wed, 21 Jan 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/01/21/a-beautiful-inheritance/</guid>
       <description><![CDATA[ <p><img alt="sunset" src="https://images.evantravers.com/articles/2015/01/sunset.jpg"></p><blockquote>
<p>The Lord is my chosen portion and my cup; you hold my lot. The lines have
fallen for me in pleasant places; indeed, I have a beautiful inheritance.
(‭Psalm‬ ‭16‬:‭5-6‬ ESV)</p>
</blockquote>
<p>Thank you Lord for the joy I have felt over the past few weeks... Rarely have I
felt so energized and full of gratefulness as I have recently. Lord, in this
high water time of my life, protect me from idolatry. I don't want to come to
desire this feeling of fulfillment over you. I don't want to desire the
conduits of your joy, I long to long after you.</p>
<p>Thank you for all the fine weather, wonderful friends, and golden opportunities
that you send. Thank you also for the gloomy days, strained conversations, and
bleak schedules that you use to shape me into the image of Jesus. I here and
now recognize and praise you for both, but I fear that as soon as my heart
seizes upon the good with jealous greed or the bad with bitter discontentment I
will have to repeat this prayer and surrender once more. Enable me to always
turn to you, in good or bad.</p>
<p>You are my inheritance, my chosen portion. I am grateful, and content.  Help me
to rest in you, not because of your gifts, but because of the everlasting love
and faithfulness of the Giver. In Jesus' name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Finding Fullness of Joy</title>
       <link>http://evantravers.com/articles/2015/01/16/fullness-of-joy/</link>
       <pubDate>Fri, 16 Jan 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/01/16/fullness-of-joy/</guid>
       <description><![CDATA[ <p><img alt="morning" src="https://images.evantravers.com/articles/2015/01/psalm16.jpg"></p><blockquote>
<p>You make known to me the path of life; in your presence there is fullness of
joy; at your right hand are pleasures forevermore. (‭Psalm‬
‭16‬:‭11‬ ESV)</p>
</blockquote>
<p>Lord, I am still seeking to learn about joy... and the phrase &quot;fullness of joy”
sounds <em>wonderful</em>. I can recall times when I've felt a true fullness of joy...
I can even see some fullness on the horizon as I become an uncle in just a few
weeks!  However, I must confess that I don't always feel a fullness of joy in
your presence, so I'm going to need to drink in this psalm over the coming
weeks.</p>
<p>It seems to me that previous verses express the foundation of this joy as
welling up from David's gratitude for your protection, provision, and in Jesus'
resurrection (&quot;you will not let your holy one see corruption&quot;) leading to our
eternal salvation. How neat it is to read David's words pointing to Christ, so
many years ago! The cities and empires that thrived then are dust now, but your
word abides forever. I believe that I will have to reread some old journal
entries, and muse on all the trials you have delivered me through. I need to
laugh and cry over the beautiful moments you have graciously orchestrated.
Still more precious, I reflect on the <em>vastness</em> of the mercy and grace I have
been granted in salvation!</p>
<p>Thank you Lord for your love that endures my sin so vile, and spans eons of
time to rescue and adopt me as a son and heir. I am truly unworthy, and full of
joy. Continue to work in my heart, and enable me to meditate on these glorious
truths this weekend. In your name I pray, amen.</p> ]]></description>
    </item>
    <item>
       <title>A New Year&#39;s Prayer</title>
       <link>http://evantravers.com/articles/2015/01/05/a-new-years-prayer/</link>
       <pubDate>Mon, 05 Jan 2015 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2015/01/05/a-new-years-prayer/</guid>
       <description><![CDATA[ <p><img alt="Happy" src="https://images.evantravers.com/articles/2015/01/newyear.jpg"></p><p>Jesus, thank you for another new year... it's been a wild season, and I am
grateful as I reflect upon what you have accomplished in my life and in my
family's lives this year. Thank you for grace and mercy seen and unseen.</p>
<p>Lord, the joy of New Year's Day is quickly invaded by the worries of this life,
decisions to be made and lived with, calamities I can't control but fear that
I've caused, reputations, relationships, jagged emotions tied to barely
remembered mistakes that tear at my heart and demand I surrender myself to
their hate.</p>
<p>I honestly don't know fully how to deal with such a thing. I <em>do</em> know for
certain that the Lord of all creation is in charge of my life, that You come
running to meet me, and that when you look at me you see the righteousness of
Christ instead of my sin. I stare up at a bleak sky and instead of an endless
unknown void I know that your glory fills all infinity.</p>
<p>Help my heart to know fully that you uphold, propel, restrain all things. My
mind gratefully accepts this fact, but my emotions still rage. Teach me how to
quiet my heart, to relinquish control, to accept my gentle shepherd's lead
rather than constantly surging towards what I think I need. I want to rest
beside the still waters this year. Help me to hear your voice and know that you
will never leave me nor forsake. Calm my willful soul. In the name of the
Prince of Peace, amen.</p> ]]></description>
    </item>
    <item>
       <title>Delighting in God</title>
       <link>http://evantravers.com/articles/2014/11/19/delighting-in-god/</link>
       <pubDate>Wed, 19 Nov 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/11/19/delighting-in-god/</guid>
       <description><![CDATA[ <p><img alt="shinto" src="https://images.evantravers.com/articles/2014/11/temple.jpg"></p><blockquote>
<p>Delight yourself in the Lord, and he will give you the desires of your heart.
(‭Psalm‬ ‭37‬:‭4‬ ESV)</p>
</blockquote>
<p>Abba, forgive my blindness.</p>
<p>If this verse read “pause momentarily at the altar, if you look worshipful
enough your request will be granted” then I would be following it to the
letter.</p>
<p>I have ever glossed over the command and instead hungrily and sinfully lusted
after the blessing. I know well the desires of my heart, and they have driven
me deeper in despair as I wait and wonder.</p>
<p>I want to learn to delight myself in you. To draw a lasting, deep, fulfilling
joy from my salvation, from your goodness, from your promises. I feel once
again like the the father in Mark 9:24 (slightly modified)… &quot;I delight in you,
help me to delight in you&quot; Recall to my mind your mighty deeds in my life; put
me in a place of peace, knowing that the hands which steer my life rest upon
the throne of the universe.</p> ]]></description>
    </item>
    <item>
       <title>If I Were Judge</title>
       <link>http://evantravers.com/articles/2014/11/14/if-i-were-judge/</link>
       <pubDate>Fri, 14 Nov 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/11/14/if-i-were-judge/</guid>
       <description><![CDATA[ <p><img alt="peace" src="https://images.evantravers.com/articles/2014/11/hp40.jpg"></p><blockquote>
<p>Then Absalom would say, “Oh that I were judge in the land! Then every man
with a dispute or cause might come to me, and I would give him justice.” (<a href="https://www.esv.org/verses/2Samuel15:4">2 Samuel 15:4</a>)</p>
</blockquote>
<p>Jesus, I simultaneously love and hate this story. I remember as a kid reading
those Bible story comic books furiously booing Absalom's Loki-esque
manipulations, his impetuous and ungrateful attitude towards his father David.
As I grew older, my heart understood a bit of his growing resentment after the
disgrace to his sister Tamar, but I still tend to sinfully cheer his fitting
but tragic end, a victim of his own cowardice and ultimately his vanity.</p>
<p>As my path through scripture found me here this morning, I chuckled to myself
as I read the melodramatic manipulation tactics that Absalom is employing here.
Then you convicted me once more, in a part of scripture that I never thought
would be applicable to me. Oh how blind I am.</p>
<p>Lord, I <em>am</em> Absalom. I constantly look about at your kingdom, and my wicked
and silly heart sits in the gate and bemoans &quot;if only I were king, this would
be set right!&quot; How foolish! I am an adopted son of a good and wise king, an
heir and blessed with my crimes forgiven. How could I look around and desire a
different world? Please forgive me. I know you are in control, that your plan
is far more perfect and sound than David's kingdom. Please invade my heart
fully, flood my soul with peace in my present and gloriously saved state. I
surrender my will, please help me to surrender more and more till all my
earthly plans begin and end with &quot;If the Lord wills.&quot; I pray this in Jesus'
precious and all-consuming name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Filling The Void</title>
       <link>http://evantravers.com/articles/2014/11/13/filling-the-void/</link>
       <pubDate>Thu, 13 Nov 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/11/13/filling-the-void/</guid>
       <description><![CDATA[ <p><img alt="leaves" src="https://images.evantravers.com/articles/2014/11/leaves.jpg"></p><p>Abba Father,  I feel the failure of one of my idols today. I have placed my
hope for this week in some thing or someone other than you, and as it fails to
meet my expectations I feel my heart scrounging around for another selfish
opiate. I know my foolish heart well… when one thing disappoints it immediately
tries to fill that hole with some new shiny toy. I run from my disillusionment
to my Amazon wishlist or to another new fulfilling and distracting
conversation, trying to fill the void left by the evaporation of a temporary
and doomed hope.</p>
<p>Once more, save me from myself. I know that my dissatisfaction with this world
and its contents is designed to point me to you. Please continue to break my
idols until I embrace you fully, and place all my heart's hope on your power
and your absolute and uncompromising love for me. <a href="https://www.esv.org/verses/Psalms73:25">Whom have I in heaven but you.</a> <a href="https://www.esv.org/verses/Psalms27:8">You have said &quot;seek my face.&quot; My heart says to you, &quot;Your face Lord, do I seek.&quot;</a> May the way that I respond
to my disappointment serve to glorify you, rather than draw pity to me.</p> ]]></description>
    </item>
    <item>
       <title>Finding Peace in the Storm</title>
       <link>http://evantravers.com/articles/2014/11/05/finding-peace-in-the-storm/</link>
       <pubDate>Wed, 05 Nov 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/11/05/finding-peace-in-the-storm/</guid>
       <description><![CDATA[ <p><img alt="sea" src="https://images.evantravers.com/articles/2014/11/galilee.jpg"></p><blockquote>
<p>Jesus immediately reached out his hand and took hold of him, saying to him,
“O you of little faith, why did you doubt?” (‭Matthew‬
‭14‬:‭31‬ ESV)</p>
</blockquote>
<p>Father, I have always loved this story. I love your serene concern to foolhardy
Peter... That to you the wind and waves didn't exist, didn't even perturb you.
The biggest storm in your eyes was the one in Peter's heart, and so you spoke
to that before you rebuked the elements. Your love for us is amazing.</p>
<p>I confess that I enjoy mocking the blindness of the disciples, that they would
miss the power displayed in feeding a giant crowd and more easily assume that
you were a spectral apparition rather than the long awaited Messiah. Lord, I
find today that I'm guilty of the same foolishness. I cringe before the waves
of my life, fearing the scream of the winds of chance and I forget that if I
were to meet your eyes and believe, I could walk calmly to you.</p>
<p>Jesus, take hold of my sinking, flailing heart today. Let me hear once more the
words said to Peter two millennia ago, and rest in your sovereignty over the
chaos of my world. I know that the worldly storm doesn't always disappear, but
there is no tempest in your peace. May I embrace it, and walk to you without
fear and in increasing joy in your amazing grace.</p>
<p>(photo of Sea of Galilee from <a href="https://www.flickr.com/photos/evantravers/sets/72157624148198263/">our trip in 2010</a>... thankfully no storm involved.)</p> ]]></description>
    </item>
    <item>
       <title>I Surrender All</title>
       <link>http://evantravers.com/articles/2014/10/16/i-surrender-all/</link>
       <pubDate>Thu, 16 Oct 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/10/16/i-surrender-all/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2014/10/peaceful.jpg" alt="peaceful lake" /></p>
<p>Jesus... Thank you for bringing a theme of surrender to my heart again and
again. It's one thing to describe you as my Lord, it's another entirely put
myself to death. I have been finding my mind constantly gnawing on my fears and
worries and putting all my hopes in my feverishly crafted dreams and plans...
And this will not do.</p>
<p>I have been convicted of this. My hope is in the you, to bury the bones of my
past, to deal with my fears of the present, and to bring me safely into a
future more wonderful than my mind can now imagine. All it takes is for me to
wrestle my screaming ego to the ground and force it to stop <em>trying</em>. Turns out
this surrender is hard work.</p>
<p>Heavenly Father, you know all the issues of my heart, because you made me. You
placed some of those desires and plans there, but I have allowed them to be
unruly and placed them on the throne of my life. Come conquer, subdue, and
redeem them as I confess them one by one, so that I can find daily rest in the
fact that the lover of my soul is in command of the cosmos. Be near to me
today. In Jesus' peace-giving name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Do You Hear The People Sing?</title>
       <link>http://evantravers.com/articles/2014/06/05/do-you-hear-the-people-sing/</link>
       <pubDate>Thu, 05 Jun 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/06/05/do-you-hear-the-people-sing/</guid>
       <description><![CDATA[ <p><img alt="wedding" src="https://images.evantravers.com/articles/2014/06/wedding.jpg"></p><p>I recently watched the most recent film version of Les Miserables for the first
time. It's a story I already love thanks to the book, but the screen version
was powerful on many levels. I wept out of pity, I cried out of anger, but no
storyline was more compelling than the beautiful tale of redemption at the end.
I cannot think of a more wonderful depiction of &quot;well done, good and faithful
servant&quot; in film. While I was tearful through the whole film, my heart was
truly touched (as I was in the book) to see Jean Valjean's utter relief and
glory in realizing that his sins are nullified and his soul is free to be free
from suffering and hate. As he breathed out his last moments… I was overcome
with joy that I too have my burden torn away and can enjoy life without the
oppression of my sins and misdeeds. Glorious.</p>
<p>Lord Jesus, thank you for this single reminder, and thank you for drawing this
eternal hope to my mind in many ways this month. Weddings, the choruses of
favorite songs… (&quot;we are not home yet!&quot;) they have all pointed to the blessed
and never-ending dawn when you wipe away every tear, and we will <em>never</em> again
know suffering, loneliness, or damnable temptation. Hallelujah!</p>
<p>Continue to enthrall our souls with the joy that we are holding a guaranteed
ticket to the biggest party in history. In the light of that wedding feast, we
ought to be able to overlook any slight or suffering. Help us all to let go of
our petty and temporary fears and desires so that we can fully embrace this
hope, and in so doing spread joy to those around us. Stand near to us and bless
us, I pray in your precious and life-giving name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Praise For An Inheritance</title>
       <link>http://evantravers.com/articles/2014/05/16/praise-for-an-inheritance/</link>
       <pubDate>Fri, 16 May 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/05/16/praise-for-an-inheritance/</guid>
       <description><![CDATA[ <p><img alt="beach" src="https://images.evantravers.com/articles/2014/05/beach.jpg"></p><blockquote>
<p>Whatever you do, work heartily, as for the Lord and not for men, knowing that
from the Lord you will receive the inheritance as your reward. You are serving
the Lord Christ. (Colossians 3:23, 24 ESV)</p>
</blockquote>
<p>I have often thought of this verse as being a reminder that we ought to not
work for earthly things, that the heavenly reward from The Lord ought to prompt
our full attention.</p>
<p>To think thus is to miss the whole point of what an <em>inheritance</em> is. You don't
earn an inheritance, it comes to you because of who you are and what your
Father has done. The verse itself is in the context of thinking in terms of
self-sacrificing love, always considering others better than ourselves.</p>
<p>Jesus, I have worked in vain, thinking to be paid in terms of my earthly
efforts. Forgive me, such labor was self-serving and utterly wrong in the face
of this truth. All the reward I will ever need has been fully and securely
bought and paid for by your precious blood. Thank you for such a priceless
gift. Help me to work to serve others in joy and selflessness in celebration
and adoration of your love for me. In Jesus' beautiful and perfect name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Praising Your Wisdom When It Hurts</title>
       <link>http://evantravers.com/articles/2014/05/14/praising-your-wisdom-when-it-hurts/</link>
       <pubDate>Wed, 14 May 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/05/14/praising-your-wisdom-when-it-hurts/</guid>
       <description><![CDATA[ <p><img alt="doors" src="https://images.evantravers.com/articles/2014/05/doors.jpg"></p><blockquote>
<p>When my soul was embittered, when I was pricked in heart, I was brutish and
ignorant; I was like a beast toward you. Nevertheless, I am continually with
you; you hold my right hand. (Psalm 73:21-23 ESV)</p>
</blockquote>
<p>This verse burdens my heart, and sets it free. Jesus, how often I allow my
heart to become encrusted with bitterness. I willfully pout that your path for
me is not the direction that I have desired. I bewail and moan as your loving
hand prunes away the unfruitful branches, preparing me for a useful lifetime of
service. Even as you seek to answer my lifelong prayers, removing the veil of
flesh in my heart, &quot;pricking it&quot;, I scream at you in animal fury, &quot;brutish&quot;
indeed.</p>
<p>NEVERTHELESS.</p>
<p>You do not leave nor forsake. You are always with me,
waiting for me to lift my head and acknowledge that even when I do not know,
you do and that shall ever be enough for me. Thank you that do not do
everything I ask, for surely I would be a much sorrier soul if you withheld
your loving hand from healing the hidden places where strongholds abound and
sin waits in the darkness. Thank you for your grace, and today as I see the
truth of this verse I ask you to never stop your heavenly surgery until your
image is stamped across the whole of my being. Thank you Jesus. I ask this in
your precious, life-giving name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Songs in the Morning</title>
       <link>http://evantravers.com/articles/2014/05/08/songs-in-the-morning/</link>
       <pubDate>Thu, 08 May 2014 20:33:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/05/08/songs-in-the-morning/</guid>
       <description><![CDATA[ <p><img alt="lovely" src="https://images.evantravers.com/articles/2014/05/flower.jpg"></p><blockquote>
<p>Let me hear in the morning of your steadfast love. (Ps. 143:8)</p>
</blockquote>
<p>I keep coming back to this verse because it's been the cry of my heart for a
couple of weeks. I need to hear every day that He loves. Not only that He
loves, but that it is steadfast. It's not going <em>anywhere</em>.</p>
<p>If we are faithless, He will remain faithful for he cannot disown himself. (2
Tim 2:13) no matter what we have done, we can not out-sin the merciful gift of
Christ.  Not that we should give up and sin in spite of the precious gift, (Rom
6:1) but that in gratitude and praise we should no longer be bound in sorrow to
the weight of our burdens.</p>
<p>I need so often to return to the Cross at the side of the Narrow Way, and like
little Pilgrim feel my burden bound back down the hill, mine no longer to bear.
Hallelujah.</p> ]]></description>
    </item>
    <item>
       <title>Every Day Camera</title>
       <link>http://evantravers.com/articles/2014/04/21/every-day-camera/</link>
       <pubDate>Mon, 21 Apr 2014 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2014/04/21/every-day-camera/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2014/04/flower.jpg"></p><blockquote>
<p>The best camera is the one you have with you.</p>
<ul>
<li>Chase Jarvis</li>
</ul>
</blockquote>
<p>I've always enjoyed photography. I don't know exactly what started my life-long
love of picture making, but it's been a part of me for nearly 10-12 years now.
I can still remember that day I got my first Kodak camera… one of those
vacation type cameras that was a <a href="http://www.amazon.com/Kodak-Star-Camera-Uses-Film/dp/B000050ZE6">long brick of a
thing</a>. After
poring over some book my grandmother bought with it, I ran outside and promptly
wasted a whole roll of film stalking birds at a bird feeder. They came out
blurry and dark, not a thing to be seen. Despite the initial setback I never
gave up. Four cameras, five computers, three hard drives, six editing software
suites and literally tens of thousands of shutter activations later I am still
as hooked as that first magical moment when I reached out and stopped time,
stole a fragment of light and smeared it on paper to share with others.</p>
<p>One of the most formational things in my photographic life was the year I
accidentally started a 365 project on
<a href="https://www.flickr.com/photos/evantravers/3933632665">flickr</a>. I studied
thousands of pictures in my flickr timeline, and I tried to get out and shoot
<em>every</em> day. It was a huge influence on me… both in terms of the amazing
feedback and encouragement I received from others and also simply because I put
in so many hours of practice, both in shooting and editing.</p>
<p>And so I've set out to do a similarly purposeful journey this year. My goal for
this particular sprint towards excellence is to strengthen my photographic
weakness: I am typically fairly introverted and shy, so I either don't take
pictures of people or I do take them candidly using a long telephoto lens,
instead of approaching close enough to interact, be rejected, or make a friend.
I've realized it's time to get personal. Shoot often, shoot everything.</p>
<h1><a href="#the-camera" aria-hidden="true" class="anchor" id="the-camera"></a>The Camera</h1>
<p><img src="https://images.evantravers.com/articles/2014/04/x100s.jpg" alt="x100s" /></p>
<p>The camera is a Fujifilm X100S. I fell in love with its looks, and stayed for
the clear, bright lens and incredible sensor. There's already a <em>ton</em> of
information on the web about this camera, if you would like to know more I
recommend <a href="http://zackarias.com/for-photographers/gear-gadgets/fuji-x100s-review-a-camera-walks-into-a-bar/">Zack Arias</a>
and <a href="http://strobist.blogspot.com/2013/12/fuji-follow-up.html">David Hobby</a>'s
glowing reviews. I wanted a small-ish, fast camera that I could have with me at
all times, to encourage shooting everywhere. My final verdict was between the
Ricoh GR series and the Fuji X100 series, and the Fuji won mostly on style
points.</p>
<h1><a href="#the-phone" aria-hidden="true" class="anchor" id="the-phone"></a>The Phone</h1>
<p>I have an iPhone 5. Nothing really special about it, it's pretty badly beat up.
It doesn't even take video anymore.  I'm fairly certain this process will
work for you no matter which phone you use. The key is to have a tiny computer
to edit and post for you.</p>
<h2><a href="#eye-fi-transfer" aria-hidden="true" class="anchor" id="eye-fi-transfer"></a>Eye-fi Transfer</h2>
<p>The key to making this workflow work is the Eye-fi card. It's a little SD card
that will fit in nearly any camera and will sync photos automatically to an app
on your phone. It's not perfect by any stretch, but it works pretty darn well.
The weak point is that the SD card actually generates a wifi signal, so if you
are on your home network the stronger signal generated by your wireless router
tends to take precedence and you will have to manually connect to your Eye-fi.
In the field, walking down the street, at a restaurant... it works great.
Fortunately, that's what I bought the Eye-fi for, so I have no complaints.</p>
<p>The X100S has an actual menu setting to turn the wireless on and off, so I can
conserve it's already rather meagre battery. You'll have to check your camera
on Eye-fi's website to see what ability you have to control that kind of thing.</p>
<h2><a href="#the-editing-stack" aria-hidden="true" class="anchor" id="the-editing-stack"></a>The Editing Stack</h2>
<p>The Eye-fi application just dumps the image to the Camera Roll (or android
equivalent.) From there I run through a few editing programs, depending on what
I want.</p>
<p>It's worth noting that <em>every</em> time I send an image between apps, I export to
the Camera Roll. Many of the apps support sending between each other, but at
least on iOS there's a noticeable image quality degradation every time you
directly export rather than going through the Camera Roll. It's annoying, and
leaves a lot of images to clean up later, but it's worth it in the end.</p>
<h3><a href="#vsco" aria-hidden="true" class="anchor" id="vsco"></a>VSCO</h3>
<p><img src="https://images.evantravers.com/articles/2014/04/nickelcreek.jpg" alt="Nickel Creek" /></p>
<p>The main app I've been playing with at the moment for editing is VSCOcam. It's
free on the app store, with paid for downloadable filters. I don't really care
for some of them... they tend to wash out and take all the contrast out of your
image, but it has excellent tools for adjusting your image including a very
good clarity/sharpness tool that looks really good. I've bought a couple packs
of &quot;film&quot; from them, and I usually preset. More often than not, I love the
image coming out of my X100S just like it is and all I'm doing is cropping and
boosting the sharpness.</p>
<p>My one complaint with VSCOcam is that it downsizes the images coming out of my
X100S. I guess it's for speed of switching filters and what not, but it's kind
of sad and I wish I could take the burden of a slower experience just for
quality's sake.</p>
<h3><a href="#afterlight" aria-hidden="true" class="anchor" id="afterlight"></a>Afterlight</h3>
<p>Afterlight is a weird little one... it has excellent editing tools just like
VSCO, and doesn't downsize the full image. I don't really use it's full
potential, but I do really like to use its light leak tool to emulate old
tired film cameras. It can add a very nice splash of color or texture to an
otherwise low-energy composition.</p>
<h3><a href="#squareready" aria-hidden="true" class="anchor" id="squareready"></a>Squareready</h3>
<p>There are probably lots of little apps to do this... I just like to occasionally
preserve the 2:3 ratio of my compositions. Squareready adds little white bars
to the sides of the image to bring it to a square, so that instagram will
accept it.</p>
<h2><a href="#final-thoughts" aria-hidden="true" class="anchor" id="final-thoughts"></a>Final thoughts</h2>
<p>I've only been running this little system for about a month or so... but it's
been an absolute joy. With the exception of a couple really busy days, I've
had the opportunity to shoot nearly every day for weeks, and I while I don't
see the progress I want, I see where I am failing, and I'm working on it. I'm
shooting portraits, street, being a little more bold and a little more creative
with my time.</p>
<p>I hope that this inspires you to shoot more, even if it's just on your phone.
There are <em>phenomenal</em> photographers who shoot with only their phone... it's an
interesting exercise in itself. Get out there and make some pictures!</p> ]]></description>
    </item>
    <item>
       <title>The Heavenly Gift Tag</title>
       <link>http://evantravers.com/articles/2013/12/25/heavenly-gift-tag/</link>
       <pubDate>Wed, 25 Dec 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/12/25/heavenly-gift-tag/</guid>
       <description><![CDATA[ <blockquote>
<p>For unto you is born this day in the city of David a Savior, who is Christ the Lord... And suddenly there was with the angel a multitude of the heavenly host praising God and saying, (Luke 2:11, 13 ESV)</p>
</blockquote>
<p>When one picks a present for a loved one, the shopping and careful research brings joy. Concealing the chosen gift in beautiful wrapping paper can summon a smile as we imagine the look on our loved one's face when they discover and unwrap. The last and perhaps greatest joy is the reading of the tag and presentation of the gift, for the anticipation and joy meet at their highest point.</p>
<p>The tag and presentation for the Greatest Gift of all occurred two-thousand years ago on the rolling hillsides around Bethlehem. The angelic choirs proclaimed &quot;To: All mankind From: God&quot; to a bleary eyed and wondering group of shepherds, but even they could not fail to recognize the royal print on the wrapping paper and holy handwriting on the note.</p>
<p>Thank you, Heavenly Father, for the joy and surprise of the gift receiver is ours today and on every Christmas. Let our hearts be filled with warmth and true gratefulness in this season, and may we never set aside the desire for more of that Gospel joy until the day we celebrate in eternity with the Gift-Giver. May we glow with joy and praise as the angels did that night, and may your glory draw all men to yourself. In Jesus' name, amen.</p> ]]></description>
    </item>
    <item>
       <title>Lifting Up My Soul</title>
       <link>http://evantravers.com/articles/2013/12/24/lifting-up-my-soul/</link>
       <pubDate>Tue, 24 Dec 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/12/24/lifting-up-my-soul/</guid>
       <description><![CDATA[ <p><img src="http://farm4.staticflickr.com/3810/9470330469_427d6a522c_b.jpg" alt="Serenity" /></p>
<blockquote>
<p>Let me hear in the morning of your steadfast love, for in you I trust. Make me know the way I should go, for to you I lift up my soul. (Psalm 143:8 ESV)</p>
</blockquote>
<p>Jesus, this whole Psalm is the song of my heart today and encouragement to my soul. I feel downtrodden and alone, and am wondering where to turn. I feel condemned by my past failures, and am haunted by the ghosts of my sins. They gibber and scream in the corners of my mind, pointing ghastly fingers of accusation at me, dragging me into the pit with guilt and sorrow.</p>
<p>But I will not fall to this. I <em>will</em> like David think on your mighty deeds. I will make my mind dwell on the history of your grace throughout all time and your personal mercies to me and my family. How can I doubt such boundless and eternal love when it stretches throughout all of history and extends to giving of yourself for my salvation?</p>
<p>Do not hide your face from me. The more parched I am, the more I thirst for your goodness. Let me hear in the morning of your steadfast love. Let the first whisper of thought and word in my mind as I awake be “YOU ARE LOVED” and may I rest in this truth, putting to shame the enemies of my soul.</p>
<p>Image: <a href="http://www.flickr.com/photos/evantravers/9470330469/">Serenity</a> by <a href="http://www.flickr.com/photos/evantravers/">me</a></p> ]]></description>
    </item>
    <item>
       <title>A Fair Trade</title>
       <link>http://evantravers.com/articles/2013/11/06/a-fair-trade/</link>
       <pubDate>Wed, 06 Nov 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/11/06/a-fair-trade/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2013/11/terebinthia.jpg"></p><blockquote>
<p>And after you have suffered a little while, the God of all grace, who has called you to his eternal glory in Christ, will himself restore, confirm, strengthen, and establish you. (1 Peter 5:10)</p>
</blockquote>
<p>O Lord. Let this verse sink into my soul and take deep root in my thinking. This is the hope to which we were called. Thank you for calling us to yourself in Christ, that we might experience your love and grace. The troubles of this present life should be regarded as nothing compared to the surpassing glories described:</p>
<p>To be <em>restored</em> by you. O to be remade! To have all the sin, hurt, fear burned away and reforged into a new creation. When I bewail my current state of doublemindedness, when I feel the old and new man tugging at my mind, fighting for mastery, this verse will bring me courage. Restored is defined as “bringing back a previous state, to reinstate.” I will be made whole, without a touch of the old broken self. To walk with you in the new heavens and new earth, talking with you. Come quickly Lord.</p>
<p>To be <em>confirmed</em>. To be taken gently by the hand, and told that we are safe. There is no guarantee here in this brief and tumultous life, but this… this is a promise to which to look forward. To be confirmed is described as to be “firmly established in a particular habit, belief, or way of life and unlikely to change.” Hallelujah.</p>
<p>To be <em>strengthened</em>. To never again worry and doubt, or feel victimized and terrorized by sin within and without. To be buoyed up by the power and strength of our Savior, never to falter or fall again.</p>
<p>To be <em>established</em>. I love this one. To be established is to be “set up in a firm or permanent basis.” We are going to be in your glory for all eternity… what more firm or permanent basis can I ask for? Life may change, friends come and go, positions and jobs fall out from under my feet but my soul is established in you, now and forever.</p>
<p>I will take this trade, Lord. I will exchange the suffering for a short while for a permament, established, strengthened, perfect existence with you. Whisper this promise in my ear as I'm tempted to despair today. Allow me to live as one who has traded <em>everything</em> for this one, precious pearl, and not as one grasping for grip on a house made of sand. I pray this for myself, and for the ones I love in your precious name, amen.</p>
<p>Image: <a href="http://instagram.com/p/gGohz_jrdF/">Terebithia</a> by <a href="http://instagram.com/evantravers">me</a></p> ]]></description>
    </item>
    <item>
       <title>Empty Hands</title>
       <link>http://evantravers.com/articles/2013/10/16/empty-hands/</link>
       <pubDate>Wed, 16 Oct 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/10/16/empty-hands/</guid>
       <description><![CDATA[ <img src="http://farm8.staticflickr.com/7385/9935706866_f8d7553b82_b.jpg">
<blockquote>
<p>And his disciples answered him, “How can one feed these people with bread here in this desolate place?” And he asked them, “How many loaves do <em><strong>you</strong></em> have?” They said, “Seven.” And he directed the crowd to sit down on the ground. And he took the seven loaves, and having given thanks, he broke them and gave them to his disciples to set before the people; and they set them before the crowd. And they had a few small fish. And having blessed them, he said that these also should be set before them. And they ate and were satisfied. And they took up the broken pieces left over, seven baskets full.</p>
<p>(Mark 8:4-8 ESV, emphasis mine)</p>
</blockquote>
<p>Thank you that you are the great provider.  Thank you for reminding me in this story, that the options that show themselves to me are not all the options you hold. I may only have seven loaves, an impossibly small amount to fix the problems I'm faced with, but you are the infinite Bread of Life. May I look at my hands, realize that they are empty and powerless, and immediately look to your arms for provision and strength. I am nothing, you are everything. Teach me your way today, allow me to fear you and worship nothing or no one else.</p>
<p>Image: <a href="http://www.flickr.com/photos/evantravers/9935706866">Fall by evantravers</a></p> ]]></description>
    </item>
    <item>
       <title>True Awe</title>
       <link>http://evantravers.com/articles/2013/10/13/true-awe/</link>
       <pubDate>Sun, 13 Oct 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/10/13/true-awe/</guid>
       <description><![CDATA[ <img src="http://farm5.staticflickr.com/4142/4741860071_3110aaf431_b.jpg" alt="Climb Every Mountain">
<p>Holy, holy, holy, holy is the Lord God Almighty, who was, who is, and who is to come.</p>
<p>Forgive us Lord, for I fear we have lost the awe due the Lord of tempests, fjords, canyons, and quasars. Too often we allow our devotion to be constrained by the glorified conference rooms in which we worship. As the PowerPoint clicks to the next slide in the popular worship song we forget that the God we address from our comfortable office chair holds the world in His hands and propels the wind and sea with His voice.</p>
<img src="http://farm6.staticflickr.com/5294/5506310688_ab85b5b782_b.jpg" alt="Glory in the Rotunda">
<p>We forget that ancient man, confronted with your infinite nature and with your immense creation devoted his life and the life of his children's children to the building of cathedrals, temples, pagodas, and palaces dedicated to bloodthirsty false gods and demons. Yet we sit, smugly sipping our Starbucks, and wishing that the collection fund would go to better upholstery.</p>
<p>Forgive us. Forgive me.</p>
<p>I have forgotten that the night sky above my head is illumined by ten million nuclear explosions that you have named and carefully placed to speak your majesty until the day the universe ends. I do not call to mind the vast wastes of rock and tree that you have placed in perfect compositions to create landscapes of beauty that can only be captured and never reimagined by man. I overlook the wonder that is my own existence, that the simplest cells within my body are more perfectly engineered and crafted than the most extravagant robotic marvel of mankind.</p>
<p>In this democratic age, we remember what it is to serve a God of love and mercy, but we have forgotten what it is to fall down before the God of majesty and awe.</p>
<img src="http://farm4.staticflickr.com/3473/3262291513_ca1d5105ec_b.jpg" alt="Untitled">
<p>So capture our hearts. Let us peek behind the curtain and spy with shaking and terrified eyes the vast Crystal Sea, to hear the booming praise of the twenty four elders resonate in the murmuring throng of ten thousand redeemed souls from every tribe and tongue, worshipping ceaselessly as they honor The Lamb.</p>
<p>How can we sit in indolent and sleepy silence when our entire eternity is shaped by this one fact: that the Most High God reigns, and that He actually cares for and loves us.</p>
<img src="http://farm3.staticflickr.com/2842/9267511521_4e18024484_b.jpg" alt="Garden of Eden">
<p>Let the truth of your majesty pierce and take root in my heart. May my worship be deepened by my knowledge of how absolutely incomprehensible it is that one as great as you take notice of me and my needs. Glory be to your name.</p>
<p>All photos from my photostream, <a href="http://flickr.com/evantravers/">here</a>.</p> ]]></description>
    </item>
    <item>
       <title>Many Changes</title>
       <link>http://evantravers.com/articles/2013/10/01/many-changes/</link>
       <pubDate>Tue, 01 Oct 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/10/01/many-changes/</guid>
       <description><![CDATA[ <p>So many things have changed very quickly, I barely have time to catch up, or write a blog post.</p>
<p>I have left my position at Luckie, and after a brief stay at another advertising agency, I have parted ways with established business (for the time being) and have been freelancing for about a month now. It's been scary, exhilirating, and an amazing opportunity to trust the Lord with what happens next, because I have no idea what is going to happen next week.</p>
<p>But that's ok.</p>
<p>I'm open to suggestions for now. Barring a great position opening that grabs ahold of me, I'm going to continue working from home and freelancing where I can. If you know of a position, contract, or job that you think my very particular set of skills would be a great fit, <a href="/hire-me">hire me</a>.</p>
<p>Whatever happens, I'm just going to be grateful for the journey, and leave the destination up to God. I covet your prayers for wisdom and peace. If you see me lounging around town in some coffee shop, come over and say hello. I'd love to share what I'm learning in development and otherwise.</p> ]]></description>
    </item>
    <item>
       <title>A Prayer for Heart Surgery</title>
       <link>http://evantravers.com/articles/2013/08/18/a-prayer-for-heart-surgery/</link>
       <pubDate>Sun, 18 Aug 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/08/18/a-prayer-for-heart-surgery/</guid>
       <description><![CDATA[ <img src="http://farm3.staticflickr.com/2869/9463457435_757d219ae7_b.jpg" alt="Welcome to Narnia">
<p>Six months ago I prayed that you would tear out the veil of flesh in my heart, bringing my will, hopes, and dreams all under your control. Now, I find that while you have been good to your promise, I have not. I continually fight to maintain control of my precious toys.</p>
<p>Forgive my willfulness. Continue your work of regeneration, the act of cosmic surgery. It is painful, but the cancer in my heart must be removed.</p>
<p>So come Lord. Bring the scalpel of your truth to my soul and excise all the blackness, all the necrotic desires of my old self. Illuminate my life, show all the places where my deeds of self-worship have diseased my dreams and twisted the structure of the man you want to make. Scrape, sever, sear, and suture every last bit of me away so that only you remain.</p>
<p>Give me the willingness to go under the knife <em>every</em> single morning, and grant me the patience as you put me through spiritual rehab. You are the great Physician, your hand is true and your knowledge of our workings is perfect as our Creator and Father. You knit me together, heart and soul, now unmake me and make me like Christ. I pray in Jesus' precious and powerful name, amen.</p>
<p>Photo: <a href="http://www.flickr.com/photos/evantravers/9463457435/" title="Welcome to Narnia by evantravers, on Flickr">Welcome to Narnia</a></p> ]]></description>
    </item>
    <item>
       <title>Journaling Prayer</title>
       <link>http://evantravers.com/articles/2013/08/17/prayer-journal/</link>
       <pubDate>Sat, 17 Aug 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/08/17/prayer-journal/</guid>
       <description><![CDATA[ <img src="http://farm6.staticflickr.com/5466/9406761163_5a1aa1a898_b.jpg" alt="Let it flow.">
<p>For some time now, I have added to my morning devotions the exercise of writing a prayer. It was born out of a need for focus, as the act of composition and recording brings together all my faculties towards a single task. I'm writing, I'm thinking, I'm planning. It is so easy for me to become distracted in the morning, when all the day's needs and tasks <a href="http://www.goodreads.com/quotes/257733-it-comes-the-very-moment-you-wake-up-each-morning">rush at me</a>. Journaling has been a real blessing.</p>
<p>It has the benefit of providing a record of my heart's state, a history of the concerns I have lifted to the Lord, a bitter reminder of the pain of sin, the sweet restoration of repentance, and of the glory of seeing the Lord work in my life despite me.</p>
<p>Up to this point, I have decided not to publish, share, or otherwise show people parts of this journal. I feared that knowing that other people might read it would taint the personal, raw, often painfully honest conversation I have had with the Lord. However, I realized tonight that it might be an encouragement, as I have often been mightily encouraged by <a href="http://thegospelcoalition.org/blogs/scottysmith/">Scotty Smith's blog</a>.</p>
<p>With this goal in mind, I'm going to publish a few of them as I go... probably quite a while after I originally wrote them, and with any truly personal details excised. I hope they are some comfort to you, and perhaps will inspire you to try a similar discipline in your relationship with the Lord.</p>
<p>Photo credits: <a href="http://www.flickr.com/photos/evantravers/9406761163/" title="Let it flow. by evantravers, on Flickr">Let it flow - by evan travers</a></p> ]]></description>
    </item>
    <item>
       <title>Open My Eyes</title>
       <link>http://evantravers.com/articles/2013/07/25/open-my-eyes/</link>
       <pubDate>Thu, 25 Jul 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/07/25/open-my-eyes/</guid>
       <description><![CDATA[ <img src="http://farm3.staticflickr.com/2817/9366004982_50df55c6d5_b.jpg" alt="I go on forever.">
<p>Open the eyes of my heart Lord. I want to see. To truly see.</p>
<p>I know that if my eyes would truly see I would see the vast legions of angels, like Elijah's servant. I would also see that their martial array is dwarfed by your might.</p>
<p>I would see your careful artistry planning and outlining every beautiful thing in this world, placing it into place, lighting it just so and giving us a wink as we suddenly catch a moment of absolute beauty in your creation. Thank you for those reminders of your mastery.</p>
<p>I would see into history and see the magnificent tapestry of all that has been and the threads drawing together towards the End of the weaving. I would see each tangled thread struggling for selfish purposes unknowingly and purposefully knit into the skein of time towards your ends, and I would know that your victory and glory is sure.</p>
<p>I would see your compassion and love for us, as you intercede and move on our behalf. I would wince in the brightness of the eternal moment of glory that awaits, away from pain and fear, united with you. A wedding feast of immense proportions, and ever-increasing joy.</p>
<p>So open the eyes of my heart Lord. I would have seep deep into my soul the joy, the trust, the love that you give me. I would it pervade my life so that when the petty brambles of this world seek to entangle I am clear-sighted and able to perceive the way you would have me walk in despite my situation. Take some mud. Clean my eyes. Let the scales drop away and may I behold your face.</p>
<p>If you are interested in the photo, you can read more about how I took it and where on <a href="http://www.flickr.com/photos/evantravers/9366004982/">my flickr</a>.</p> ]]></description>
    </item>
    <item>
       <title>Feeling quiet...</title>
       <link>http://evantravers.com/articles/2013/05/15/feeling-quiet/</link>
       <pubDate>Wed, 15 May 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/05/15/feeling-quiet/</guid>
       <description><![CDATA[ <p><img alt="" src="https://images.evantravers.com/articles/2013/05/mt_cook.jpg"></p><p>Sorry I have been dark for a while... I have recently returned from a marvelous trip to New Zealand for two weeks and have been spending a lot of time catching up and getting my discipline back in order. If you are interested in seeing pictures like the above one, you can check out a few of them <a href="http://www.500px.com/evantravers/sets/new_zealand_trip">here</a>. I'll try and continue to update, but I've fallen behind in editing and I'm thinking about switching back to <a href="http://flickr.com/evantravers">flickr</a>.</p>
<p>I haven't had the urge to tweet or blog recently because I have been doing a lot of journaling and personal writing these days. It's been refreshing to write for myself and not think about what others think... I highly recommend it. I will try to post more often. Since my short-term-thought-recording itch is being scratched by journaling I would like to post some more long form articles, yet they take too long to perfect. I just get caught up in tinkering with the blog's internals and don't post anything thoughtful.</p>
<p>Well that's enough blogging about blogging. Hopefully I'll return soon with one of my half formed ideas I have in the queue.</p> ]]></description>
    </item>
    <item>
       <title>What a difference a couple of years makes...</title>
       <link>http://evantravers.com/articles/2013/03/12/website-changes/</link>
       <pubDate>Tue, 12 Mar 2013 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2013/03/12/website-changes/</guid>
       <description><![CDATA[ <p>Seven to be precise.</p>
<p>While trolling through my archives... I came on the first real website I ever made for myself, honest to goodness, using a real professional tool: Microsoft Frontpage! (How was I ever so blind!)</p>
<p><img src="https://images.evantravers.com/articles/2013/03/12/widgetwebworks.png" alt="my old site" /></p>
<p>It can be really useful to have retrospectives like this one. They help me realize how far I have come, and how far I have to go. They say that some sharks will drown unless they keep moving forward... I suppose the same is true of learning.</p>
<p>And for those who would like to smile at my youthful web-related endeavors, here are a couple more gems.</p>
<ul data-orbit>
  <li>
    <figure>
    <img src="https://images.evantravers.com/articles/2013/03/12/foundations.png" alt="2005" />
    <figcaption>This one is from 2005! Complete with stolen stock photos!</figcaption></figure>
  </li>
  <li>
    <figure>
    <img src="https://images.evantravers.com/articles/2013/03/12/turninghearts.png" alt="turninghearts" />
    <figcaption>A site I did for my dad's ministry... notice the state of the art aliased curves there. Classy.</figcaption></figure>
  </li>
  <li>
    <figure>
    <img src="https://images.evantravers.com/articles/2013/03/12/oldsite.png" alt="bio" />
    <figcaption>Bonus: a very, very youthful and hopeful Evan.</figcaption></figure>
  </li>
</ul>
<p>Pretty amusing stuff. While you are looking around, take a look at my updated <a href="/work">work page</a>... it finally includes more than a few kitten pictures.</p> ]]></description>
    </item>
    <item>
       <title>Walking Away From Rage</title>
       <link>http://evantravers.com/articles/2012/10/30/walking-away-from-rage/</link>
       <pubDate>Tue, 30 Oct 2012 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2012/10/30/walking-away-from-rage/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2012/10/30/walking-away.jpg" alt="walking away from rage" /></p>
<p>A long time ago, I decided I wouldn't talk about anything controversial on the Internet, whether it was a review of some entertainment, or an intense discussion of some point of doctrine. It was out of fear and not wanting to deal with the angry repercussions.</p>
<p>Not very long ago, I renewed that vow. This time, out of fear of myself.</p>
<p>As I finally conquered my fear of talking about my opinions, I discovered the pleasure of intelligent and thoughtful discourse. I enjoyed learning that a clever turn of phrase or metaphor can make people laugh thoughtfully. I also (unfortunately) gained a taste for the thrill of passion as conflicting views reveal themselves. And I discovered that I enjoyed causing this.</p>
<p>There is a pleasure in getting angry, at being right. We teach ourselves to enjoy, to treasure the feeling of standing up and stamping our feet down. It's a thing that I have felt in the past, and continue to battle. People <em>practice</em> soapboxing. It's a long-standing American tradition, and one I'd rather do away with. </p>
<p>I was recently watching a bunch of five to seven year olds playing. While the younger ones (by no means selfless or perfect,) played happily, the older ones practiced being angry and aping their older sibling's choicest insults and comebacks. You could see the impish glee creeping around the corners of their mouths after they successfully reproduced the fiery statements they were copying… it tasted sticky sweet with sin. It was the saddest sight I have seen all year.</p>
<p>That childlike discovery of the raw energy that comes with anger doesn't go away. It just has been refined and reformed. Instead of playmates, it becomes far far easier to spew our venom on the faceless, formless foe that floats out in the internet. We wound through blogs, slanted tweets and back-biting text messages. We (especially as Christians) have cultured and tailored our communication online to &quot;deal with important things,&quot; and have come to ignore and downright sneer at anyone who might disagree with us on our interpretation of a book, movie, or sermon.</p>
<p>God forbid someone who would vote differently.</p>
<p>Of course, the tragedy of that is that internet rage has the potential to be even more damaging and harmful. You don't know who on your friends list is suffering from a porn addiction, or going through marriage troubles, or is sincerely and desperately grappling with depression. I'm personally not willing to trip up those poor souls in the slightest just to gratify my chest-beating self-righteous ego.</p>
<p>The apostle Paul had some brothers in the Lord who were struggling with whether it was sinful to eat meat sacrificed to idols. In response, he <a href="https://www.esv.org/verses/1Corinthians8:13">was willing to forgo *any* meat</a>. Should we not also be willing to give up arguing about minor points in order that we don't cause others to stumble as they seek the Gospel? There are important things to discuss in this world. And we should. But we should guard our hearts against the slow and terrible burn of anger, and not mistake inordinate passion for righteous anger. Jesus got angry, yes. But he flipped tables, not fingers.</p>
<p>If you meet me in a coffee shop or at my home, I will gladly talk with you about hard, difficult, &quot;controversial&quot; things. At this point though, I don't trust my ability to write to convey my heart safely to your screen. It's so easy for my meaning to be lost in translation, or in a retweet, reblog, or comment. I'd rather you be able to look into my eyes and hopefully see the spirit in which I speak.</p>
<p>Is it possible to talk and write passionately about important things with a clean and calm heart? I say yes. Read C.S. Lewis. G.K. Chesterton. A.W. Tozer. They were so in love with their Savior that they were constantly careful in the way they conveyed themselves, as to be <a href="https://www.esv.org/verses/Matthew10:16">winsome</a> to anyone who was listening. I would like to communicate like those men. Clever without sarcasm. Potent without anger. Wisdom with humbleness.</p>
<p>And so I shall endeavor to keep myself to this. There will be things I will rail against on the internet. Hopefully the Lord (and my beloved proofreader and mother) will restrain me from doing any brother or sister in Christ any harm. I hope you will also consider weighing carefully the way you talk and write, and guard your heart carefully against the thrill that comes with false righteous anger.</p> ]]></description>
    </item>
    <item>
       <title>Workflow Part One: Blocking</title>
       <link>http://evantravers.com/articles/2012/10/15/workflow-part-one-blocking/</link>
       <pubDate>Mon, 15 Oct 2012 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2012/10/15/workflow-part-one-blocking/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2012/10/15/slammed.png" alt="feeling slammed?" /></p>
<p>One of the most agonizing parts of anyone's workday is the inevitable question: What should I do next? I think more of my time has seeped into that never ending hole than I have ever spent working on any one thing. I used to labor hard over multitasking, GTD systems, and organizational schemes to try to solve this problem, but ultimately I've come to believe that the foundational trick to being productive is complete focus on the correct thing. Of course, that still leaves us with the monumentally difficult task of choosing the right thing to be working on.</p>
<p>When I was in school, I would hurdle this step by choosing what seemed to be a simple and arbitrary pattern of work: I would work on homework in the order that I had the classes in the day. It was just an unconscious decision, but it took away a lot of subconscious headache, because rather than being overwhelmed by being faced with six pieces of work, I knew which one I needed to tackle next and could focus purely on that.</p>
<p>This sort of workflow pattern works great when you are flying solo. Homework just depended on me working on it. It almost never depended on someone else's response to my work, or any form of collaboration. As soon as you start working with other people, a whole different set of considerations sets in. You may want to work on this project, and it might be your next priority, but now you are waiting on feedback, or your tester to publish results. You start seeing tasks being blocked because they are waiting on some external influence to proceed.</p>
<p>(This next section here is a bit nerdy, so you can (read, should) skip it if you'd like.)</p>
<p>As I was mulling over this problem one day, I realized it <a href="http://oreilly.com/catalog/linuxkernel/chapter/ch10.html">reminded me of something</a>. The Linux kernel has a very similar problem: all processes on the computer require some I/O (file writing/reading) and CPU (thinking) time. All processes are weighted to needing either more CPU or more I/O, and these are characterized as either being CPU bound or I/O bound respectively. The problem that the computer faces is that I/O bound problems will &quot;block&quot;, or wait for the file request to come back, immediately. If you bring up an I/O bound process, and force it to stay on the processor, it will waste time as it makes a long winded, time-expensive request to the file system, while idling on the CPU preventing other problems from being worked on during the wait.</p>
<p>The solution the Linux kernel adopts is to track which processes are I/O bound and which are processor bound, and adjust their priority so that the <em>I/O bound processes come first</em>. They will immediately block, send off a request for I/O, and allow the processor to be freed up for working on more tasks.</p>
<p>Still here? Lets talk about productivity.</p>
<p>This idea can be directly translated to your workflow. <strong>Prioritize things that will &quot;block&quot; immediately</strong>, so that they are off your plate, allowing you to move forward and give you that burst of morale. This also is considerate to anyone who depends on you, because they become aware of what you need from them immediately. Now you can be freed up to work on things that require longer, more personal focus. Tasks that can be blocking are usually some form of communication with someone else: any email, request for information or approval, phone calls, new designs. You'll be surprised at how much time you'll free up and how productive you'll feel if you knock out all the ones that require some sort of external influence at the beginning of you day, so that you have the rest of the day free to concentrate on things that rest only on you.</p>
<p>All of this really just comes down to the oft-repeated, never-heeded advice of taking care of the &quot;<a href="http://www.csub.edu/tlc/options/resources/handouts/teach_strat/putinrocks.html">big rocks first</a>.&quot; Choosing to work on items that will block soon is just a strategy to help you manage (prioritize) those boulder sized rocks first, by removing distractions and tasks that get in the way of your productive workflow.</p> ]]></description>
    </item>
    <item>
       <title>Dying by Inches</title>
       <link>http://evantravers.com/articles/2012/09/24/dying-by-inches/</link>
       <pubDate>Mon, 24 Sep 2012 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2012/09/24/dying-by-inches/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2012/09/24/grave-of-time.jpg" alt="dying by inches" /></p>
<blockquote>
<p>Romans 8:13:
For if you live according to the flesh you will die, but if by the Spirit you put to death the deeds of the body, you will live.</p>
</blockquote>
<p>I continue to be fascinated by the stories of heroism and suffering contained in the book Jesus Freaks, and its spiritual ancestor, Fox's Book of Martyrs. These pages are filled with the gripping and tragic tales of persecuted believers, and their glorious and gory ends. Men drenched in oil and lit as human candles to light gardens. Young girls shot in cold blood because they would not spit on the Bible. Women and children, holding hands and singing hymns to the Creator while being slowly crushed under the giant roller of a construction machine. I think that beyond the magnificent stories of faith under trial, the gruesome details of those saints' death speak to us of a real, physical peace that we daily desire and wish to call our own. A man who says he loves God above all else is rare. A man who says he loves God above all else as he is torn limb from limb is clearly empowered by the God he worships.</p>
<img src="https://images.evantravers.com/articles/2012/09/24/martyr.png" class="left" alt="Thomas Hawkes">
<p>One of my favorite stories in Fox's Book of Martyrs is the tale of <a href="http://books.google.com/books?id=aCRMAAAAYAAJ&amp;lpg=PA284&amp;ots=NpU9k9Vqkf&amp;dq=thomas%20hawkes%20martyr&amp;pg=PA284#v=onepage&amp;q&amp;f=false">Thomas Hawkes</a>. Thomas Hawkes, while preparing for his execution, was approached by his friends who desperately wanted to know if the &quot;rage of pain&quot; was made bearable through God's help. They requested that he raise his hands to heaven, in the midst of his death. A short time after, he was led to his stake, and the flames were kindled. His skin was burning away, and the spectators thought he was dead, when &quot;this eminent and zealous servant of God... held his hands flaming over his head, and as if in an ecstasy of joy, clapped them thrice together.&quot;</p>
<p>It is a gritty, teeth-clenching look at faith, and two things usually rise in me each time I re-read this tale. On the one hand, I question whether I would be able to do the same in similar circumstances. On the other, I find with myself the fervent and morbid desire to die quickly and never know such suffering.</p>
<p>The convicting and terrible irony of this situation is that we as Christians are called to the same heroic faith in our daily lives as these revered saints. No matter how I wish for a quick and painless death at the end of my allotted time on earth, I am called to slowly kill my sinful self by inches every single day.  (<a href="https://www.esv.org/verses/Colossians3:5">Colossians 3:5</a>)</p>
<p>As a boy, I would often imagine situations where I could risk life and limb to save my family in some outlandish and deadly situation, and wonder how would I react. When I grew older, I realized that given a life or death crisis, I could probably give my life easily for my parents and siblings. What brings me great pain now, is that I refuse to give my life for them each and every day. Every time I put off cleaning a room so that my comforts are met, every time I lose my temper over an irritating noise a sibling is making, every time I prioritize my own time over my family's, I'm effectively staring down the gun of my own sinful self's desires and refusing to make that sacrifice. One thousand times a day, I face the same sort of decision that is given to the heroes I read about and idolize, and I fail.</p>
<p>For the heroes in Fox's Book of Martyrs, their story in this world has ended. They have finished the race, and received their reward. The task that remains for you and me is to spend this next day well. We have another few hours, another encounter with our fears, another struggle with our selfishness to contend with as we strive toward living up to that cloud of witnesses. Our story is not yet over. We have another chance to raise our hands in joy that the watching world may yet know that through the flames and woes of this life, our Lord provides grace to endure all things through His power. (<a href="https://www.esv.org/verses/2Corinthians12:9">2 Corinthians 12:9</a>) Be encouraged. The flames do not last forever, but through God's strength, you may yet leave an example to stand for many years to come.</p> ]]></description>
    </item>
    <item>
       <title>Tmux Tips</title>
       <link>http://evantravers.com/articles/2012/08/11/tmux-tricks/</link>
       <pubDate>Sat, 11 Aug 2012 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2012/08/11/tmux-tricks/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2012/08/11/terminal.png" alt="my tmux setup" /></p>
<p>Tmux has three levels of hierarchy when it comes to organizing views: Sessions,
windows, and panes. Sessions are groups of windows, and a window is a layout of
panes. Windows and panes are to a certain degree interchangeable as we will
see, but sessions are fairly immutable. I use sessions to separate workspaces,
almost like the spaces in osx. Windows and panes I use as is convenient.</p>
<p>I recently have been digging into some of the neater features in tmux's layout
system, and here's what I've come up with to help me work harder better faster
stronger.</p>
<p>A couple notes: I have set the tmux key to be <code>ctrl-g</code>, but you can use
whatever you want. For the course of this article, I will use <code>tmux+[whatever]</code>
to avoid confusion when describing tmux shortcuts. My tmux config can be found
<a href="https://github.com/evantravers/polka/blob/master/.tmux.osx.conf">here</a>, and
there are some other theme settings
<a href="https://github.com/evantravers/polka/blob/master/.tmux.conf.local">here</a>. When
I refer to starting the tmux console, I mean keying in <code>tmux-:</code>. Never forget
that you always have access to your current shortcuts by typing <code>tmux-?</code>.</p>
<h2><a href="#sessions" aria-hidden="true" class="anchor" id="sessions"></a>sessions</h2>
<p>Because I tend to isolate projects to a single session, allowing me to have a
complete context switch when needed, I tend to name them the project I am
working on, and force their default folder to the project folder. You can
switch between sessions using <code>tmux-s</code>, rename them using <code>tmux-$</code>, and set
their default folder by running <code>tmux set default-folder $(pwd)</code> inside the
session. This last command means that any split or new window inside that
session opens in your current folder, which is handy for making a split so you
can run a rake task or a script console for your rails project.</p>
<p>I got tired of doing this every time I made a context switch, so I <a href="https://github.com/evantravers/polka/blob/master/bin/tspace">wrote a
little script</a> to
do this for me. Super simple, every time I need a new session now I simply
<code>tmux-:</code> to get the tmux console, type <code>:new</code>, then <code>cd</code> to the folder I need,
and run <code>tspace</code> to name it after the project and set the folder defaults.</p>
<h2><a href="#windows" aria-hidden="true" class="anchor" id="windows"></a>windows</h2>
<p>Windows in tmux have a name, and a sort number. They live in the bar at the
bottom of the screen, ordered by their sort number. You can refer to them in
tmux by name or number, which is kind of handy. By default, <code>tmux-,</code> is rename
window, <code>tmux-.</code> is move window, and <code>tmux-[number key]</code> lets you jump around
your first ten windows. I used to think that move window only let you set a new
order number for your window, but I have since learned that you can pass
windows between sessions fairly easily using the <code>[session]:[window]</code> syntax.</p>
<p>If I want to move a window containing my irc session (named irssi) from my
current session <code>foo</code> to the new context session I've created (<code>bar</code>), I can
either invoke the console and type out <code>:move-window</code> or type <code>tmux-.</code> to get
the same thing, then pass the argument <code>bar:irssi</code>. By default, tmux accepts
your current window as the argument, but you can move a window you are not
currently on by using the <code>-t -s</code> arguments to specify the target and source of
the move.</p>
<p>So I've been juggling my irc channel around for a couple of months, before I
stumbled on <code>link-window</code>. If you invoke the tmux console, type in link-window,
and you can share a window between two sessions, using the same target/source
syntax as move. That means I can have the same shell, or the same program
shared between multiple sessions. No more juggling the irc window, I can simply
have it everywhere.</p>
<h2><a href="#panes" aria-hidden="true" class="anchor" id="panes"></a>panes</h2>
<p>Splits are usually the reason people find tmux in the first place, as the
version of GNU screen that OSX ships with doesn't do vertical splits for some
unknown reason. Horizontal splits are <code>tmux-&quot;</code>, and vertical are <code>tmux-%</code>. You
can rotate your splits around using <code>tmux-space</code>, though I've never found a
good use for it. More useful is the select layout options available by using
<code>tmux-[meta+1-5]</code> options, letting you select a variety of layouts. I tend to
keep things fairly simple w/ only one or two splits, so I haven't dived heavily
into this yet.</p>
<p>Of course, moving between panes is usually <code>tmux-[arrow-key]</code>, but in <a href="https://github.com/evantravers/polka/blob/master/.tmux.osx.conf">my polka
config</a> I've
set it to the vim keybindings, naturally.</p>
<p>One neat trick you can do, is pulling a window into your current setup as a
pane using <code>join-pane</code>. Once again using that cryptic -t/-s syntax, you can do
some useful things with it. One example I use occasionally is pulling in the
window containing the rails server into my dev window so I can access the
<code>binding.pry</code> session for debugging. For this, I would use <code>join-pane -t 1</code>
(assuming it's number is 1, I could also use it's name). I can even yank it
from another session using the <code>[session]:[number|pane]</code> syntax. When I'm done,
and I want this pane to go back to being another window, you can use
<code>break-pane</code> to break the pane back out to being a window.</p>
<h2><a href="#final-thoughts" aria-hidden="true" class="anchor" id="final-thoughts"></a>final thoughts</h2>
<p>Because all the tmux commands are also available in the console, and because
everything you type in the tmux console is also available by running <code>tmux [command]</code> in your terminal, you can script out workspaces and split setups.
I'm considering writing a script to set up my splits and windows for a rails
project the way I like them, and building perhaps an argument into the tspace
script for different layouts. As with all your tools in the command line, think
about what you do constantly over and over again, and consider how could script
that into being one step. These tools are powerful not because you can use the
keyboard instead of a mouse, they are powerful because you can combine them in
new ways.</p>
<p>I've also been playing around with <a href="https://github.com/zolrath/wemux/">wemux</a>,
which is a nice little wrapper on top of tmux to allow remote pairing using
tmux. It's pretty nice, and if you like doing pair programming in your office I
recommend  you check it out.</p>
<p>If you have any questions, or any amazing tips you'd like to add to this post,
hit me up on twitter at <a href="http://twitter.com/evantravers">@evantravers</a>. Please
let me know if this was helpful, and if some of these tricks help you focus on
your work as you make amazing things.</p> ]]></description>
    </item>
    <item>
       <title>Hello, world</title>
       <link>http://evantravers.com/articles/2012/07/16/hello-world/</link>
       <pubDate>Mon, 16 Jul 2012 00:00:00 UTC</pubDate>
       <guid>http://evantravers.com/articles/2012/07/16/hello-world/</guid>
       <description><![CDATA[ <p><img src="https://images.evantravers.com/articles/2012/07/16/welcome.jpg" alt="welcome!" /></p>
<p>So I have finally manned up and rebuilt my blog. Being a front end designer, I felt kind of embarrased that I was still using a blogger theme I set up quite a long time ago.</p>
<p>Added to that, I have a little more time post-graduation, so I thought I'd do some writing and sharing with others, I've been taught a lot over the past few years, and it's time to give back.</p>
<p>Over the years, I've set up more than my fair share of blogs, all on different topics, all on different domains. I was afraid of scaring off my photography friends with code posts, and my programmer friends with posts on life, and so on. I've decided to consolidate my writing, and let the chips fall where they may. If you miss any of the old sites, they are still in existence in the <a href="/links/">links page</a>.</p>
<p>Plus I just enjoy ranting on the internet.</p>
<p>So hang on to your hats, and get ready for a blast of new posts on subjects ranging from programming to productivity, from art to ascii. I've had quite a few posts brewing in drafts for some time, and just didn't feel like posting while my main site was in such disarray.</p>
<p>My plan is to hopefully post more often, have some more code to show and new things. My first series of posts will likely be quick posts summing up my experience building this site with all these neat tools, and explaining why you should (or shouldn't) use them. Or maybe I'll try and explain aperture settings, or define art. Who knows.</p> ]]></description>
    </item>
  </channel>
</rss>
