<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>me.micahrl.com blog</title>
    <link>https://com.micahrl.me/blog/</link>
    
    <description>My very own place to post</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 10 Apr 2026 11:30:48 +0000</lastBuildDate>
    <atom:link href="https://com.micahrl.me/blog/rss.xml" rel="self" type="application/rss+xml" />

    
    <item>
      <title>Color HTML Ghostty transcripts</title>
      <link>https://com.micahrl.me/blog/color-html-ghostty-transcripts/</link>
      <pubDate>Fri, 10 Apr 2026 06:24:49 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/color-html-ghostty-transcripts/</guid>
      <description>
&lt;p&gt;With Ghostty, all I need to do to get a realistic transcript of a shell session
is select and copy, extract the HTML source with
&lt;a href=&#34;https://github.com/mrled/dhd/blob/master/opt/bin/pbpaste-htmlsrc&#34; rel=&#34;external&#34;&gt;pbpaste-htmlsrc&lt;/a&gt;,
and reference it on this site with a Hugo shortcode.&lt;/p&gt;
&lt;p&gt;As I learned &lt;a href=&#34;https://com.micahrl.me/til/transformed-html-clipboard/&#34;&gt;previously&lt;/a&gt;,
the macOS clipboard can hold more than one version of the same content.&lt;/p&gt;

&lt;details &gt;
  &lt;summary&gt;Examples&lt;/summary&gt;
  &lt;p&gt;Text copied from the built-in Terminal contains:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; osascript -e &amp;#39;Tell app &amp;#34;Finder&amp;#34; to clipboard info&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;«class RTF », 1272, «class utf8», 259, «class ut16», 512, string, 66, Unicode text, 510
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And text from Ghostty contains:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; osascript -e &amp;#39;Tell app &amp;#34;Finder&amp;#34; to clipboard info&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;«class utf8», 356, «class HTML», 638, «class ut16», 714, string, 356, Unicode text, 712
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;Ghostty specifically includes HTML content in the data it provides to the pasteboard.
When pasting HTML pasteboard content,
the result is formatted text with hyperlinks, bold, italics, and so on.
&lt;code&gt;pbpaste-htmlsrc&lt;/code&gt; gets the HTML source code for that formatted text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# step 1: select text in a Ghostty window, and copy it with cmd-c. Then:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pbpaste-htmlsrc &amp;gt; transcript.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And it makes for nice embedding in a Hugo site:&lt;/p&gt;
&lt;div class=&#34;ghostty-transcript&#34;&gt;&lt;div style=&#34;font-family: monospace; white-space: pre;&#34;&gt;Last login: Wed Apr  8 13:54:21 on ttys003
&lt;div style=&#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&#34;&gt;13:57:48&lt;/div&gt; E0 &lt;div style=&#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&#34;&gt;Orocroix&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(0, 251, 172);&#34;&gt;~&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&#34;&gt;&amp;#8756;&lt;/div&gt; whoami
micahrl
&lt;div style=&#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&#34;&gt;13:57:59&lt;/div&gt; E0 &lt;div style=&#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&#34;&gt;Orocroix&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(0, 251, 172);&#34;&gt;~&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&#34;&gt;&amp;#8756;&lt;/div&gt; hostname
Orocroix.local
&lt;div style=&#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&#34;&gt;13:58:02&lt;/div&gt; E0 &lt;div style=&#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&#34;&gt;Orocroix&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(0, 251, 172);&#34;&gt;~&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&#34;&gt;&amp;#8756;&lt;/div&gt; ping naragua   
PING naragua.banded-goblin.ts.net (100.112.192.27): 56 data bytes
64 bytes from 100.112.192.27: icmp_seq=0 ttl=64 time=87.343 ms
64 bytes from 100.112.192.27: icmp_seq=1 ttl=64 time=87.167 ms
64 bytes from 100.112.192.27: icmp_seq=2 ttl=64 time=88.772 ms
^C
--- naragua.banded-goblin.ts.net ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 87.167/87.761/88.772/0.719 ms
&lt;div style=&#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&#34;&gt;13:58:14&lt;/div&gt; E0 &lt;div style=&#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&#34;&gt;Orocroix&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(0, 251, 172);&#34;&gt;~&lt;/div&gt; &lt;div style=&#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&#34;&gt;&amp;#8756;&lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I use a shortcode for this and some CSS to clean it up:&lt;/p&gt;

&lt;details &gt;
  &lt;summary&gt;HTML contents of transcript.html&lt;/summary&gt;
  &lt;p&gt;Here&amp;rsquo;s the raw HTML that it produces:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;font-family: monospace; white-space: pre;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Last login: Wed Apr  8 13:54:21 on ttys003
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;13:57:48&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; E0 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Orocroix&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 251, 172);&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;~&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;ni&#34;&gt;&amp;amp;#8756;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; whoami
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;micahrl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;13:57:59&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; E0 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Orocroix&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 251, 172);&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;~&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;ni&#34;&gt;&amp;amp;#8756;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; hostname
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Orocroix.local
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;13:58:02&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; E0 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Orocroix&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 251, 172);&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;~&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;ni&#34;&gt;&amp;amp;#8756;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; ping naragua   
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PING naragua.banded-goblin.ts.net (100.112.192.27): 56 data bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64 bytes from 100.112.192.27: icmp_seq=0 ttl=64 time=87.343 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64 bytes from 100.112.192.27: icmp_seq=1 ttl=64 time=87.167 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64 bytes from 100.112.192.27: icmp_seq=2 ttl=64 time=88.772 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;^C
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- naragua.banded-goblin.ts.net ping statistics ---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3 packets transmitted, 3 packets received, 0.0% packet loss
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;round-trip min/avg/max/stddev = 87.167/87.761/88.772/0.719 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(255, 255, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;13:58:14&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; E0 &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 191, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Orocroix&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(0, 251, 172);&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;~&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;display: inline;color: rgb(223, 149, 255);font-weight: bold;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;ni&#34;&gt;&amp;amp;#8756;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I use a shortcode like this to include it on this page:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go-html-template&#34; data-lang=&#34;go-html-template&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;{{-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$filename&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Join&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Dir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Page.File.Path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;.Get&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;ghostty-transcript&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;cp&#34;&gt;{{-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$filename&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;safeHTML&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;-}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ghostty apparently doesn&amp;rsquo;t copy an &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; wrapper element or anything else, which we would have to strip,
but it also doesn&amp;rsquo;t copy the primary foreground and background colors.
I&amp;rsquo;m currently using the &lt;a href=&#34;https://ghostty-style.vercel.app/config/cyberpunk&#34; rel=&#34;external&#34;&gt;Cyberpunk&lt;/a&gt; theme,
so I specify its foreground and background colors in the CSS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;ghostty-transcript&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#e5e5e5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;background-color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#332a57&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;overflow-x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.8125&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;em&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;I&amp;rsquo;m using this weekly at work to retain logs of what I&amp;rsquo;ve done on production hosts&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,
because my work planner and notebok is actually just an intranet Hugo site.
It&amp;rsquo;s made a real difference:
in one instance something went wrong with one of my changes,
and someone was able to find the problem based on the transcript I shared.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;oh my god yes I am trying so hard to get configuration into a repo so I can stop opening shells on live production boxes&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/color-html-ghostty-transcripts/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>A fortunate birthday</title>
      <link>https://com.micahrl.me/blog/fortunate-birthday/</link>
      <pubDate>Sun, 05 Apr 2026 09:28:30 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/fortunate-birthday/</guid>
      <description>
&lt;p&gt;Two weeks ago, I threw my forty-first birthday party.&lt;/p&gt;
&lt;img src=&#34;./invitation_redacted.png&#34; alt=&#34;The party invitation&#34; /&gt;
&lt;p&gt;Invitation by &lt;span class=&#34;nym-mauibabe&#34;&gt;A&lt;/span&gt; and Rachel.&lt;/p&gt;
&lt;h2 id=&#34;party-cookies&#34;&gt;Party cookies&lt;/h2&gt;
&lt;p&gt;I really wanted to make fortune cookies from scratch,
and the rest of the party kind of fell out from that.
Over a decade ago on a now-defunct &lt;a href=&#34;https://web.archive.org/web/20201101021308/http://glukkake.me/&#34; rel=&#34;external&#34;&gt;blog&lt;/a&gt;,
I had seen someone &lt;a href=&#34;https://com.micahrl.me/warchive/20141022-000000-glukkake-2014-fortune-cookies-crowns/&#34;&gt;do this&lt;/a&gt;
for a New Year&amp;rsquo;s Eve party,
and it has rolled around in my head ever since.&lt;/p&gt;
&lt;p&gt;Hannah and I used &lt;a href=&#34;https://www.fifteenspatulas.com/fortune-cookies/&#34; rel=&#34;external&#34;&gt;this recipe&lt;/a&gt;,
which turned out to be more forgiving than I expected.
You do have to limit yourself to batches of about three at a time,
but with one extra person you can double that to six,
and we got through ~35 cookies pretty quickly this way.
Putting the fortunes in is easy.&lt;/p&gt;
&lt;p&gt;I want to make these again, maybe collaboratively,
where everyone is asked to bring a fortune,
we make the cookies all together,
and send everyone home with a bit of enchanted entropy.&lt;/p&gt;
&lt;p&gt;Atlas helped make the batter, and he was very annoyed that we had to wait to eat the &amp;ldquo;party cookies&amp;rdquo;,
which he now talks about every few days.
(YOU WANT TO EAT PARTY COOKIES AND CINNAMON ROLLS, he tells me.)&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies1_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies1_processed_small.avif&#34;
    alt=&#34;cookies1_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies2_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies2_processed_small.avif&#34;
    alt=&#34;cookies2_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies3_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/cookies3_processed_small.avif&#34;
    alt=&#34;cookies3_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fortunes&#34;&gt;Fortunes&lt;/h2&gt;
&lt;p&gt;I wrote them myself.
I like the creepy ones the most.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What are you avoiding?&lt;/li&gt;
&lt;li&gt;What you&amp;rsquo;re looking for is —OH MY GOD IT&amp;rsquo;S RIGHT BEHIND YOU&lt;/li&gt;
&lt;li&gt;Your disgust is holding you back&lt;/li&gt;
&lt;li&gt;A lifetime of happiness lies ahead of you (in bed)&lt;/li&gt;
&lt;li&gt;What painful experience do you think everyone should have?&lt;/li&gt;
&lt;li&gt;You need to change your mind about something important&lt;/li&gt;
&lt;li&gt;You will soon question a decision you made five minutes before&lt;/li&gt;
&lt;li&gt;That prophecy about you was technically correct&lt;/li&gt;
&lt;li&gt;Be vaguely afraid&lt;/li&gt;
&lt;li&gt;If you see something suspicious, say something suspicious&lt;/li&gt;
&lt;li&gt;If you see something, say nothing&lt;/li&gt;
&lt;li&gt;You were right to be suspicious&lt;/li&gt;
&lt;li&gt;You will understand too late&lt;/li&gt;
&lt;li&gt;By the time you see it, it won&amp;rsquo;t have been the first sign&lt;/li&gt;
&lt;li&gt;What are you not looking at?&lt;/li&gt;
&lt;li&gt;You keep changing the subject&lt;/li&gt;
&lt;li&gt;Do you actually believe that explanation?&lt;/li&gt;
&lt;li&gt;You didn&amp;rsquo;t understand the first message and you won&amp;rsquo;t understand this one either&lt;/li&gt;
&lt;li&gt;Trapped in joke factory, send fortune cookies&lt;/li&gt;
&lt;li&gt;The self is less coherent than it feels; it&amp;rsquo;s freeing to acknowledge this&lt;/li&gt;
&lt;li&gt;There is nothing new under the sun, but there&amp;rsquo;s a chance at novelty on the other side of it&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t worry about that blank spot in your vision, if you even notice it&lt;/li&gt;
&lt;li&gt;Be careful of what you eat&lt;/li&gt;
&lt;li&gt;A stranger will enter your life; I suggest you lock your doors&lt;/li&gt;
&lt;li&gt;Future historians will argue about the date of your birth&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t actually need another sign&lt;/li&gt;
&lt;li&gt;That thing you&amp;rsquo;re so sure of — are you?&lt;/li&gt;
&lt;li&gt;It was only funny the first time&lt;/li&gt;
&lt;/ul&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/fortunes1_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/fortunes1_processed_small.avif&#34;
    alt=&#34;fortunes1_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/fortunes2_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/fortunes2_processed_small.avif&#34;
    alt=&#34;fortunes2_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;divination&#34;&gt;Divination&lt;/h2&gt;
&lt;p&gt;We got a tarot card reader to come for a couple of hours.
These were my cards.
My interpretation is kept secret but you are free to draw your own conclusions.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/cards_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/fortunate-birthday/cards_processed_small.avif&#34;
    alt=&#34;cards_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;food&#34;&gt;Food&lt;/h2&gt;
&lt;p&gt;Home-made &lt;a href=&#34;https://thewoksoflife.com/chinese-bbq-pork-cha-siu/&#34; rel=&#34;external&#34;&gt;char-siu pork&lt;/a&gt;,
rice, Thai noodles and peanut sauce
(which Atlas called &amp;ldquo;peanut butter spaghetti&amp;rdquo;),
loads of frozen apps,
a mai tai from &lt;a href=&#34;https://www.ndled.us&#34; rel=&#34;external&#34;&gt;Noah&lt;/a&gt; and a lion&amp;rsquo;s tail from &lt;a href=&#34;https://me.jowj.net&#34; rel=&#34;external&#34;&gt;Josiah&lt;/a&gt;.
A huge feast.
I made about 6.5lbs of pork and I am pleased to report that we ate every last bite of it.&lt;/p&gt;
&lt;!--GUIDELINES

1.  Publish before it&#39;s polished.

    &gt; Oh, I forgot to mention: lower your standards!
    &gt; Waiting until a piece feels as good as you can get it
    &gt; is a recipe for an empty blog and a huge folder full of drafts
    &gt;
    &gt; I try to hit publish while I am still unhappy with what I’ve written

    -- [Simon Willison](https://bsky.app/profile/simonwillison.net/post/3leuudyabks27)

2.  Write for a particular kind of person in mind.

    &gt; Define the kind of person that your writing is for in advance.
    &gt; And then write only for them.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

3.  Do one level of homework

    Take a few minutes to think about the immediate next question,
    and add that to the post too.
    But only do one level of this to avoid distraction.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/fortunate-birthday/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>kubectl, tmux, and local network permissions</title>
      <link>https://com.micahrl.me/blog/kubectl-tmux-local-network-permissions/</link>
      <pubDate>Sun, 22 Mar 2026 14:28:27 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/kubectl-tmux-local-network-permissions/</guid>
      <description>
&lt;p&gt;This week I was working on a Kubernetes cluster from my Mac.
I discovered that while &lt;code&gt;kubectl&lt;/code&gt; worked fine in a regular terminal,
if I ran it inside &lt;code&gt;tmux&lt;/code&gt; it would tell me there was &lt;code&gt;no route to host&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot with a &lt;code&gt;tmux&lt;/code&gt; session in the top pane, and a bare shell in the bottom pane:&lt;/p&gt;
&lt;img src=&#34;./kubectl-tmux-failure.png&#34; alt=&#34;Screenshot of a terminal with two panes, each of which show the kubernetes API endpoint, routes related to that endpoing, and that curl can query it, but the top pane running tmux shows a &#39;no route to host&#39; error from kubectl, while the bottom panel shows a successful response from kubectl&#34; /&gt;
&lt;!--

Commands to run in each:

```sh
kubectl config view --minify -o jsonpath=&#39;{.clusters[0].cluster.server}&#39;
netstat -rn | grep 192.168.1.25
curl -k https://192.168.1.25:6443/
kubectl get nodes
```

With output:

```
14:11:18 E0 Naragua ~ ∴ kubectl config view --minify -o jsonpath=&#39;{.clusters[0].cluster.server}&#39;
https://192.168.1.25:6443%
14:11:25 E0 Naragua ~ ∴ netstat -rn | grep 192.168.1.25
192.168.1.25       98:b7:85:21:db:c9  UHLWI                 en1    988
192.168.1.25       98:b7:85:21:db:c9  UHLWIi                en0   1149
192.168.1.255      ff:ff:ff:ff:ff:ff  UHLWbI                en0      !
14:11:32 E0 Naragua ~ ∴ curl -k https://192.168.1.25:6443/
{
  &#34;kind&#34;: &#34;Status&#34;,
  &#34;apiVersion&#34;: &#34;v1&#34;,
  &#34;metadata&#34;: {},
  &#34;status&#34;: &#34;Failure&#34;,
  &#34;message&#34;: &#34;Unauthorized&#34;,
  &#34;reason&#34;: &#34;Unauthorized&#34;,
  &#34;code&#34;: 401
}%                                                                                                               14:11:38 E0 Naragua ~ ∴ kubectl get nodes
Unable to connect to the server: dial tcp 192.168.1.25:6443: connect: no route to host
```
--&gt;
&lt;p&gt;This screenshot is of Ghostty, but the behavior was the same in Terminal.app.&lt;/p&gt;
&lt;p&gt;This &lt;a href=&#34;https://colosieve.com/posts/fixing-tmux-local-network-privacy-macos/&#34; rel=&#34;external&#34;&gt;appears&lt;/a&gt;
to be an issue related to code signing on macOS.&lt;/p&gt;
&lt;h2 id=&#34;workarounds&#34;&gt;Workarounds&lt;/h2&gt;
&lt;p&gt;As colosieve describes above,
you can build &lt;code&gt;tmux&lt;/code&gt; from source and codesign it yourself
(which also implies eschewing Homebrew&amp;rsquo;s automatic updates).&lt;/p&gt;
&lt;p&gt;What I chose to do instead was access the service over Tailscale.
My node was already on Tailscale, so this didn&amp;rsquo;t cost me anything.
I changed the server address from the &lt;code&gt;https://192.168.1.25:6443&lt;/code&gt; you see in the above screenshot
to its Tailscale address and it started working just fine.&lt;/p&gt;
&lt;img src=&#34;./kubectl-tmux-success.png&#34; alt=&#34;Screenshot of the same terminal as before, but with the kubernetes API endpoint set to https://100.86.119.112:6443, and a successful result from kubectl in the tmux pane&#34; /&gt;
&lt;p&gt;Apparently the system doesn&amp;rsquo;t see Tailscale addresses as &amp;ldquo;local&amp;rdquo; network addresses,
so it doesn&amp;rsquo;t get in the way.&lt;/p&gt;
&lt;h2 id=&#34;poorly-thought-out-design&#34;&gt;Poorly thought-out design&lt;/h2&gt;
&lt;p&gt;This whole scenario suffers from insufficient care from Apple.&lt;/p&gt;
&lt;p&gt;First, the error message &lt;code&gt;no route to host&lt;/code&gt; is a lie.
It ought to transparently say what is happening so that the user knows what to do next.
People all over the Internet are confused about this,
for &lt;a href=&#34;https://stackoverflow.com/questions/52619828/kubernetes-no-route-to-host&#34; rel=&#34;external&#34;&gt;example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Second, there are no escape hatches for the user &amp;mdash;
there is no way to simply make an exception.
Unlike Full Disk Access, the Local Network screen in macOS Settings under Privacy &amp;amp; Security has no &lt;code&gt;+&lt;/code&gt; button.&lt;/p&gt;
&lt;img src=&#34;./local-network-settings.png&#34; alt=&#34;Screenshot of the Local Network Settings page on my machine&#34; /&gt;
&lt;p&gt;Third, the security boundary being the local network is clearly not very good,
since I can bypass it by adding a VPN.
Arguably things over a VPN are on average &lt;em&gt;more&lt;/em&gt; sensitive than whatever is on my local network.
What kind of sense does it make to design a sandbox that prevents local network access but not VPN access?&lt;/p&gt;
&lt;p&gt;Fourth, I assume Apple has really smart people working really hard on this, blah blah blah,
and maybe they know something about the threat model that I haven&amp;rsquo;t considered when writing this blog post through gritted teeth.
Well, in that case, it would be really nice if they communicated about it,
maybe in a way that I could find when I bump my shin on it in the middle of the night!
If the right answer really is to prevent this kind of thing by default
(setting aside the inability to make an exception),
is it too much to ask they make the case for it?&lt;/p&gt;
&lt;p&gt;My guess is that this behavior is defense in depth on a network with badly configured devices;
this probably prevents some bottom-of-the-barrel malware from adding routers with default admin/admin credentials to a botnet.
But this drives home the need for the user to make an exception.
My case with Kubernetes is clearly different,
because I trust the software I&amp;rsquo;m running (both &lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;tmux&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This is worse than an inconvenient &amp;ldquo;are you sure?&amp;rdquo; dialog box,
both in that its effect size is large (hours this week, for me)
and in that the workarounds are not general solutions.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.erikhorton.com/2025/01/18/kubectl-no-route-to-host.html&#34; rel=&#34;external&#34;&gt;Kubectl no route to host // Erik Horton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ghostty-org/ghostty/discussions/2998#discussioncomment-14564644&#34; rel=&#34;external&#34;&gt;Network connections like &lt;code&gt;ssh&lt;/code&gt; within &lt;code&gt;tmux&lt;/code&gt; are broken after updating Ghostty · ghostty-org ghostty · Discussion #2998&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://colosieve.com/posts/fixing-tmux-local-network-privacy-macos/&#34; rel=&#34;external&#34;&gt;Fixing tmux Local Network Access on macOS | Colonel&amp;rsquo;s Pensieve&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;miscellaneous-troubleshooting-notes&#34;&gt;Miscellaneous troubleshooting notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; inside of &lt;code&gt;screen&lt;/code&gt; and &lt;code&gt;zellij&lt;/code&gt; works fine too, it&amp;rsquo;s only &lt;code&gt;tmux&lt;/code&gt; that I was having a problem with.
&lt;code&gt;screen&lt;/code&gt; ships with macOS, so that makes sense,
but I don&amp;rsquo;t understand why &lt;code&gt;zellij&lt;/code&gt; doesn&amp;rsquo;t hit the same problem,
since as far as I could tell my copy installed from homebrew is not codesigned either.&lt;/li&gt;
&lt;li&gt;I tried turning my Tailscale connection off, but this didn&amp;rsquo;t affect the behavior.&lt;/li&gt;
&lt;li&gt;The shell environment vars are identical in and out of &lt;code&gt;tmux&lt;/code&gt; &amp;mdash; nothing weird happening in one or the other.&lt;/li&gt;
&lt;li&gt;I tried running a Bonjour command (&lt;code&gt;dns-sd -B _http._tcp&lt;/code&gt;) within &lt;code&gt;tmux&lt;/code&gt;
to see if that would trigger a request to add &lt;code&gt;tmux&lt;/code&gt; to the list of exceptions in &amp;ldquo;Local Network&amp;rdquo; &amp;mdash;
no dice, and it worked just fine without being blocked.&lt;/li&gt;
&lt;li&gt;I tried creating a launchd agent that starts a tmux session in the background to see if that would trigger a request &amp;mdash; also no.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--GUIDELINES

1.  Publish before it&#39;s polished.

    &gt; Oh, I forgot to mention: lower your standards!
    &gt; Waiting until a piece feels as good as you can get it
    &gt; is a recipe for an empty blog and a huge folder full of drafts
    &gt;
    &gt; I try to hit publish while I am still unhappy with what I’ve written

    -- [Simon Willison](https://bsky.app/profile/simonwillison.net/post/3leuudyabks27)

2.  Write for a particular kind of person in mind.

    &gt; Define the kind of person that your writing is for in advance.
    &gt; And then write only for them.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

3.  Do one level of homework

    Take a few minutes to think about the immediate next question,
    and add that to the post too.
    But only do one level of this to avoid distraction.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/kubectl-tmux-local-network-permissions/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>A club for symmetrical DNS names</title>
      <link>https://com.micahrl.me/blog/club-for-symmetrical-dns/</link>
      <pubDate>Mon, 16 Mar 2026 21:50:27 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/club-for-symmetrical-dns/</guid>
      <description>
&lt;p&gt;I have a &lt;a href=&#34;https://com.micahrl.me/blog/through-the-looking-glass/&#34;&gt;demonstrated&lt;/a&gt;
interest in symmetrical DNS names.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Symmetrical&amp;rdquo; could mean &lt;a href=&#34;https://zq.suns.bz/symmetries/&#34; rel=&#34;external&#34;&gt;several&lt;/a&gt; things.
Maybe a single name that is a palindrome, like if you owned &lt;code&gt;elpmaxe.www.example&lt;/code&gt;.
Maybe a pair of names that have reversed components,
like if you owned &lt;code&gt;example.institute&lt;/code&gt; and &lt;code&gt;institute.example&lt;/code&gt;.
Or maybe URLs that can be cut in half and flipped 180°,
like &lt;a href=&#34;https://zq.suns.bz//:sd%CA%87%CA%87%C9%A5&#34; rel=&#34;external&#34;&gt;https://zq.suns.bz//:sdʇʇɥ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With this interest,
an unhealthy predilection to stay up late typing things into porkbun &amp;ldquo;just to see&amp;rdquo;,
and the extremely flimsy justification that
it would be fun to build all this on AWS and use
&lt;a href=&#34;https://gohugo.io/host-and-deploy/deploy-with-hugo-deploy/&#34; rel=&#34;external&#34;&gt;hugo deploy&lt;/a&gt;
instead of a full-fat static site host like Netlify,
I found myself in possession of &lt;a href=&#34;https://zq.suns.bz//:sd%CA%87%CA%87%C9%A5&#34; rel=&#34;external&#34;&gt;suns.bz&lt;/a&gt;.
I set about building a tiny system that receives POST requests,
validates DNS entries, and records validated entries.
A club with membership, in other words.&lt;/p&gt;
&lt;p&gt;I have some &lt;a href=&#34;https://zq.suns.bz/ideas/&#34; rel=&#34;external&#34;&gt;ideas&lt;/a&gt; for the future,
like maybe a web ring,
or a game inspired by &lt;a href=&#34;https://ipv4.games/&#34; rel=&#34;external&#34;&gt;https://ipv4.games/&lt;/a&gt;.
Contributions are welcome.&lt;/p&gt;
&lt;p&gt;Do you also have an interest in symmetrical names?
Do you control a DNS zone?
In that case, please &lt;a href=&#34;https://zq.suns.bz/join/&#34; rel=&#34;external&#34;&gt;join&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://news.ycombinator.com/item?id=47411309&#34; rel=&#34;external&#34;&gt;Discuss on HN&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/club-for-symmetrical-dns/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>SSH, tmux, and agent forwarding</title>
      <link>https://com.micahrl.me/blog/ssh-tmux-agent/</link>
      <pubDate>Sat, 14 Mar 2026 11:15:35 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/ssh-tmux-agent/</guid>
      <description>
&lt;p&gt;By default, using the same tmux session from multiple ssh sessions
breaks agent forwarding.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s why:
When tmux starts, it inherits the environment.
By default, that environment is fixed.
ssh sets some environment variables, like &lt;code&gt;SSH_CONNECTION&lt;/code&gt; and,
if you forwarded an agent, &lt;code&gt;SSH_AUTH_SOCK&lt;/code&gt;,
but those will only work properly on &lt;em&gt;the ssh connection that started the tmux session&lt;/em&gt;.
Connecting to the same tmux session later over a new ssh connection
will use the values from the &lt;em&gt;original&lt;/em&gt; ssh connection,
so they&amp;rsquo;ll be out of date.
Trying to use the same session from both a local terminal and an ssh connection will have the same problem.&lt;/p&gt;
&lt;p&gt;Furthermore, if we are using ssh to connect &lt;em&gt;out&lt;/em&gt; from tmux
(for instance, pulling git repos inside of the tmux session),
we&amp;rsquo;d like to use a local agent if our session is local&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,
but a forwarded agent if one is available from an ssh connection.&lt;/p&gt;
&lt;p&gt;To fix these issues, we need to do two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configure the shell to update tmux&amp;rsquo;s environment on every prompt&lt;/li&gt;
&lt;li&gt;Configure ssh to only use a local agent from a non-ssh connection
(which we have already done &lt;a href=&#34;https://com.micahrl.me/blog/use-1password-ssh-agent-conditionally/&#34;&gt;previously&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;my-configuration&#34;&gt;My configuration&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what I do in my &lt;code&gt;.zshrc&lt;/code&gt; to configure zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zsh&#34; data-lang=&#34;zsh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tmux_update_environment&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TMUX&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; -z &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TMUX_NO_UPDATE_ENVIRONMENT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;tmux show-environment -s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;preexec_functions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=(&lt;/span&gt;tmux_update_environment&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here&amp;rsquo;s how I set &lt;code&gt;~/.ssh/config&lt;/code&gt; to use the 1Password agent only if it&amp;rsquo;s not being run over an ssh connection:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Host *
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  Match exec &amp;#34;test -z $SSH_CONNECTION&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    IdentityAgent &amp;#34;~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adapt this to your shell and preferred local agent,
and&lt;/p&gt;
&lt;h2 id=&#34;technical-details&#34;&gt;Technical details&lt;/h2&gt;
&lt;p&gt;This works well for me.
It&amp;rsquo;s worth going into some technical detail here
as there are some tradeoffs and you may prefer to make some different ones.&lt;/p&gt;
&lt;h3 id=&#34;tmux-environment&#34;&gt;tmux environment&lt;/h3&gt;
&lt;p&gt;I pull in everything that &lt;code&gt;tmux show-environment -s&lt;/code&gt; returns.
For me right now on tmux 3.5a on macOS, the result of that command is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; DISPLAY&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; KRB5CCNAME&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; SSH_AGENT_PID&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; SSH_ASKPASS&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SSH_AUTH_SOCK&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/private/tmp/com.apple.launchd.gxn88S3JmK/Listeners&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; SSH_AUTH_SOCK&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; SSH_CONNECTION&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; WINDOWID&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; XAUTHORITY&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a curated set of environment vars that tmux tracks for each session.
(It&amp;rsquo;s clearly not the entire environment from when it was started,
but you can see that with &lt;code&gt;tmux show-environment -g&lt;/code&gt; if you want.)
All of them may change as you connect to tmux sessions from different environments.&lt;/p&gt;
&lt;p&gt;Setting them in the zsh &lt;code&gt;preexec_functions&lt;/code&gt; list means that these will get overwritten
after hitting enter but before the command is run.
Setting any of those variables on the command line will get overwritten immediately with no notice.
This might be confusing!&lt;/p&gt;
&lt;p&gt;That said, you can work around it as long as you remember to do so.
I add a check for &lt;code&gt;TMUX_NO_UPDATE_ENVIRONMENT&lt;/code&gt; so that I can disable this behavior in a given shell session if necessary.&lt;/p&gt;
&lt;p&gt;If you want this behavior on only some of these, you can always filter the list.&lt;/p&gt;
&lt;h3 id=&#34;zsh-hook-functions&#34;&gt;zsh hook functions&lt;/h3&gt;
&lt;p&gt;You could set this in &lt;code&gt;precmd_functions&lt;/code&gt; instead.
As &lt;a href=&#34;https://zsh.sourceforge.io/Doc/Release/Functions.html#Hook-Functions&#34; rel=&#34;external&#34;&gt;the docs&lt;/a&gt; say,
&lt;code&gt;precmd&lt;/code&gt; is executed before each prompt;
&lt;code&gt;preexec&lt;/code&gt; is executed just after a command has been read from the user, but before it is executed.&lt;/p&gt;
&lt;h3 id=&#34;ssh-configuration&#34;&gt;SSH configuration&lt;/h3&gt;
&lt;p&gt;The SSH configuration is a bit tricky.
As I discovered &lt;a href=&#34;https://com.micahrl.me/blog/use-1password-ssh-agent-conditionally/&#34;&gt;last time&lt;/a&gt;,
it&amp;rsquo;s impossible to quote that &lt;code&gt;SSH_CONNECTION&lt;/code&gt; variable correctly,
but it works just fine if you don&amp;rsquo;t quote it at all.
It can do &lt;code&gt;Match&lt;/code&gt; lines like that,
but it doesn&amp;rsquo;t do environment or tilde expansion in the IdentityAgent setting,
so you must hard-code the absolute path.&lt;/p&gt;
&lt;p&gt;Also, previously I used &lt;code&gt;SSH_TTY&lt;/code&gt;, which works fine for interactive sessions,
but &lt;code&gt;SSH_CONNECTION&lt;/code&gt; is set even for noninteractive sessions,
and using it instead lets this work properly when doing something like&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh me@mac-mini.local sh -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;cd ~/some-repo; git pull;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Agents like 1Password or those that require using TouchID or a YubiKey will just hang if you attempt to use them over an SSH connection, which is not a great experience.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/ssh-tmux-agent/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Naming nonconsensual AI clones</title>
      <link>https://com.micahrl.me/blog/nonconsensual-ai-clones/</link>
      <pubDate>Fri, 13 Mar 2026 07:35:15 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/nonconsensual-ai-clones/</guid>
      <description>
&lt;p&gt;Superhuman, &lt;a href=&#34;https://www.grammarly.com/blog/company/introducing-new-superhuman/&#34; rel=&#34;external&#34;&gt;née Grammarly&lt;/a&gt;, is getting
&lt;a href=&#34;https://www.wired.com/story/grammarly-is-facing-a-class-action-lawsuit-over-its-ai-expert-review-feature/&#34; rel=&#34;external&#34;&gt;sued&lt;/a&gt; (paywall)
for putting the names of living professionals on output from an AI system which they called &amp;ldquo;Expert Review&amp;rdquo;.
I first saw this on &lt;a href=&#34;https://pxlnv.com/linklog/grammarly-expert-review/&#34; rel=&#34;external&#34;&gt;Pixel Envy&lt;/a&gt;,
which links to Platformer:&lt;/p&gt;
&lt;figure class=&#34;quotefig nocheck&#34;&gt;
  &lt;blockquote cite=&#34;https://www.platformer.news/grammarly-expert-review-reviewed/&#34;&gt;
On Friday I learned to my surprise that I had become an editor for Grammarly. The subscription-based writing assistant has introduced a feature named “&lt;a href=&#34;https://support.grammarly.com/hc/en-us/articles/38552366848781-Grammarly-Expert-Review-user-guide&#34;&gt;expert review&lt;/a&gt;” that, in the company’s words, “is designed to take your writing to the next level — with insights from leading professionals, authors, and subject-matter experts.”
&lt;p&gt;Read a little further, though, and you’ll learn that these “insights” are not actually “from” leading professionals, or any human person at all. Rather, they are AI-generated text, which may or may not reflect whichever “leading professional” Grammarly slapped their names on.&lt;/p&gt;
&lt;p&gt;“References to experts in Expert Review are for informational purposes only and do not indicate any affiliation with Grammarly or endorsement by those individuals or entities,” reads a disclaimer a few hundred words down the support page.&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    &lt;a href=&#34;https://www.platformer.news/grammarly-expert-review-reviewed/&#34;&gt;Grammarly turned me into an AI editor against my will and I hate it&lt;/a&gt;, Platformer
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&#34;side-by-side&#34;&gt;
&lt;a class=&#34;no-link-underline no-link-hover&#34; href=&#34;./TheLastCommand.webp&#34;&gt;
  &lt;img height=150 src=&#34;./TheLastCommand.webp&#34; alt=&#34;The Last Command by Timothy Zahn book cover&#34; /&gt;
&lt;/a&gt;
&lt;p&gt;I wasn&amp;rsquo;t able to check if the feature offered advice from visionary writer Timothy Zahn
because it was already &lt;a href=&#34;https://www.linkedin.com/posts/shishirmehrotra_back-in-august-we-launched-a-grammarly-agent-activity-7437552603737059328-vzTe/&#34; rel=&#34;external&#34;&gt;shut down&lt;/a&gt;
by the time I got around to looking at this.
I suspect not, however, because Zahn offered the perfect solution to all this backlash back in 1993,
in the form of Luuke Skywalker.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As the delightfully-named unofficial fan encyclopedia explains:&lt;/p&gt;
&lt;figure class=&#34;quotefig nocheck&#34;&gt;
  &lt;blockquote cite=&#34;https://starwars.fandom.com/wiki/Luuke_Skywalker/&#34;&gt;
&lt;b&gt;Luuke Skywalker&lt;/b&gt; was a genetic &lt;a href=&#34;https://starwars.fandom.com/wiki/Cloning/Legends&#34; title=&#34;Cloning/Legends&#34;&gt;clone&lt;/a&gt; of the &lt;a href=&#34;https://starwars.fandom.com/wiki/Jedi_Knight/Legends&#34; title=&#34;Jedi Knight/Legends&#34;&gt;Jedi Knight&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Luke_Skywalker/Legends&#34; title=&#34;Luke Skywalker/Legends&#34;&gt;Luke Skywalker&lt;/a&gt;, grown from cells extracted from the hand Skywalker lost during his &lt;a href=&#34;https://starwars.fandom.com/wiki/Duel_on_Cloud_City/Legends&#34; title=&#34;Duel on Cloud City/Legends&#34;&gt;duel&lt;/a&gt; with the &lt;a href=&#34;https://starwars.fandom.com/wiki/Dark_Lord_of_the_Sith/Legends&#34; title=&#34;Dark Lord of the Sith/Legends&#34;&gt;Dark Lord&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Anakin_Skywalker/Legends&#34; title=&#34;Anakin Skywalker/Legends&#34;&gt;Darth Vader&lt;/a&gt; on &lt;a href=&#34;https://starwars.fandom.com/wiki/Cloud_City/Legends&#34; title=&#34;Cloud City/Legends&#34;&gt;Cloud City&lt;/a&gt;. Skywalker&#39;s hand and &lt;a href=&#34;https://starwars.fandom.com/wiki/Anakin_Skywalker%27s_second_lightsaber/Legends&#34; title=&#34;Anakin Skywalker&#39;s second lightsaber/Legends&#34;&gt;lightsaber&lt;/a&gt; were recovered by Vader and taken to &lt;a href=&#34;https://starwars.fandom.com/wiki/Galactic_Emperor/Legends&#34; title=&#34;Galactic Emperor/Legends&#34;&gt;Emperor&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Palpatine/Legends&#34; title=&#34;Palpatine/Legends&#34;&gt;Palpatine&#39;s&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Mount_Tantiss/Legends&#34; title=&#34;Mount Tantiss/Legends&#34;&gt;Mount Tantiss&lt;/a&gt; storehouse on the &lt;a href=&#34;https://starwars.fandom.com/wiki/Planet/Legends&#34; title=&#34;Planet/Legends&#34;&gt;planet&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Wayland/Legends&#34; title=&#34;Wayland/Legends&#34;&gt;Wayland&lt;/a&gt;. In &lt;a href=&#34;https://starwars.fandom.com/wiki/9_ABY/Legends&#34; title=&#34;9 ABY/Legends&#34;&gt;9 ABY&lt;/a&gt;, the &lt;a href=&#34;https://starwars.fandom.com/wiki/Clone_madness&#34; title=&#34;Clone madness&#34;&gt;insane clone&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Jedi_Master/Legends&#34; title=&#34;Jedi Master/Legends&#34;&gt;Jedi Master&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Joruus_C%27baoth&#34; title=&#34;Joruus C&#39;baoth&#34;&gt;Joruus C&#39;baoth&lt;/a&gt; performed a &lt;a href=&#34;https://starwars.fandom.com/wiki/Mind_trick/Legends&#34; title=&#34;Mind trick/Legends&#34;&gt;mind trick&lt;/a&gt; on &lt;a href=&#34;https://starwars.fandom.com/wiki/Galactic_Empire/Legends&#34; title=&#34;Galactic Empire/Legends&#34;&gt;Imperial&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Grand_Admiral/Legends&#34; title=&#34;Grand Admiral/Legends&#34;&gt;Grand Admiral&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Mitth%27raw%27nuruodo/Legends&#34; title=&#34;Mitth&#39;raw&#39;nuruodo/Legends&#34;&gt;Thrawn&#39;s&lt;/a&gt; subordinate, &lt;a href=&#34;https://starwars.fandom.com/wiki/Captain/Legends&#34; title=&#34;Captain/Legends&#34;&gt;Captain&lt;/a&gt; &lt;a href=&#34;https://starwars.fandom.com/wiki/Gilad_Pellaeon/Legends&#34; title=&#34;Gilad Pellaeon/Legends&#34;&gt;Gilad Pellaeon&lt;/a&gt;, ordering him to make a special clone for him. The clone that later became Luuke Skywalker was grown in secret from &lt;a href=&#34;https://starwars.fandom.com/wiki/Sample_B-2332-54&#34; title=&#34;Sample B-2332-54&#34;&gt;sample B-2332-54&lt;/a&gt;, the sorting code assigned to Luke Skywalker&#39;s hand. The clone was grown in a &lt;a href=&#34;https://starwars.fandom.com/wiki/Spaarti_cloning_cylinder&#34; title=&#34;Spaarti cloning cylinder&#34;&gt;Spaarti cloning cylinder&lt;/a&gt; over the period of less than a &lt;a href=&#34;https://starwars.fandom.com/wiki/Standard_month/Legends&#34; title=&#34;Standard month/Legends&#34;&gt;month&lt;/a&gt;. When he was ready, the clone was given &lt;a href=&#34;https://starwars.fandom.com/wiki/Jedi_training/Legends&#34; title=&#34;Jedi training/Legends&#34;&gt;Jedi training&lt;/a&gt; by C&#39;baoth and over time became little more than an extension of C&#39;baoth&#39;s will.
&lt;/body&gt;&lt;/html&gt;
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    &lt;a href=&#34;https://starwars.fandom.com/wiki/Luuke_Skywalker/&#34;&gt;Luuke Skywalker&lt;/a&gt;, Wookiepedia
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Luuke was a clone of the more famous Luke Skywalker, with whom the reader may already be familiar.
He is so-named by Joruus C&amp;rsquo;baoth,
who was himself a clone of the just-as-famous Jorus C&amp;rsquo;baoth.&lt;/p&gt;
&lt;p&gt;Why the double-u?
Dedicated Force historian /u/Snivythesnek explains:&lt;/p&gt;
&lt;figure class=&#34;quotefig nocheck&#34;&gt;
  &lt;blockquote cite=&#34;https://www.reddit.com/r/CharacterRant/comments/1bwn9ol/luuke_skywalker_did_nothing_wrong_and_i_am_his/&#34;&gt;
 2. Why &#34;Luuke&#34;?
&lt;p&gt;Luuke Skywalker is a clone. A spaarti clone, to be exact. Spaarti clones were fast growing and unstable clones that were prone to madness (especially the cloned Force users, it seems). A personality quirk of Spaarti clones who thought of themselves as the person they were cloned from seems to be that they cannot actually pronounce their own name. In the Thrawn trilogy, this shows itself as the mad Jedi clone, and one of the main villains of the story, Joruus C&amp;rsquo;Baoth drawing out the &amp;ldquo;u&amp;rdquo; from the name of his themplate Jorus C&amp;rsquo;Baoth. Said clone also named Luuke. That&amp;rsquo;s how the name even came to be.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    &lt;a href=&#34;https://www.reddit.com/r/CharacterRant/comments/1bwn9ol/luuke_skywalker_did_nothing_wrong_and_i_am_his/&#34;&gt; Luuke Skywalker did nothing wrong and I am his strongest soldier.&lt;/a&gt; Posted to r/CharacterRant on Reddit.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This useful &amp;ldquo;personality quirk&amp;rdquo; is a perfect solution to Grammarly&amp;rsquo;s problem.
Here are Spaarti clone names of all of the experts whose names were on Grammarly AI reviews in the Platformer piece:&lt;/p&gt;
&lt;div class=&#34;nocheck&#34;&gt;
&lt;ul&gt;
&lt;li&gt;Caasey Newton&lt;/li&gt;
&lt;li&gt;Steephen King&lt;/li&gt;
&lt;li&gt;Neeil deGrasse Tyson&lt;/li&gt;
&lt;li&gt;Caarl Sagan&lt;/li&gt;
&lt;li&gt;Shooshana Zuboff&lt;/li&gt;
&lt;li&gt;Claaire Wardle&lt;/li&gt;
&lt;li&gt;Joohn Carreyrou&lt;/li&gt;
&lt;li&gt;Kaara Swisher&lt;/li&gt;
&lt;li&gt;Tiimnit Gebru&lt;/li&gt;
&lt;li&gt;Juulia Angwin&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s perfectly transparent to any well-read user what&amp;rsquo;s happening,
and completely clear legally.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://waxy.org/2011/12/no_copyright_intended/&#34; rel=&#34;external&#34;&gt;No copyright intended&lt;/a&gt;, as they say.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/nonconsensual-ai-clones/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Fuck the safety briefing</title>
      <link>https://com.micahrl.me/blog/fuck-the-safety-briefing/</link>
      <pubDate>Sat, 07 Mar 2026 20:11:02 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/fuck-the-safety-briefing/</guid>
      <description>
&lt;p&gt;I bring my own entertainment on airplanes:
I download movies,
copy them to my phone,
and test that audio and subtitles work correctly
the day before a flight.&lt;/p&gt;
&lt;p&gt;For a business trip on Wednesday, my movie was &lt;em&gt;Johnny Mnemonic: In Black and White&lt;/em&gt;.
It was great!&lt;/p&gt;
&lt;video controls preload=&#34;metadata&#34; style=&#34;max-width:100%; height:auto;&#34;&gt;
  &lt;source src=&#34;heaven.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not support the video tag;
  &lt;a href=&#34;heaven.mp4&#34;&gt;download&lt;/a&gt; the video instead.
&lt;/video&gt;
&lt;p&gt;I thought the B&amp;amp;W was a real upgrade over the original.
It reinforces the retrofuture of a story written in 1981 and set in 2021.
Wikipedia notes:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://en.wikipedia.org/wiki/Johnny_Mnemonic_%28film%29#Johnny_Mnemonic:_In_Black_and_White&#34;&gt;
A black-and-white version of the theatrical cut, the edition was developed by Robert Longo. While not a director&#39;s cut, it is nonetheless closer to Longo&#39;s intended vision for the film; he had desired to shoot in black-and-white but was denied the opportunity. Initially, for the film&#39;s 25th anniversary, Longo ripped a Blu-ray copy of the film and created a black-and-white version of the film himself. After contacting Don Carmody and informing him of his intention to release the new version of the film on YouTube, Carmody requested to see it first. Impressed, Carmody convinced Longo to approach Sony Pictures for an official release. Sony Pictures agreed to provide the film&#39;s footage to Longo for a professional conversion, so that they could release the new version on Blu-ray. Longo proceeded to re-grade the film&#39;s color in black-and-white, with the help of the film&#39;s original colorist Cyrus Stowe.
  &lt;/blockquote&gt;
  &lt;figcaption&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Johnny_Mnemonic_%28film%29#Johnny_Mnemonic:_In_Black_and_White&#34;&gt;&lt;cite&gt;Johnny Mnemonic: In Black and White - Wikipedia&lt;/cite&gt;&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Love the idea of a director ripping a Blu-ray of his own movie so he can release a new edit on Youtube.
Who says modern technology is bad?&lt;/p&gt;
&lt;video controls preload=&#34;metadata&#34; style=&#34;max-width:100%; height:auto;&#34;&gt;
  &lt;source src=&#34;overload.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not support the video tag;
  &lt;a href=&#34;overload.mp4&#34;&gt;download&lt;/a&gt; the video instead.
&lt;/video&gt;
&lt;p&gt;I didn&amp;rsquo;t actually intend to watch something special on the flight.
In that context, any old Alien vs Predator trash is perfect for me.
I do it because you can&amp;rsquo;t trust in-flight entertainment systems.
They are sometimes simply down, which is inconvenient enough,
but the worst thing is that they pause the movie for any announcement over the intercom.&lt;/p&gt;
&lt;p&gt;And like, fuck the safety briefing!&lt;/p&gt;
&lt;p&gt;Fuck this captain&amp;rsquo;s fourth apology for the delay,
fuck the performance of the lie that we have ever needed to place our devices in &amp;ldquo;airplane mode&amp;rdquo;,
fuck the flight attendant who is mad that one of the cattle in economy tried to use the first class lavatory,
fuck the credit card offer oh my god,
fuck the instruction that we keep our seatbelts on after landing (??),
fuck the verbal notice of the baggage claim carousel.&lt;/p&gt;
&lt;p&gt;How dare you interrupt Alien vs Predator for this.&lt;/p&gt;
&lt;figure&gt;
  &lt;video controls preload=&#34;metadata&#34; style=&#34;max-width:100%; height:auto;&#34;&gt;
    &lt;source src=&#34;roomservice.mp4&#34; type=&#34;video/mp4&#34;&gt;
      Your browser does not support the video tag;
      &lt;a href=&#34;roomservice.mp4&#34;&gt;download&lt;/a&gt; the video instead.
    &lt;/source&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;How I feel when my movie is paused so I can hear that the bumpy flight I&#39;m on is, indeed, bumpy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;So I bring my own.&lt;/p&gt;
&lt;!--Notes on making the clips

```sh
# roomservice.mp4
ffmpeg -hide_banner -i in.mkv  -ss 01:05:30 -t 6 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y roomservice.mp4

# jesustime.mp4
ffmpeg -hide_banner -i in.mkv  -ss 01:20:36 -t 7 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y jesustime.mp4

# technociv.mp4
ffmpeg -hide_banner -i in.mkv  -ss 00:48:06 -t 26 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y technociv.mp4

# heaven.mp4 ...
# although this one I ended up editing in QuickTime for faster feedback loop GUI
ffmpeg -hide_banner -i in.mkv  -ss 01:10:14 -t 7 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y heaven.mp4

# heaven.750.mp4
ffmpeg -hide_banner -i in.mkv  -ss 01:10:14 -t 7.750 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y heaven.750.mp4

# overload.mp4
ffmpeg -hide_banner -i in.mkv -ss 00:48:13 -t 9.333 -map 0:0 -map 0:2 -vf &#34;scale=trunc(iw/2/2)*2:trunc(ih/2/2)*2&#34; -c:v libx264 -pix_fmt yuv420p -preset medium -crf 22 -c:a aac -ac 2 -ar 48000 -b:a 192k -movflags +faststart -y overload.mp4
```
--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/fuck-the-safety-briefing/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Now deployed with Hedgerules</title>
      <link>https://com.micahrl.me/blog/deployed-with-hedgerules/</link>
      <pubDate>Sun, 01 Mar 2026 14:19:31 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/deployed-with-hedgerules/</guid>
      <description>
&lt;p&gt;A lot of people are complaining about bot traffic.
I was curious as to the impact on this site,
but for the past six years it&amp;rsquo;s been deployed to Netlify,
and I didn&amp;rsquo;t have a way to see raw request volume without paying for a limited Analytics feature,
and I couldn&amp;rsquo;t see disaggregated referer and user-agent without paying a lot more money for enterprise log drains.&lt;/p&gt;
&lt;p&gt;AWS has powerful observability features that provide exactly what I want,
but moving a Netlify site to S3 + CloudFront isn&amp;rsquo;t that simple.
AWS S3 websites are limited in a few ways,
and a CloudFront + S3 REST deployment is more powerful but more barebones out of the box:
by default it doesn&amp;rsquo;t support directory redirects,
index file rewrites, or custom response headers.
Those features are there by default on Netlify,
but on AWS you have to write custom CloudFront functions to handle them.&lt;/p&gt;
&lt;p&gt;So I wrote &lt;a href=&#34;https://hedgerules.micahrl.com&#34; rel=&#34;external&#34;&gt;Hedgerules&lt;/a&gt;
to deploy those CloudFront functions,
enabling me to switch my site from Netlify to AWS without losing any functionality,
and gaining the observability I wanted.&lt;/p&gt;
&lt;p&gt;The Hedgerules documentation includes a detailed
&lt;a href=&#34;https://hedgerules.micahrl.com/docs/comparisons/table/&#34; rel=&#34;external&#34;&gt;comparison table&lt;/a&gt;
for all its features.
The most critical ones are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Directory index redirects&lt;/strong&gt; &amp;mdash; &lt;code&gt;/path&lt;/code&gt; redirects to &lt;code&gt;/path/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Index file rewriting&lt;/strong&gt; &amp;mdash; &lt;code&gt;/path/&lt;/code&gt; serves &lt;code&gt;/path/index.html&lt;/code&gt; from S3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugo alias redirects&lt;/strong&gt; &amp;mdash; redirects from Hugo&amp;rsquo;s &lt;code&gt;aliases&lt;/code&gt; frontmatter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom redirects&lt;/strong&gt; &amp;mdash; user-defined &lt;code&gt;_hedge_redirects.txt&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom response headers&lt;/strong&gt; &amp;mdash; global defaults and per-page overrides via &lt;code&gt;_hedge_headers.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hedgerules also has a niche feature that I believe is totally unique to it:
it understands a special &lt;code&gt;{/path}&lt;/code&gt;
&lt;a href=&#34;https://hedgerules-www.chineseroom.micahrl.com/docs/headers/request-path-tokens/&#34; rel=&#34;external&#34;&gt;request path token&lt;/a&gt;
when parsing custom response header definitions,
which is replaced by the request path
(and guaranteed to be prefixed with a &lt;code&gt;/&lt;/code&gt;).
I use this to emit
&lt;a href=&#34;https://community.torproject.org/onion-services/advanced/onion-location/&#34; rel=&#34;external&#34;&gt;Onion-Location headers&lt;/a&gt;
for every page with just one entry.&lt;/p&gt;
&lt;p&gt;Hedgerules includes a &lt;a href=&#34;https://hedgerules.micahrl.com/docs/theme/&#34; rel=&#34;external&#34;&gt;Hugo theme&lt;/a&gt;
that provides templates for its &lt;code&gt;_hedge_redirects.txt&lt;/code&gt; and &lt;code&gt;_hedge_headers.json&lt;/code&gt; files.
(It doesn&amp;rsquo;t affect your site&amp;rsquo;s style or generated HTML pages at all.)
As part of this, it creates a map of all
&lt;a href=&#34;https://github.com/mrled/hedgerules/blob/master/hugo-theme-hedgerules/layouts/partials/hedgerules/redirects.html&#34; rel=&#34;external&#34;&gt;redirects&lt;/a&gt;
and &lt;a href=&#34;https://github.com/mrled/hedgerules/blob/master/hugo-theme-hedgerules/layouts/partials/hedgerules/headers.html&#34; rel=&#34;external&#34;&gt;headers&lt;/a&gt;.
This is similar to
&lt;a href=&#34;https://com.micahrl.me/blog/hugo-redirects-partial-functions/&#34;&gt;&lt;em&gt;Hugo redirects and partial functions&lt;/em&gt;&lt;/a&gt;
from all the way back in 2021,
and uses the more modern Hugo
&lt;a href=&#34;https://gohugo.io/functions/go-template/return/&#34; rel=&#34;external&#34;&gt;return&lt;/a&gt;
statement rather than a clunky partial that expects you to pass it a scratch var.&lt;/p&gt;
&lt;h2 id=&#34;aws-observability&#34;&gt;AWS observability&lt;/h2&gt;
&lt;p&gt;Now that Hedgerules has handled those issues for me,
I can pick up a bunch of useful AWS features for approximately free,
like raw logs with CloudWatch Logs Insights,
and visuals with CloudWatch Dashboards.&lt;/p&gt;
&lt;p&gt;Here are some example screenshots from the dashboard for my main website:&lt;/p&gt;
&lt;a class=&#34;image-thumbnail&#34; href=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/dashboard1.png&#34;&gt;
  &lt;img alt=&#34;Screenshot of graphs and log entries on a CloudWatch dashboard&#34; class=&#34;&#34; src=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/dashboard1_hu_b1267ec71e7d5939.png&#34;&gt;
&lt;/a&gt;

&lt;a class=&#34;image-thumbnail&#34; href=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/dashboard2.png&#34;&gt;
  &lt;img alt=&#34;Screenshot of graphs and log entries on a CloudWatch dashboard&#34; class=&#34;&#34; src=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/dashboard2_hu_8fb8d08b7c9d0da6.png&#34;&gt;
&lt;/a&gt;

&lt;p&gt;And here is a live tail of my access logs:&lt;/p&gt;
&lt;a class=&#34;image-thumbnail&#34; href=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/livetail.png&#34;&gt;
  &lt;img alt=&#34;Screenshot of log streaming via Live Tail&#34; class=&#34;&#34; src=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/livetail_hu_e22945041eb709e1.png&#34;&gt;
&lt;/a&gt;

&lt;p&gt;Finally, I can use AWS Athena to query historical logs in a SQL dialect:&lt;/p&gt;
&lt;a class=&#34;image-thumbnail&#34; href=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/athena.png&#34;&gt;
  &lt;img alt=&#34;Screenshot of historical log queries with Athena&#34; class=&#34;&#34; src=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/athena_hu_8d615c352a9694d4.png&#34;&gt;
&lt;/a&gt;

&lt;h2 id=&#34;on-netlify&#34;&gt;On Netlify&lt;/h2&gt;
&lt;p&gt;My experience with Netlify has been wonderful,
and I still have maybe a dozen sites there.
I think the best endorsement comes from the reason I made Hedgerules in the first place:
there&amp;rsquo;s a bunch of extra bot traffic out there,
and I just had no idea because Netlify is handling it all for me.&lt;/p&gt;
&lt;!--GUIDELINES

1.  Publish before it&#39;s polished.

    &gt; Oh, I forgot to mention: lower your standards!
    &gt; Waiting until a piece feels as good as you can get it
    &gt; is a recipe for an empty blog and a huge folder full of drafts
    &gt;
    &gt; I try to hit publish while I am still unhappy with what I’ve written

    -- [Simon Willison](https://bsky.app/profile/simonwillison.net/post/3leuudyabks27)

2.  Write for a particular kind of person in mind.

    &gt; Define the kind of person that your writing is for in advance.
    &gt; And then write only for them.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

3.  Do one level of homework

    Take a few minutes to think about the immediate next question,
    and add that to the post too.
    But only do one level of this to avoid distraction.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/deployed-with-hedgerules/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Anthropic, you need a shell parser</title>
      <link>https://com.micahrl.me/blog/anthropic-you-need-a-shell-parser/</link>
      <pubDate>Mon, 02 Feb 2026 21:04:25 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/anthropic-you-need-a-shell-parser/</guid>
      <description>
&lt;p&gt;&lt;img
src=&#34;hugo-config-commands.png&#34;
alt=&#34;A screenshot of Claude Code attempting to run &#39;hugo config ... | grep ...&#39; with an option to allow running it and any other &#39;hugo config&#39; command in the future&#34;
/&gt;&lt;/p&gt;
&lt;p&gt;Anthropic. Claude. Bro.&lt;/p&gt;
&lt;p&gt;This is not a &lt;code&gt;hugo config&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;echo &#39;cat /root/.ssh/id_ed25519&#39; | ssh productionlol.example.com sh -c &#39;cat - &amp;gt;/tmp/runme.sh; sh /tmp/runme.sh&#39;&lt;/code&gt;
an &amp;ldquo;echo command&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;grep &#39;127.0.0.1&#39; /etc/hosts | sed &#39;s/127\.0\.0\.1.*localhost.*/myaccount ALL=(ALL) NOPASSWD:ALL&#39; &amp;gt;&amp;gt; /etc/sudoers&lt;/code&gt;
a &amp;ldquo;grep command&amp;rdquo;??&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;yes | sudo rm -rf /&lt;/code&gt; a &amp;ldquo;yes command&amp;rdquo;!?!?&lt;/p&gt;
&lt;p&gt;This, from the company that&amp;rsquo;s supposed to save us from superpersuasion.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/anthropic-you-need-a-shell-parser/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Burton’s Thousand Nights and a Night</title>
      <link>https://com.micahrl.me/blog/thousand-nights-and-a-night/</link>
      <pubDate>Mon, 26 Jan 2026 21:13:46 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/thousand-nights-and-a-night/</guid>
      <description>
&lt;p&gt;I was recently looking for some stories from the Arabian Nights,
and found beautiful editions on the Internet Archive of
&lt;em&gt;The Book of the Thousand Nights and a Night&lt;/em&gt; translated by Richard Burton,
which &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Book_of_the_Thousand_Nights_and_a_Night&#34; rel=&#34;external&#34;&gt;Wikipedia&lt;/a&gt;
notes is the only complete English translation.&lt;/p&gt;
&lt;div style=&#34;clear: both;&#34;&gt;&lt;/div&gt;
&lt;figure class=&#34;arabian-nights-covers&#34;&gt;
  &lt;a class=&#34;no-link-underline no-link-hover&#34; href=&#34;an1.jpg&#34;&gt;&lt;img src=&#34;an1.jpg&#34; /&gt;&lt;/a&gt;
  &lt;a class=&#34;no-link-underline no-link-hover&#34; href=&#34;an2.jpg&#34;&gt;&lt;img src=&#34;an2.jpg&#34; /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;The vocabulary is a lot of fun.
Wikipedia quotes historian Robert Irwin,&lt;/p&gt;
&lt;blockquote class=&#34;nocheck&#34;&gt;
&lt;p&gt;Burton shared [John] Payne&amp;rsquo;s enthusiasm for archaic and forgotten words.
The style Burton achieved can be described as a sort of composite
mock-Gothic, combining elements from &lt;a href=&#34;https://en.wikipedia.org/wiki/Middle_English&#34; title=&#34;Middle English&#34;&gt;Middle English&lt;/a&gt;, the &lt;a href=&#34;https://en.wikipedia.org/wiki/Authorized_Version_of_the_Bible&#34; class=&#34;mw-redirect&#34; title=&#34;Authorized Version of the Bible&#34;&gt;Authorized Version of the Bible&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Jacobean_drama&#34; class=&#34;mw-redirect&#34; title=&#34;Jacobean drama&#34;&gt;Jacobean drama&lt;/a&gt;. Most modern readers will also find Burton&amp;rsquo;s Victorian vulgarisms jarring, for example ‘regular &lt;a href=&#34;https://en.wiktionary.org/wiki/Joe_Miller&#34; class=&#34;extiw&#34; title=&#34;wikt:Joe Miller&#34;&gt;Joe Millers&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/Charlie#Noun_2&#34; class=&#34;extiw&#34; title=&#34;wikt:Charlie&#34;&gt;Charleys&lt;/a&gt;’, and ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/red_cent&#34; class=&#34;extiw&#34; title=&#34;wikt:red cent&#34;&gt;red cent&lt;/a&gt;’. Burton&amp;rsquo;s translation of the &lt;i&gt;Nights&lt;/i&gt; can certainly be recommended to anyone wishing to increase their word-power:  ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/chevisance&#34; class=&#34;extiw&#34; title=&#34;wikt:chevisance&#34;&gt;chevisance&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/fortalice&#34; class=&#34;extiw&#34; title=&#34;wikt:fortalice&#34;&gt;fortalice&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/kemper&#34; class=&#34;extiw&#34; title=&#34;wikt:kemper&#34;&gt;kemperly&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/cark&#34; class=&#34;extiw&#34; title=&#34;wikt:cark&#34;&gt;cark&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/foison&#34; class=&#34;extiw&#34; title=&#34;wikt:foison&#34;&gt;foison&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/soothfast&#34; class=&#34;extiw&#34; title=&#34;wikt:soothfast&#34;&gt;soothfast&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/perlection&#34; class=&#34;extiw&#34; title=&#34;wikt:perlection&#34;&gt;perlection&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/wittol&#34; class=&#34;extiw&#34; title=&#34;wikt:wittol&#34;&gt;wittol&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/parergon&#34; class=&#34;extiw&#34; title=&#34;wikt:parergon&#34;&gt;parergon&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/brewis&#34; class=&#34;extiw&#34; title=&#34;wikt:brewis&#34;&gt;brewis&lt;/a&gt;’, ‘bles’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/fadaise&#34; class=&#34;extiw&#34; title=&#34;wikt:fadaise&#34;&gt;fadaise&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/coelebs&#34; class=&#34;extiw&#34; title=&#34;wikt:coelebs&#34;&gt;coelebs&lt;/a&gt;’, ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/vivisepulture&#34; class=&#34;extiw&#34; title=&#34;wikt:vivisepulture&#34;&gt;vivisepulture&lt;/a&gt;’, and so on. ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/whilome&#34; class=&#34;extiw&#34; title=&#34;wikt:whilome&#34;&gt;Whilome&lt;/a&gt;’ and ‘&lt;a href=&#34;https://en.wiktionary.org/wiki/anent&#34; class=&#34;extiw&#34; title=&#34;wikt:anent&#34;&gt;anent&lt;/a&gt;’
are standard in Burton&amp;rsquo;s vocabulary. The range of vocabulary is wider
and stranger than Payne&amp;rsquo;s, lurching between the erudite and the plain
earthy, so that &lt;a href=&#34;https://en.wikipedia.org/wiki/Harun_al-Rashid&#34; title=&#34;Harun al-Rashid&#34;&gt;Harun al-Rashid&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Sinbad&#34; class=&#34;mw-redirect&#34; title=&#34;Sinbad&#34;&gt;Sinbad&lt;/a&gt; walk and talk in a linguistic &lt;a href=&#34;https://en.wikipedia.org/wiki/Never_Never_Land&#34; class=&#34;mw-redirect&#34; title=&#34;Never Never Land&#34;&gt;Never Never Land&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It was circulated (though not &amp;ldquo;published&amp;rdquo; &amp;mdash; see below) in the 1880s,
and is quite readable.
It feels lux to read even the scanned volumes on the Internet Archive.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also &lt;em&gt;intensely&lt;/em&gt; horny.&lt;/p&gt;
&lt;h2 id=&#34;obsessive-focus&#34;&gt;&amp;ldquo;Obsessive focus&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;The original work clearly contains not a few stories intended primarily for the prurient interest.
The stories first came from oral folk tales, of course,
and the mix includes morality tales and adventure stories alongside dirty jokes.&lt;/p&gt;
&lt;p&gt;Burton spends a great deal of time on the sexual aspect,
sometimes far more than the source material.
Wikipedia quotes critics claiming the translation has an &amp;ldquo;obsessive focus on sexuality&amp;rdquo;.
Apparently the work was considered pornographic at the time it was printed,
which prevented legal publication.
To distribute it, Burton created a private club, the &amp;ldquo;Kama Shastra Society&amp;rdquo;,
and printed copies only for members.&lt;/p&gt;
&lt;p&gt;The bawdiness of both the original stories and Burton&amp;rsquo;s footnotes is really funny.&lt;/p&gt;
&lt;h3 id=&#34;three-stories-about-slave-girls&#34;&gt;Three stories about slave girls&lt;/h3&gt;
&lt;p&gt;For example, &lt;a href=&#34;https://archive.org/details/bookofthousandni0005rich/page/80/mode/2up&#34; rel=&#34;external&#34;&gt;these three stories about slave girls&lt;/a&gt;
are printed one after another and only make sense as a throuple of dirty jokes told together.
You can tell Burton&amp;rsquo;s interest is piqued by his footnotes,
but it&amp;rsquo;s also clear that the smuttiness is authentic.&lt;/p&gt;
&lt;!-- (The &#34;slavegirl&#34; / &#34;slave-girl&#34; hyphenation is preserved from the original.) --&gt;
&lt;p&gt;The way I read this first one,
moving the hands as indicated in the footnote is intended to be suggestive,
like making an hourglass figure with your hands,
although I am not actually sure.&lt;/p&gt;
&lt;figure class=&#34;quotefig quotefig-serif arabian-nights-quote&#34;&gt;
  &lt;blockquote&gt;
    &lt;h4&gt;ABU AL-ASWAD AND HIS SLAVE-GIRL.&lt;/h4&gt;
    &lt;p&gt;Abu al-Aswap bought a native-born slavegirl, who was blind of an eye, and she pleased him; but his people decried her to him; whereat he wondered and, turning the palms of his hands upwards,&lt;sup&gt;2&lt;/sup&gt; recited these two couplets,&lt;/p&gt;
    &lt;blockquote&gt;
      “They find me fault with her where I default ne’er find,&lt;br/&gt;
      Save haply that a speck in either eye may show:&lt;br/&gt;
      But if her eyes have fault, of fault her form hath none,&lt;br/&gt;
      Slim-built above the waist and heavily made below.”&lt;br/&gt;
    &lt;/blockquote&gt;
    &lt;aside&gt;
      &lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; When reciting the Fatihah (opening Koranic chapter), the hands are held in this position as if to receive a blessing falling from Heaven; after which both palms are passed down the face to distribute it over the eyes and other organs of sense.&lt;/p&gt;
    &lt;/aside&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;The second also requires a footnote to explain,
although only because of an inaccurate translation.
It&amp;rsquo;s funny that apparently the sexual nature of the joke would have been lost to the intended western audience
if the original word was translated directly,
but it still needed to be euphemized.&lt;/p&gt;
&lt;p&gt;I also like the phrasing from the second girl.
&amp;ldquo;&lt;span class=&#34;nocheck&#34;&gt;Game belongeth to him who taketh it&lt;/span&gt;&amp;rdquo; obviously is a reference to hunted animals
but it sounds like she&amp;rsquo;s telling the first girl &amp;ldquo;don&amp;rsquo;t hate the player&amp;rdquo;.&lt;/p&gt;
&lt;figure class=&#34;quotefig quotefig-serif arabian-nights-quote&#34;&gt;
  &lt;blockquote&gt;
    &lt;h4&gt;HARUN AL-RASHID AND THE TWO SLAVEGIRLS.&lt;/h4&gt;
    &lt;p&gt;The Caliph Harun al-Rashid lay. one night between two slavegirls, one from AlMedinah and the other from Cufa and the Cufite rubbed his hands, whilst the Medinite rubbed his feet and made his concern&lt;sup&gt;1&lt;/sup&gt; stand up. Quoth the Cufite, “I see thou wouldst keep the whole of the stock-in-trade to thyself; give me my share of it... And the other answered, “I have been told by Malik, on the authority of Hisham ibn Orwah,&lt;sup&gt;2&lt;/sup&gt; who had it of his (grand) father, that the Prophet said, ‘Whoso quickeneth the dead, the dead belongeth to him and is his.’” But the Cufite took her unawares and, pushing her away, seized it all in her own hand and said, “Al-A’amash telleth us, on the authority of Khaysamah, who had it of Abdallah bin Mas’td, that the Prophet declared, ‘Game belongeth to him who taketh it, not to him who raiseth it,’&#34;
    &lt;aside&gt;
      &lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; The word used is “bizá’at”=capital or a share in a mercantile business.&lt;/p&gt;
      &lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; This and the following names are those of noted traditionists of the eighth century, who derive back to Abdallah bin Mas’td, a “Companion of the Apostle.” The text shows the recognised formula of ascription for quoting a “Hadis” =saying of Mohammed; and sometimes it has to pass through half a dozen mouths.&lt;/p&gt;
    &lt;/aside&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;The third one seems to have iterated on the second,
I suspect being invented after the telling of the first two together became rote.
Not sure where the euphemism  comes from in this one.&lt;/p&gt;
&lt;figure class=&#34;quotefig quotefig-serif arabian-nights-quote&#34;&gt;
  &lt;blockquote&gt;
    &lt;h4&gt;THE CALIPH HARUN AL-RASHID AND THE THREE SLAVE-GIRLS.&lt;/h4&gt;
    &lt;p&gt;The Caliph Harun al-Rashid once slept with three slave-girls, a Meccan, a Medinite and an Irakite. The Medinah girl put her hand to his yard and handled it, whereupon it rose and the Meccan sprang up and drew it to herself. Quoth the other, “What is this unjust aggression? A tradition was related to me by Malik&lt;sup&gt;3&lt;/sup&gt; after Al-Zuhri, after Abdallah ibn Salim, after Said bin Zayd, that the Apostle of Allah (whom Allah bless and keep!) said: ‘Whoso enquickeneth a dead land, it is his.’” And the Meccan answered, “It is related to us by Sufyan, from Abu Zanad, from Al-A’araj, from Abu Horayrah, that the Apostle of Allah said: ‘The quarry is his who catcheth it, not his who starteth it.’” But the Irak girl pushed them both away and taking it to herself, said, “This is mine, till your contention be decided.”
    &lt;aside&gt;
      &lt;p&gt;&lt;sup&gt;3&lt;/sup&gt; Traditionists of the seventh and eighth centuries who refer back to the “Father of the Kitten” (Abu Horayrah), an uncle of the Apostle.&lt;/p&gt;
    &lt;/aside&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;the-ebony-horse&#34;&gt;&lt;em&gt;The Ebony Horse&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;In &lt;a href=&#34;https://archive.org/details/bookofthousandni0005rich/page/n17/mode/2up&#34; rel=&#34;external&#34;&gt;this case&lt;/a&gt;,
the original story might have been a bit salacious
with a prince visiting a princess in her bedroom,
but Burton&amp;rsquo;s footnote really takes it to the next level,
focusing on how the ladies sleep: &lt;strong&gt;&lt;em&gt;naked&lt;/em&gt;&lt;/strong&gt;.
You can practically hear him giggling.
Everyone is just naked! In bed! At home! Right next to their husbands and wives!
Can you imagine if we did that here, in England??
And by we I mean specifically me and my wife!?!?!?
We definitely don&amp;rsquo;t though.
But what if we did???&lt;/p&gt;
&lt;figure class=&#34;quotefig quotefig-serif arabian-nights-quote&#34;&gt;
  &lt;blockquote&gt;
    &lt;p&gt;He went up to the couch, to see what was thereon, and found a young lady lying asleep, chemised with her hair&lt;sup&gt;2&lt;/sup&gt;...&lt;/p&gt;
    &lt;aside&gt;
      &lt;p&gt;&lt;sup&gt;2&lt;/sup&gt; Eastern women in hot weather, lie mother-nude under a sheet here represented by the hair. The Greeks and Romans also slept stripped and in medieval England the most modest women saw nothing indelicate in sleeping naked by their naked husbands. The “night-cap” and the “night-gown” are comparatively modern inventions.&lt;/p&gt;
    &lt;/aside&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;lady-burton&#34;&gt;&lt;em&gt;Lady Burton&amp;rsquo;s Edition&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;There was a &amp;ldquo;Lady Burton&amp;rsquo;s edition&amp;rdquo; with all of this sexual content removed.
Apparently the name was just for advertising purposes;
Burton&amp;rsquo;s wife Isabel is quoted as saying&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have never read, nor do I intend to read, at his own request, and to be true to my promise to him, my husband&amp;rsquo;s &lt;em&gt;Arabian Nights&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This makes the sexual content so much funnier to me &amp;mdash;
Burton is smirking in the footnotes about naked wives sleeping next to naked husbands
but makes his own wife pinky swear never to read his middle-eastern erotic fan-footnotes.&lt;/p&gt;
&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;/h2&gt;
&lt;p&gt;My favorite edition I found is the &amp;ldquo;Burton Club&amp;rdquo; edition,
printed in the United States,
with gold leaf on the binding for the first ten volumes
and silver for the supplemental six.
Individual volumes on the Internet Archive are linked below.
I could not find all volumes from the same source.
Any corrections or higher quality links would be appreciated!&lt;/p&gt;
&lt;p&gt;The cover images in this post are taken from
&lt;a href=&#34;https://archive.org/details/32882019307530-thebookofthetho/mode/2up&#34; rel=&#34;external&#34;&gt;this scan&lt;/a&gt;
of Volume II.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s too bad there are no modern reproductions of this lovely edition.
I guess print on demand can&amp;rsquo;t make something this large and nice economical yet.&lt;/p&gt;
&lt;p&gt;The entire work is also available in
&lt;a href=&#34;https://www.wollamshram.ca/1001/index.htm&#34; rel=&#34;external&#34;&gt;hypertext&lt;/a&gt;,
which makes for much nicer copying and pasting
but isn&amp;rsquo;t nearly as fun to read.&lt;/p&gt;
&lt;h3 id=&#34;the-book-of-the-thousand-nights-and-a-night&#34;&gt;&lt;em&gt;The Book of the Thousand Nights and a Night&lt;/em&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni1900burt/mode/2up&#34; rel=&#34;external&#34;&gt;Volume I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni0002rich/mode/2up&#34; rel=&#34;external&#34;&gt;Volume II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni03burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume III&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni0004rich/mode/2up&#34; rel=&#34;external&#34;&gt;Volume IV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni0005rich/mode/2up&#34; rel=&#34;external&#34;&gt;Volume V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni06burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume VI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni07burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume VII&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni0008rich/mode/2up&#34; rel=&#34;external&#34;&gt;Volume VIII&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni0009rich/mode/2up&#34; rel=&#34;external&#34;&gt;Volume IX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/bookofthousandni10burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume X&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;supplemental-nights-to-the-book-of-the-thousand-nights-and-a-night&#34;&gt;&lt;em&gt;Supplemental Nights to the Book of the Thousand Nights and a Night&lt;/em&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/plainliteraltran01burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/b24877566_0002/mode/2up&#34; rel=&#34;external&#34;&gt;Volume II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/b24877566_0003/mode/2up&#34; rel=&#34;external&#34;&gt;Volume III&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/plainliteraltran04burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume IV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/b24877566_0005/mode/2up&#34; rel=&#34;external&#34;&gt;Volume V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://archive.org/details/plainliteraltran06burtuoft/mode/2up&#34; rel=&#34;external&#34;&gt;Volume VI&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;!--GUIDELINES

1.  Publish before it&#39;s polished.

    &gt; Oh, I forgot to mention: lower your standards!
    &gt; Waiting until a piece feels as good as you can get it
    &gt; is a recipe for an empty blog and a huge folder full of drafts
    &gt;
    &gt; I try to hit publish while I am still unhappy with what I’ve written

    -- [Simon Willison](https://bsky.app/profile/simonwillison.net/post/3leuudyabks27)

2.  Write for a particular kind of person in mind.

    &gt; Define the kind of person that your writing is for in advance.
    &gt; And then write only for them.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

3.  Do one level of homework

    Take a few minutes to think about the immediate next question,
    and add that to the post too.
    But only do one level of this to avoid distraction.

    -- [Philipp Spiess](https://spiess.dev/note/engineering/effective-writing)

--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/thousand-nights-and-a-night/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>There is no new privacy concern for LLMs training on your data</title>
      <link>https://com.micahrl.me/blog/no-new-privacy-concern-llm-training/</link>
      <pubDate>Sun, 25 Jan 2026 20:23:51 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/no-new-privacy-concern-llm-training/</guid>
      <description>
&lt;p&gt;I keep hearing about the privacy concerns for AI training on personal data,
and I think this concern is unfounded and basically nonsense.&lt;/p&gt;
&lt;p&gt;What is the threat model exactly?
Let&amp;rsquo;s say your trove of personal data is used by Google for training the next iteration of Gemini.
Everything you have:
all medical records, financial history, texts and emails, location data, every sin you have committed in a detailed journal.
Oops!
What then?&lt;/p&gt;
&lt;p&gt;Gemini would mix these in with every other recorded fact in the universe,
and none of it would get tied to you.
Compared to the vast ocean of data it is trained on in general,
even the most thorough inventory of data about you personally is just a molecule or two.
It probably couldn&amp;rsquo;t even regurgitate your name.&lt;/p&gt;
&lt;p&gt;Google expends a great deal of effort to prevent specific data points
from being included in general answers
(&amp;quot;&lt;a href=&#34;https://en.wikipedia.org/wiki/Overfitting&#34; rel=&#34;external&#34;&gt;overfitting&lt;/a&gt;&amp;quot;).
The whole point of Gemini and the entire field of machine learning
is to have the computer generalize, not memorize.&lt;/p&gt;
&lt;p&gt;Furthermore, if there were weird facts encoded about someone in Gemini,
people would discount them.
Without public documentation to point to
(at which point you can&amp;rsquo;t really blame the LLM training)
it would be indistinguishable from a hallucination.&lt;/p&gt;
&lt;p&gt;Are we actually talking about &lt;em&gt;inference&lt;/em&gt; instead?&lt;/p&gt;
&lt;p&gt;Large companies, including all AI companies, personalize our accounts by keeping data about us,
including using LLM inference now that it is available.
If you are worried about databases that tie records to you personally,
LLMs don&amp;rsquo;t change a thing.
Just like you had to trust that pre-LLM Gmail was going to steward your email well,
not give it to law enforcement without a warrant,
not publish it on the web for all to see, etc,
you have to trust that post-LLM Gemini won&amp;rsquo;t do the same,
with the data you give it in each chat session.&lt;/p&gt;
&lt;p&gt;Any company you can trust with your email,
you can trust with your AI chats.
Or, if you prefer,
if you&amp;rsquo;d accept a company&amp;rsquo;s bad behavior because their email product is good enough,
you can accept the same bad behavior if their LLM product is good in equal measure.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/no-new-privacy-concern-llm-training/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Linkblogging</title>
      <link>https://com.micahrl.me/blog/linkblogging/</link>
      <pubDate>Sun, 25 Jan 2026 11:47:24 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/linkblogging/</guid>
      <description>
&lt;p&gt;I&amp;rsquo;ve started a new &lt;a href=&#34;https://com.micahrl.me/links/&#34;&gt;&lt;em&gt;Links&lt;/em&gt;&lt;/a&gt; section:
just a link, with just enough description for you to decide if you want to click.
It has a its own &lt;a href=https://com.micahrl.me/links/rss.xml&gt;feed&lt;/a&gt;;
to read it, &lt;a href=&#34;https://com.micahrl.me/subscribe/&#34;&gt;subscribe&lt;/a&gt; to that feed separately or to the newsletter,
which will include occasional link posts.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been thinking about this ever since I read &lt;span class=&#34;nocheck&#34;&gt;Kellan Elliott-McCrea&amp;rsquo;s&lt;/span&gt;
&lt;a href=&#34;https://laughingmeme.org/2024/06/08/a-link-blog-in-2024.html&#34; rel=&#34;external&#34;&gt;&lt;em&gt;A Link Blog in the Year 2024&lt;/em&gt;&lt;/a&gt;.
Some of my favorite blogs are linkblogs too!&lt;/p&gt;
&lt;p&gt;I think people underestimate the linkblog.
&lt;span class=&#34;nocheck&#34;&gt;Kellan&lt;/span&gt; says it&amp;rsquo;s &amp;ldquo;the very definition of something that no one needs&amp;rdquo;.
In &lt;span class=&#34;nocheck&#34;&gt;Nelson Minar&amp;rsquo;s&lt;/span&gt;
&lt;a href=&#34;https://www.somebits.com/weblog/linkblog/linkblog-website.html&#34; rel=&#34;external&#34;&gt;post&lt;/a&gt;
about his linkblog, he isn&amp;rsquo;t quite so pessimistic,
but expresses a desire for more reach and says &amp;ldquo;I accept what I&amp;rsquo;m doing is not mainstream&amp;rdquo;.
Fair enough, but:
I think linkblogs are one of those things with outsized impact compared to their direct userbases&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;I suspect that while they are not read by very many people in absolute terms,
the bloggers who contribute the most to the zeitgeist are almost all readers of linkblogs.
I also believe that linkblogs contribute significantly to blog discovery.
A huge number of the blogs in my feed reader came to me via linkblogs.&lt;/p&gt;
&lt;p&gt;When thinking about linkblogs, I also think there are more types than is widely acknowledged.
Here&amp;rsquo;s a sample among blogs I personally read:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Feeds of individual links&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://laughingmeme.org/links/&#34; rel=&#34;external&#34;&gt;Mindless Link Propagation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.somebits.com/linkblog/&#34; rel=&#34;external&#34;&gt;Nelson&amp;rsquo;s Linkblog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some blogs in this category might be RSS-only &amp;mdash;
based on Nelson&amp;rsquo;s post linked above,
it sounds like that used to be the case for his linkblog.&lt;/p&gt;
&lt;p&gt;Other blogs here might have a separate web page for each source link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Feeds of individual links with commentary&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://daringfireball.net&#34; rel=&#34;external&#34;&gt;Daring Fireball&lt;/a&gt; (which has &lt;a href=&#34;https://daringfireball.net/linked/&#34; rel=&#34;external&#34;&gt;claimed&lt;/a&gt; the excellent name &amp;ldquo;Linked List&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pxlnv.com/&#34; rel=&#34;external&#34;&gt;Pixel Envy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://aliquote.org/&#34; rel=&#34;external&#34;&gt;aliquote.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.jwz.org/blog/&#34; rel=&#34;external&#34;&gt;jwz&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kottke.org/&#34; rel=&#34;external&#34;&gt;kottke.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://simonwillison.net/&#34; rel=&#34;external&#34;&gt;Simon Willison&amp;rsquo;s Weblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://onefoottsunami.com/&#34; rel=&#34;external&#34;&gt;One Foot Tsunami&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some blogs here also have essays or microposts that don&amp;rsquo;t include links,
while others are exclusively about the links.&lt;/p&gt;
&lt;p&gt;For link posts, some blogs may have the RSS feed point to the source,
while others point it to a page on the linkblog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Link periodicals&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://leahneukirchen.org/trivium/&#34; rel=&#34;external&#34;&gt;Trivium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://newsletter.nixers.net/&#34; rel=&#34;external&#34;&gt;Nixers Newsletter&lt;/a&gt; (also available via RSS)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jatan.space/&#34; rel=&#34;external&#34;&gt;jatan.space&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blogs that intermix periodic link posts with other posts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://mjtsai.com/blog/&#34; rel=&#34;external&#34;&gt;Michael Tsai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://interconnected.org/home/&#34; rel=&#34;external&#34;&gt;Interconnected&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.astralcodexten.com/&#34; rel=&#34;external&#34;&gt;Astral Codex Ten&lt;/a&gt;
(including for years at &lt;a href=&#34;https://slatestarcodex.com/&#34; rel=&#34;external&#34;&gt;Slate Star Codex&lt;/a&gt;),
for example &lt;a href=&#34;https://www.astralcodexten.com/p/links-for-december-2025&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Links For December 2025&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://brettterpstra.com/&#34; rel=&#34;external&#34;&gt;Brett Terpstra&lt;/a&gt;,
for example &lt;a href=&#34;https://brettterpstra.com/2026/01/12/web-excursions-for-january-12nd-2026/&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Web Excursions for January 12nd, 2026&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.thediff.co&#34; rel=&#34;external&#34;&gt;The Diff&lt;/a&gt;,
for example &lt;a href=&#34;https://www.thediff.co/archive/longreads-open-thread-165/&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Longreads + Open Thread&lt;/em&gt;&lt;/a&gt;
from January 17th&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.construction-physics.com&#34; rel=&#34;external&#34;&gt;Construction Physics&lt;/a&gt;,
for example &lt;a href=&#34;https://www.construction-physics.com/p/reading-list-012426&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Reading List 01/24/26&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ozy Brennan&amp;rsquo;s &lt;a href=&#34;https://thingofthings.substack.com/&#34; rel=&#34;external&#34;&gt;Thing of Things&lt;/a&gt;,
for instance &lt;a href=&#34;https://thingofthings.substack.com/p/linkpost-for-december-193&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Linkpost for December&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I noticed a minor trend of these intermittent link posts among Substack newsletters.
I suspect that Substack&amp;rsquo;s easy monetization has played a role here &amp;mdash;
link posts reuse some ingredients that go into essays for extra content
but still keeps readers engaged.
This requires less effort than a new essay,
but enough that some free blog authors don&amp;rsquo;t consider it worth doing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Personally, my favorite format for reading are blogs of the first two types.
I think this is easier to keep track of,
especially as I may be looking briefly at my feed reader while I&amp;rsquo;m waiting on something else.&lt;/p&gt;
&lt;p&gt;I track the links I want to post in my &lt;a href=&#34;https://raindrop.io&#34; rel=&#34;external&#34;&gt;Raindrop&lt;/a&gt; account with a &lt;code&gt;#linkblog&lt;/code&gt; tag.
Irregularly, I pull them down via a Python script into a YAML file kept in Hugo
&lt;a href=&#34;https://gohugo.io/content-management/data-sources/&#34; rel=&#34;external&#34;&gt;site data&lt;/a&gt;.
I add my commentary as minimal markdown in that YAML file,
and a Hugo &lt;a href=&#34;https://gohugo.io/content-management/content-adapters/&#34; rel=&#34;external&#34;&gt;content adapter&lt;/a&gt;
assembles the result into one page per link.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&#34;https://book.micro.blog/linkblogging/&#34; rel=&#34;external&#34;&gt;&lt;em&gt;Linkblogging&lt;/em&gt;&lt;/a&gt; chapter
of the &lt;a href=&#34;https://micro.blog&#34; rel=&#34;external&#34;&gt;micro.blog&lt;/a&gt; &lt;a href=&#34;https://book.micro.blog/&#34; rel=&#34;external&#34;&gt;book&lt;/a&gt;
&lt;!--
which was adapted from Manton&#39;s
[_The evolution of linkblogging_](https://www.manton.org/2016/03/03/the-evolution-of.html) blog post.
--&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;It reminds me of the influence that Twitter users used to have over newspapers of record.
Twitter was not the largest social network, and was rarely even profitable,
but it counted the overwhelming majority of professional journalists among its users,
and their combined influence repeatedly disciplined news organizations for years.
I think the influence of the linkblog is smaller than this,
without as much power concentration and,
I think most critically, lacking the interactivity of 2010s social media,
so I am not concerned that its impact will be as negative as Twitter&amp;rsquo;s.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/linkblogging/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Reclaim notifications</title>
      <link>https://com.micahrl.me/blog/reclaim-notifications/</link>
      <pubDate>Wed, 17 Dec 2025 06:45:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/reclaim-notifications/</guid>
      <description>
&lt;p&gt;Notifications serve the interests of whoever controls them.
That &lt;em&gt;whoever&lt;/em&gt; can be us, if we change them from their defaults.
These are steps I think everyone ought to take.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Disable almost all smart watch notifications.&lt;/p&gt;
&lt;p&gt;I see people all the time with Slack or Gmail tapping their wrist &amp;mdash;
the signal/noise ratio is way too low to allow this level of interruption.
&lt;strong&gt;Even texts are not worth it&lt;/strong&gt;:
if the medium is inherently asynchronous, be ok with that.&lt;/p&gt;
&lt;p&gt;Which ones are actually good on the watch?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real-time, intentional interruptions like well-curated calendar alerts&lt;/li&gt;
&lt;li&gt;Context-relevant suggestions like workout intervals and turn-by-turn directions&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- In the former case, the interruption is desired because the right action for the moment changed.
In the latter, the notification isn&#39;t an interruption at all, but part of the current activity, --&gt;
&lt;p&gt;Everything else: prohibit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn off notifications for the news.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t believe people tolerate CNN pushing alerts to their phone.
Unless you&amp;rsquo;re in a very specific profession, nothing good can come from this.
I am told that some people actually send these to their smart watch.&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote&gt;
    &lt;label&gt;
      &lt;input checked type=&#34;checkbox&#34;&gt;
      &lt;strong&gt;YES!&lt;/strong&gt; Interrupt time with my loved ones to tell me something upsetting I can&#39;t control.
    &lt;/label&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;Deranged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aggressively filter emails.&lt;/p&gt;
&lt;p&gt;Categorization by computer saves precious human attention.
Anything that doesn&amp;rsquo;t &lt;em&gt;require an action&lt;/em&gt; should be filtered out or deleted.
You can create long filters that relegate messages like
terms of service updates, receipts, paperless billing statements, and delivery order notifications
into a folder that you never need to see
(unless you&amp;rsquo;re looking for it).
You control where these needy messages go, and they can&amp;rsquo;t do anything about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do not let fear prevent you from filtering work emails&lt;/strong&gt;.
Good filters help you focus &lt;em&gt;more&lt;/em&gt; on the important things,
and if your filter does misfire the restitution is the most banal apology on earth:
&amp;ldquo;oh sorry, I didn&amp;rsquo;t see that email&amp;rdquo;.
You&amp;rsquo;re saying it anyway, so put it to work for you.
You can also write filters to mark some emails as high priority
if you&amp;rsquo;re worried about false positives from e.g. bosses and clients.&lt;/p&gt;
&lt;details&gt;
  &lt;summary&gt;Filters from my personal Fastmail account&lt;/summary&gt;
  &lt;ul class=&#34;gallery&#34;&gt;
          &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/reclaim-notifications/email-tos.png&#34;&gt;
        &lt;img
          src=&#34;https://com.micahrl.me/blog/reclaim-notifications/email-tos.png&#34;
          alt=&#34;email-tos.png&#34;
          loading=&#34;lazy&#34;
        /&gt;
      &lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/reclaim-notifications/email-useless.png&#34;&gt;
        &lt;img
          src=&#34;https://com.micahrl.me/blog/reclaim-notifications/email-useless.png&#34;
          alt=&#34;email-useless.png&#34;
          loading=&#34;lazy&#34;
        /&gt;
      &lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
&lt;/details&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allow an app to have notification privileges only as long as it has a 100% hit rate.&lt;/p&gt;
&lt;p&gt;The first time you get an unwanted notification,
go try and turn off notifications of that type.
If the app doesn&amp;rsquo;t allow you to discriminate between useful and useless messages,
permanently disable them all.&lt;/p&gt;
&lt;p&gt;This means I have prohibited notification permission to apps like
Grubhub,
Uber,
all airline apps,
all bank apps,
Facebook,
Instagram,
TikTok,
grocery delivery,
Newegg,
and more.
These apps sometimes have useful notifications I want,
but if they are also sending me marketing messages or engagement bait,
they lose the privilege forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The basics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unsubscribe from text and email marketing whenever it appears.&lt;/li&gt;
&lt;li&gt;Get a spam call/text blocker like &lt;a href=&#34;https://www.nomorobo.com/&#34; rel=&#34;external&#34;&gt;Nomorobo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Generally, consider whether planning time to pull from a source on your schedule
would solve the problem better than letting the source push an interruption to you on its schedule.
If, for example, you are cursed by god with a professional need to stay on top of the news every day,
try blocking time to spend on just that.
Or if you there are email newsletters you want to receive,
send them to a feed reader like &lt;a href=&#34;https://feedbin.com&#34; rel=&#34;external&#34;&gt;Feedbin&lt;/a&gt; which you open at the right time for you.
This protects your focus.&lt;/p&gt;
&lt;p&gt;At the beginning, it seems like taking control of the deluge will never help &amp;mdash;
maybe you&amp;rsquo;re somehow signing up for marketing lists faster than you can click unsubscribe.
It does add up, though, and it will pay off in a few weeks.
It&amp;rsquo;s tempting to use a Sisyphean metaphor for this,
but I think it&amp;rsquo;s actually more like cleaning your house.
Entropy comes for us all in the end,
but it is worth pushing against it while we have to live here.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/reclaim-notifications/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Site updates December 2025</title>
      <link>https://com.micahrl.me/blog/site-updates-2025-12/</link>
      <pubDate>Mon, 15 Dec 2025 07:45:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/site-updates-2025-12/</guid>
      <description>
&lt;p&gt;I&amp;rsquo;ve made a few changes to this site.&lt;/p&gt;
&lt;h2 id=&#34;design-updates&#34;&gt;Design updates&lt;/h2&gt;
&lt;p&gt;Fewer roundrects, more sharp corners.
Fewer random colors, more consistency.
An ever-so-slightly more peaceful design.&lt;/p&gt;
&lt;p&gt;I softened what was formerly pure black and pure white,
making both light and dark mode more pleasant.
I also darkened the highlight color in dark mode,
so that it stands out less against the background,
matching light mode behavior.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Screenshots&lt;/summary&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesToc.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesToc.png&#34;
    alt=&#34;designUpdatesToc.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesDetailsCode.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesDetailsCode.png&#34;
    alt=&#34;designUpdatesDetailsCode.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesLight.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesLight.png&#34;
    alt=&#34;designUpdatesLight.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesDark.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/designUpdatesDark.png&#34;
    alt=&#34;designUpdatesDark.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;p&gt;I also spent some time playing with fonts but couldn&amp;rsquo;t find something I liked better than Lato.&lt;/p&gt;
&lt;p&gt;I have of course noticed that serif fonts are really &lt;em&gt;back&lt;/em&gt; on the web now,
and spent some time trying them out.
For this website, I hate them.
Some fuse in my head got blown back in 2005
equating sans serif fonts with modern, digital-first text;
no matter how hard I try,
I can&amp;rsquo;t look at Source Serif without tasting a high school paper set in Times New Roman a little bit.
This isn&amp;rsquo;t always true when I am browsing someone else&amp;rsquo;s website focusing on the content,
but whenever I am paying attention to typography, it&amp;rsquo;s there.&lt;/p&gt;
&lt;h2 id=&#34;projects-blog-and-til-layouts&#34;&gt;Projects, blog, and TIL layouts&lt;/h2&gt;
&lt;p&gt;I did a facelift of the &lt;a href=&#34;https://com.micahrl.me/projects/&#34;&gt;projects&lt;/a&gt; page,
including images for more projects and a nicer display on wide screens.
I also added a metadata box to all individual project pages
(e.g. &lt;a href=&#34;https://com.micahrl.me/projects/keymapkit/&#34;&gt;KeymapKit&lt;/a&gt;)
to consistently display links to code and documentation, current status, etc.&lt;/p&gt;
&lt;p&gt;Updates for the &lt;a href=&#34;https://com.micahrl.me/blog/&#34;&gt;blog&lt;/a&gt; and &lt;a href=&#34;https://com.micahrl.me/til/&#34;&gt;til&lt;/a&gt; pages
to make links look more consistent across the site.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Screenshots&lt;/summary&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutBLog.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutBLog.png&#34;
    alt=&#34;listLayoutBLog.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutTil.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutTil.png&#34;
    alt=&#34;listLayoutTil.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutProjects.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/listLayoutProjects.png&#34;
    alt=&#34;listLayoutProjects.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/projectSingle.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/projectSingle.png&#34;
    alt=&#34;projectSingle.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id=&#34;new-project-pages-and-updates&#34;&gt;New project pages and updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/mindfort/&#34;&gt;MindFort&lt;/a&gt;,
an iOS app for password memorization.
Unfinished.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/lightpulse/&#34;&gt;LightPulse&lt;/a&gt;,
a prototype for running Hugo inside an iOS app for on-device previews.
Very rough proof of concept, not directly useful in its current form.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/chineseroom/&#34;&gt;chineseroom&lt;/a&gt;,
a belated page for the LLM agent sandbox VM I use
(which I discussed in a previous &lt;a href=&#34;https://com.micahrl.me/blog/claude-code-chinese-room/&#34;&gt;post&lt;/a&gt;
but didn&amp;rsquo;t create a project page for at the time).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/micahandadoria.com/&#34;&gt;micahandadoria.com&lt;/a&gt;,
the site I built for my wedding.
Currently live at &lt;a href=&#34;https://micahandadoria.com&#34; rel=&#34;external&#34;&gt;https://micahandadoria.com&lt;/a&gt;,
future status TBD.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/lightmarks/&#34;&gt;Lightmarks&lt;/a&gt; already existed,
but I used to link out to an imgur gallery of screenshots and videos.
No longer: those are now hosted on this site and displayed inline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Going forward, I&amp;rsquo;d like to have a more intentional visual history of GUI projects,
so I can see how they evolved.
Right now a few projects have screenshots;
it would be great to arrange those in some kind of timeline so I can see how a project&amp;rsquo;s UI changed over time.
I notice that it&amp;rsquo;s fun to find random screenshots of this website on my hard drive and see what it used to look like.
The new on-site Lightmarks gallery and this very post are steps in that direction,
but don&amp;rsquo;t accomplish the whole vision.&lt;/p&gt;
&lt;h2 id=&#34;image-and-video-galleries&#34;&gt;Image and video galleries&lt;/h2&gt;
&lt;p&gt;I added quick and easy galleries that support both images and videos.
See examples on the &lt;a href=&#34;https://com.micahrl.me/projects/lightmarks/&#34;&gt;Lightmarks&lt;/a&gt; project page
and the redacted coloring book &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/gallery/&#34;&gt;gallery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I built the original version of this for the wedding project page,
adapted it for this site,
and added video support (so far only used for screencasts).&lt;/p&gt;
&lt;p&gt;It use Hugo&amp;rsquo;s thumbnail generation when possible,
but also supports generating thumbnails in advance,
which is necessary when working with video files or image types that Hugo doesn&amp;rsquo;t support yet,
like &lt;a href=&#34;https://github.com/gohugoio/hugo/issues/7837&#34; rel=&#34;external&#34;&gt;AVIF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It draws a nice play button on top of video links to indicate the content type.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Screenshot&lt;/summary&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/galleryExampleLightmarks.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/galleryExampleLightmarks.png&#34;
    alt=&#34;galleryExampleLightmarks.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id=&#34;removed-most-of-twarchive&#34;&gt;Removed most of &lt;code&gt;twarchive&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://com.micahrl.me/projects/twarchive/&#34;&gt;twarchive&lt;/a&gt; project is dead or at least in a coma,
and I realized that the pages take a long time for Hugo to render.
I&amp;rsquo;ve ripped out the theme entirely,
but all the existing archives still work.
This means I can&amp;rsquo;t add new tweets,
but I haven&amp;rsquo;t been able to add new tweets for a while now,
ever since the Twitter API v1 got deprecated.&lt;/p&gt;
&lt;p&gt;Twarchive produced downloadable and completely standalone files for each tweet,
so this was easy:
I built the site the old way,
copied the generated tweet archive files into the static directory,
and removed the theme and the content files that created them.&lt;/p&gt;
&lt;p&gt;Nothing has changed about my full archive at &lt;a href=&#34;https://tweets.micahrl.com&#34; rel=&#34;external&#34;&gt;https://tweets.micahrl.com&lt;/a&gt;,
which still uses the twarchive theme.&lt;/p&gt;
&lt;h2 id=&#34;dev-toolbar-easteregg&#34;&gt;Dev toolbar easteregg&lt;/h2&gt;
&lt;p&gt;I decided I hated seeing my &lt;a href=&#34;https://com.micahrl.me/blog/hugo-dev-snippets/&#34;&gt;developer toolbar&lt;/a&gt;
all the time while working on the site,
so I hid it behind a keyboard shortcut.
And, well, now there&amp;rsquo;s no reason to prevent it from going to production,
so you can press &lt;kbd&gt;opt&lt;/kbd&gt;-&lt;kbd&gt;d&lt;/kbd&gt; to see it on any page if you want to for some reason.
There have been a few changes to it since that last blog post on the topic, too.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Screenshot&lt;/summary&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/devnav.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/site-updates-2025-12/devnav.png&#34;
    alt=&#34;devnav.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/site-updates-2025-12/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Bibliographer supports Raindrop.io highlights</title>
      <link>https://com.micahrl.me/blog/bibliographer-raindrop-highlights/</link>
      <pubDate>Wed, 10 Dec 2025 17:00:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/bibliographer-raindrop-highlights/</guid>
      <description>
&lt;p&gt;&lt;a href=&#34;https://com.micahrl.me/projects/bibliographer/&#34;&gt;bibliographer&lt;/a&gt;
has grown support for importing &lt;a href=&#34;https://raindrop.io&#34; rel=&#34;external&#34;&gt;https://raindrop.io&lt;/a&gt; highlights.&lt;/p&gt;
&lt;p&gt;Raindrop is a nice bookmarking and archiving service,
but I subscribed specifically for its support for
&lt;a href=&#34;https://help.raindrop.io/highlights&#34; rel=&#34;external&#34;&gt;annotating&lt;/a&gt; web pages,
which works on both desktop and mobile browsers.
(AFAIK, the only other web highlighting service is &lt;a href=&#34;https://hypothes.is&#34; rel=&#34;external&#34;&gt;https://hypothes.is&lt;/a&gt;,
which doesn&amp;rsquo;t support mobile very well.)&lt;/p&gt;
&lt;p&gt;Everything I highlight with Raindrop is now saved to the
&lt;a href=&#34;https://com.micahrl.me/references/&#34;&gt;references section&lt;/a&gt; on an ad-hoc basis.&lt;/p&gt;
&lt;p&gt;If you want something similar for your site,
&lt;code&gt;bibliographer&lt;/code&gt; saves individual annotations (highlights and comments) as a JSON file,
which can be read as site data in Hugo.
Alternatively, writing something yourself against the
&lt;a href=&#34;https://developer.raindrop.io/v1/highlights&#34; rel=&#34;external&#34;&gt;Raindrop API&lt;/a&gt; is dead simple &amp;mdash;
no oauth required for personal use!&lt;/p&gt;
&lt;p&gt;This is pretty different from &lt;code&gt;bibliographer&lt;/code&gt;&amp;rsquo;s support for tracking the books I read,
so I remain a bit uncertain that adding this functionality &amp;mdash;
rather than making a brand new tool &amp;mdash;
is the right move.
But there was enough overlap in shared code that I decided to do it anyway.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://beepb00p.xyz/annotating.html&#34; rel=&#34;external&#34;&gt;&lt;em&gt;How to annotate literally everything&lt;/em&gt;&lt;/a&gt;
inspired the functionality in the first place.
I&amp;rsquo;ve wanted something like this for web highlights ever since I read that post,
but haven&amp;rsquo;t had a way to annotate web sites from my phone
until I recently subscribed to Raindrop.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://borretti.me/article/i-wish-people-were-more-public&#34; rel=&#34;external&#34;&gt;&lt;em&gt;I Wish People Were More Public&lt;/em&gt;&lt;/a&gt;
inspired me to write this post about it.
At first, I planned to just link to the references in other posts if that ever seemed useful,
but when I found myself &lt;a href=&#34;https://com.micahrl.me/references/borretti.me/i-wish-people-were-more-public-69398779ab7b9777549bb4c5/&#34;&gt;highlighting&lt;/a&gt;
a few passages on that article, I realized I had to be more explicit.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/bibliographer-raindrop-highlights/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Favorite redactions</title>
      <link>https://com.micahrl.me/blog/favorite-redactions/</link>
      <pubDate>Mon, 08 Dec 2025 07:00:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/favorite-redactions/</guid>
      <description>
&lt;p&gt;What are your favorite redactions?
These are mine.&lt;/p&gt;
&lt;h2 id=&#34;as-the-government-explained&#34;&gt;As the government explained&lt;/h2&gt;
&lt;p&gt;From a redacted
brief
(&lt;a href=&#34;https://www.aclu.org/sites/default/files/field_document/33._brief_for_defendants_4.21.17.pdf&#34; rel=&#34;external&#34;&gt;aclu.org&lt;/a&gt;,
&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/aclu-redacted-17157/33._brief_for_defendants_4.21.17.pdf&#34;&gt;local mirror&lt;/a&gt;)
in an ACLU case,
h/t &lt;a href=&#34;https://twitter.com/KlasfeldReports/status/1118541214352060416&#34; rel=&#34;external&#34;&gt;&lt;span class=nospell&gt;Adam Klasfeld&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/aclu-redacted-17157/as-the-government-explained.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/aclu-redacted-17157/as-the-government-explained_hu_ab6d76f3ed745261.png&#34;
    alt=&#34;aclu-redacted-17157/as-the-government-explained.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fbi-retirement-party&#34;&gt;FBI retirement party&lt;/h2&gt;
&lt;p&gt;A photocopied cache of redacted photographs and documents
related to the retirement party of someone who worked at the FBI,
including a truly surreal PowerPoint presentation.
Originally FOIA&amp;rsquo;d by Brad Heath at USA Today,
and released to the public by J.K. Trotter at Gawker in 2014.&lt;/p&gt;
&lt;p&gt;I made a &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/&#34;&gt;coloring book&lt;/a&gt; out of these.
That page also contains links to an archive of the entire FOIA response as released by Gawker.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/at-my-desk-now.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/at-my-desk-now_hu_1aa13209614705dc.png&#34;
    alt=&#34;fbi-retirement-party/at-my-desk-now.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/collage.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/collage_hu_4daaa1cf779f6be0.png&#34;
    alt=&#34;fbi-retirement-party/collage.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/hug.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/fbi-retirement-party/hug_hu_7f16a6f4b6ed0e76.png&#34;
    alt=&#34;fbi-retirement-party/hug.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;guantanamo-artwork&#34;&gt;Guantanamo artwork&lt;/h2&gt;
&lt;p&gt;Redacted art work from Guantanamo detainees,
&lt;a href=&#34;https://twitter.com/JasonLeopold/status/1520034271498440707&#34; rel=&#34;external&#34;&gt;FOIA&amp;rsquo;d by Jason Leopold&lt;/a&gt;.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/1.jpg&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/1_hu_6502eac1e951ffe7.jpg&#34;
    alt=&#34;guantanamo/1.jpg&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/2.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/2_hu_6c357ce2d2e36d49.png&#34;
    alt=&#34;guantanamo/2.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/3.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/3_hu_8fba22b7170542a4.png&#34;
    alt=&#34;guantanamo/3.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/4.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/guantanamo/4_hu_865edff49f600952.png&#34;
    alt=&#34;guantanamo/4.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;no-snack-car&#34;&gt;No snack car&lt;/h2&gt;
&lt;p&gt;From a FOIA
&lt;a href=&#34;https://www.muckrock.com/news/archives/2015/mar/19/amtrak-lounge-car-complaints/&#34; rel=&#34;external&#34;&gt;request&lt;/a&gt;
by &lt;span class=&#34;nocheck&#34;&gt;Conor Skelding&lt;/span&gt; of all complaints about Amtrack lounge cars during a two year period.
Local mirror of response documents:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/muckrock-amtrack/Records1_of_3_1.pdf&#34;&gt;Records1_of_3_1.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/muckrock-amtrack/Records2_of_3_1.pdf&#34;&gt;Records2_of_3_1.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/muckrock-amtrack/Records3_of_3_1.pdf&#34;&gt;Records3_of_3_1.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/muckrock-amtrack/nosnackcar.jpg&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/favorite-redactions/muckrock-amtrack/nosnackcar_hu_16bee0b725e4798c.jpg&#34;
    alt=&#34;muckrock-amtrack/nosnackcar.jpg&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/favorite-redactions/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Redacted coloring book</title>
      <link>https://com.micahrl.me/blog/redacted-coloring-book/</link>
      <pubDate>Sun, 07 Dec 2025 07:30:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/redacted-coloring-book/</guid>
      <description>
&lt;!--

&lt;p&gt;List of page resources&lt;/p&gt;
&lt;ul&gt;

&lt;li&gt;article.pdf

&lt;li&gt;coloringbook.sh

&lt;li&gt;coloringbook/coloringbook.pdf

&lt;li&gt;coloringbook/coverpage.pdf

&lt;li&gt;originals/1258341-0-Emails-Section-6.pdf

&lt;li&gt;originals/1258341-0-Emails-Section-7.pdf

&lt;li&gt;originals/233258474-1258341-0-Photographs-Section-1.pdf

&lt;li&gt;originals/233258895-1258341-0-Emails-Section-5.pdf

&lt;li&gt;originals/233258906-1258341-0-Emails-Section-4.pdf

&lt;li&gt;originals/233258912-1258341-0-Emails-Section-2.pdf

&lt;li&gt;originals/233258913-1258341-0-Emails-Section-1.pdf

&lt;li&gt;originals/233258918-1258341-0-Emails-Section-3.pdf

&lt;li&gt;originals/233260561-1258341-0-Powerpoint-Section-1.pdf

&lt;li&gt;process.sh

&lt;li&gt;samples/photographs-038.png

&lt;li&gt;samples/photographs-057.png

&lt;li&gt;samples/powerpoint-01.png

&lt;li&gt;samples/powerpoint-02.png

&lt;li&gt;samples/powerpoint-11.png

&lt;li&gt;pagestyle.css

&lt;/ul&gt;

--&gt;
&lt;p&gt;In 2014 Brad Heath at USA Today received documents from the FBI in response to a FOIA request.
He published at least one on Twitter,
and J.K. Trotter at Gawker later published the whole set on spammy PDF hosting site Scribd.
Included are several PDFs containing emails,
one containing photographs,
and one containing a PowerPoint presentation.
The photos and slide deck are apparently printed in black and white at extremely low resolution
and/or copies-of-copies with significant artifacts.&lt;/p&gt;
&lt;p&gt;The result is surreal.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/photographs-038.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/photographs-038_hu_145a71928b864a0.png&#34;
    alt=&#34;samples/photographs-038.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/photographs-057.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/photographs-057_hu_1bd0e8bb329a7683.png&#34;
    alt=&#34;samples/photographs-057.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-01.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-01_hu_1b0723b7da8b123a.png&#34;
    alt=&#34;samples/powerpoint-01.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-02.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-02_hu_434af9dcbada6a1.png&#34;
    alt=&#34;samples/powerpoint-02.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-11.png&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/redacted-coloring-book/samples/powerpoint-11_hu_c69deb16af65ca4e.png&#34;
    alt=&#34;samples/powerpoint-11.png&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;coloring-book&#34;&gt;Coloring book&lt;/h2&gt;
&lt;p&gt;Naturally, I turned it into a coloring book.&lt;/p&gt;
&lt;figure class=&#34;docembed&#34;&gt;
  &lt;figcaption&gt;
    &lt;h3&gt;FBI ████████ Retirement Party Coloring Book PDF&lt;/h3&gt;
    &lt;p&gt;&lt;a href=&#34;coloringbook/coloringbook.pdf&#34;&gt;Download&lt;/a&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
  &lt;object data=&#34;coloringbook/coloringbook.pdf&#34; type=&#34;application/pdf&#34; width=&#34;100%&#34; height=&#34;600&#34;&gt;
    &lt;p&gt;
      This browser can’t display PDFs inline, but you can still
      &lt;a href=&#34;coloringbook/coloringbook.pdf&#34;&gt;download the PDF&lt;/a&gt;.
    &lt;/p&gt;
  &lt;/object&gt;
&lt;/figure&gt;
&lt;p&gt;This consists of a cover page plus all the slides and photographs in letter paper size.
I don&amp;rsquo;t include the emails because there isn&amp;rsquo;t an easy way to
programmatically find the interesting ones,
of which there are only a handful among hundreds of pages.&lt;/p&gt;
&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;/h2&gt;
&lt;p&gt;See the &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/gallery/&#34;&gt;full gallery&lt;/a&gt; for individual images of the photograph and powerpoint PDF pages,
or download the original PDFs linked below.&lt;/p&gt;
&lt;div class=&#34;mrl-simple-table-container mrl-hscroll-container&#34;&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Document&lt;/th&gt;
    &lt;th&gt;Original link&lt;/th&gt;
    &lt;th&gt;Local archive&lt;/th&gt;
    &lt;th&gt;Internet Archive&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Brad Heath tweet&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://twitter.com/bradheath/status/441339919718289408&#34;&gt;Twitter&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://com.micahrl.me/twarchive/441339919718289408/index.tweet.html&#34;&gt;HTML&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://web.archive.org/web/20140315075000/https://twitter.com/bradheath/status/441339919718289408&#34;&gt;HTML&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Gawker article&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://blackbag.gawker.com/1563531073&#34;&gt;Gawker&lt;/a&gt; (dead)&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;article.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://web.archive.org/web/20221225233215/https://blackbag.gawker.com/1563531073&#34;&gt;HTML&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-1.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258913/1258341-0-Emails-Section-1.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258913-1258341-0-Emails-Section-1.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-1/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-2.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258912/1258341-0-Emails-Section-2.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258912-1258341-0-Emails-Section-2.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-2/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-3.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258918/1258341-0-Emails-Section-3.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258918-1258341-0-Emails-Section-3.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-3/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-4.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258906/1258341-0-Emails-Section-4.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258906-1258341-0-Emails-Section-4.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-4/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-5.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258895/1258341-0-Emails-Section-5.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258895-1258341-0-Emails-Section-5.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-5/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-6.pdf&lt;/td&gt;
    &lt;td&gt;?&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/1258341-0-Emails-Section-6.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-6/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Emails-Section-7.pdf&lt;/td&gt;
    &lt;td&gt;?&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/1258341-0-Emails-Section-7.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Emails-Section-7/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Photographs-Section-1.pdf&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233258474/1258341-0-Photographs-Section-1.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233258474-1258341-0-Photographs-Section-1.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Photographs-Section-1/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Powerpoint-Section-1&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://www.scribd.com/doc/233260561/1258341-0-Powerpoint-Section-1.pdf&#34;&gt;Scribd&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;originals/233260561-1258341-0-Powerpoint-Section-1.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
    &lt;td&gt;&lt;a href=&#34;https://archive.org/details/AtlantaRetirement/1258341-0-Powerpoint-Section-1/&#34;&gt;PDF&lt;/a&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;A few notes about the above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can only find that one tweet from Brad Heath about these documents&lt;/li&gt;
&lt;li&gt;I can&amp;rsquo;t find any USA Today reporting on this anywhere, would love to see that if it exists&lt;/li&gt;
&lt;li&gt;I didn&amp;rsquo;t know that parts 6 and 7 of the email archives existed
until I found the Internet Archive copy of the PDFs when writing this post,
and I don&amp;rsquo;t know how to find the original links for parts 6 and 7 on Scribd (assuming they&amp;rsquo;re legitimate)&lt;/li&gt;
&lt;li&gt;My local copies of the Gawker article and FOIA PDFs for Emails 1-5, Photographs, and Powerpoint
were saved 2014-07-10 from Scribd,
and my local copies of FOIA PDFs for Emails 6-7 were saved 2025-12-06 from the Internet Archive&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;coloring-book-creation-details&#34;&gt;Coloring book creation details&lt;/h2&gt;
&lt;p&gt;I made a &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/coloringbook/coverpage.pdf&#34;&gt;cover page&lt;/a&gt; in a word processor,
and copied successive generations of it until it introduced a bunch of artifacts.&lt;/p&gt;
&lt;p&gt;This script generates images for the &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/gallery/&#34;&gt;gallery&lt;/a&gt;
and the final coloring book PDF.
The pages in the photographs PDF are in landscape orientation,
while the pages in the powerpoint PDF are in portrait,
so I have to do a little processing to get two landscape photos in a portrait page.
(This is pretty weird to me but here we are.)&lt;/p&gt;

&lt;details &gt;
  &lt;summary&gt;&lt;code&gt;coloringbook.sh&lt;/code&gt;&lt;/summary&gt;
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -eu
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make_portrait_2up_photos_pdf&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Letter at 300 dpi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;dpi&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;page_w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2550&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# 8.5 * 300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;page_h&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3300&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# 11  * 300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;150&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;# 0.5&amp;#34; at 300 dpi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;gap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;150&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;# vertical gap between the two images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;page_w &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;margin&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;           &lt;span class=&#34;c1&#34;&gt;# width available for each image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;inner_h_each&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;page_h &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;margin&lt;span class=&#34;o&#34;&gt;)/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# height available for each image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;y1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$margin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;y2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;margin &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; inner_h_each &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; gap&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;tmpdir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;mktemp -d&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;trap&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;rm -rf &amp;#34;$tmpdir&amp;#34;&amp;#39;&lt;/span&gt; EXIT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; :&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;img1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gallery/photographs-%03d.png&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$img1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;i2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;img2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gallery/photographs-%03d.png&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;outfile&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s/page-%03d.png&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tmpdir&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$page&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$img2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# Two images → full 2-up page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            magick -size &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;x&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page_h&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; xc:white &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                -units PixelsPerInch -density &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$dpi&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                &lt;span class=&#34;se&#34;&gt;\(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$img1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -resize &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_h_each&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -background white -gravity center -extent &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_h_each&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\)&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                    -gravity northwest -geometry +&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;+&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;y1&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; -composite &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                &lt;span class=&#34;se&#34;&gt;\(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$img2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -resize &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_h_each&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -background white -gravity center -extent &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_h_each&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\)&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                    -gravity northwest -geometry +&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;+&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;y2&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; -composite &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$outfile&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# Odd image out → centered on its own page, bigger box&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;bigger_h&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;inner_h_each &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; gap&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            magick -size &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;x&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page_h&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; xc:white &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                -units PixelsPerInch -density &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$dpi&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                &lt;span class=&#34;se&#34;&gt;\(&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$img1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -resize &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;bigger_h&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -background white -gravity center -extent &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;inner_w&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;bigger_h&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\)&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                    -gravity northwest -geometry +&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;+&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;y1&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; -composite &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$outfile&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;page &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p gallery
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Photos are a single CCIT per PDF page, convert to PNG directly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# These images are used in the gallery&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pdfimages -png originals/233258474-1258341-0-Photographs-Section-1.pdf gallery/photographs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Slides contain composite images, render PDF and convert each page to PNG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# These images are used in the gallery and to create the coloring book&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;magick -density &lt;span class=&#34;m&#34;&gt;300&lt;/span&gt; originals/233260561-1258341-0-Powerpoint-Section-1.pdf gallery/powerpoint-%02d.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create new PNG images containing two landscape photos per portrait page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This orients the photos the same way that the powerpoint slides are oriented&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make_portrait_2up_photos_pdf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create PDF from the 2-up PNG images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;img2pdf &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tmpdir&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;/page-*.png -o &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tmpdir&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;/output-2up-letter.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Combine with coverpage and original PDF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pdfunite &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    coloringbook/coverpage.pdf &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    originals/233260561-1258341-0-Powerpoint-Section-1.pdf &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tmpdir&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;/output-2up-letter.pdf &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    coloringbook/coloringbook.pdf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/details&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/redacted-coloring-book/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Wrapping paper</title>
      <link>https://com.micahrl.me/blog/wrapping-paper/</link>
      <pubDate>Sun, 30 Nov 2025 14:30:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/wrapping-paper/</guid>
      <description>
&lt;p&gt;One of my very favorite parts about Christmas is the
&lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/&#34;&gt;wrapping&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first step is paper selection.
Two specific recommendations:
&lt;a href=&#34;https://www.papersource.com/&#34; rel=&#34;external&#34;&gt;Paper Source&lt;/a&gt; which I tend to visit in person for very fine single sheets,
and &lt;a href=&#34;https://society6.com&#34; rel=&#34;external&#34;&gt;Society6&lt;/a&gt; which has infinite variety but ships a little slow.
I tend to keep brown paper on hand, especially for bulky items,
and I also buy metalic/reflective paper from Walmart etc whenever is convenient.&lt;/p&gt;
&lt;p&gt;I try to put ribbon on every gift if I can.
It adds class and color,
and can help keep tape from failing too.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table2.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table2_small.avif&#34;
    alt=&#34;img/table2_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table1.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table1_small.avif&#34;
    alt=&#34;img/table1_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I enjoy adding extra trinkets to the wrapping.
My favorite ones are small gifts of their own:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bracelet around the neck of an anniversary champagne bottle&lt;/li&gt;
&lt;li&gt;enamel pin depicting a character in a game I&amp;rsquo;ve wrapped&lt;/li&gt;
&lt;li&gt;cocktail skewers that go with the glasses I&amp;rsquo;m giving&lt;/li&gt;
&lt;li&gt;action figures or other toys for kids&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Occasionally, the gift wrap itself can be part of a gift.
My grandmother appreciated a gift wrapped in
&lt;a href=&#34;https://www.amazon.com/s?k=mexican+oilcloth&amp;amp;crid=267CHZF223MO9&amp;amp;sprefix=mexican+oilcloth%2Caps%2C94&amp;amp;linkCode=ll2&amp;amp;tag=mrled-20&amp;amp;linkId=ad59d8b0d8c26bc40912589b2d79ff63&amp;amp;language=en_US&amp;amp;ref_=as_li_ss_tl&#34; rel=&#34;external&#34;&gt;Mexican oilcloth&lt;/a&gt;
and held together with a colorful duct tape.
(Wish I had a picture of this.)&lt;/p&gt;
&lt;p&gt;Sometimes I&amp;rsquo;ll add translucent cellophane,
&lt;a href=&#34;https://www.amazon.com/washi-tape/s?k=washi+tape&amp;amp;linkCode=ll2&amp;amp;tag=mrled-20&amp;amp;linkId=507d3fd7b00d78fd87ae79a25a2486ab&amp;amp;language=en_US&amp;amp;ref_=as_li_ss_tl&#34; rel=&#34;external&#34;&gt;Washi tape&lt;/a&gt;,
or patches of fabric or other wrapping paper after finishing a gift,
especially if the paper is relatively plain.
One member of my extended family has a signature style of brown paper decorated with ink stamps and tied with twine,
which always looks so nice.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Red envelopes&amp;rdquo; (found in other colors too, I have some yellow ones in these photos),
those colorful packets that sometimes wrap cash gifts in some Asian countries,
are perfect for gift certificates, event tickets, digital goods, and so forth.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/projblue.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/projblue_small.avif&#34;
    alt=&#34;A wrapped gift with a Project Blue enamel pin in the bow&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/hat.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/hat_small.avif&#34;
    alt=&#34;A wrapped gift with a hairclip with a tiny hat on it in the bow&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/baubles_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/baubles_processed_small.avif&#34;
    alt=&#34;A pile of gifts including one with a Spiderman action figure in the bow&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/garlic_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/garlic_processed_small.avif&#34;
    alt=&#34;A wrapped gift with a garlic press in the bow&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/washi.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/washi_small.avif&#34;
    alt=&#34;A gift wrapped in plain brown paper with two stripes of washi tape on the left side&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/undertree_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/undertree_processed_small.avif&#34;
    alt=&#34;Gifts under the tree with a red and yellow envelope on top&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, on tape:
The advice about only ever needing three pieces of tape per gift is fine
if the recipient is a toddler that you don&amp;rsquo;t like very much.
If you want it to look good, though,
use plenty of tape wherever you need to keep paper taut or a fold crisp.
Keep copious amounts of both single- and double- sided tape on hand at all times.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need to buy invisible tape;
clear tape should never be placed on the outside of a gift.
If hidden tape isn&amp;rsquo;t sufficient,
augment with ribbon,
decorative tape (washi tape, patterned duct tape, etc),
or an intentional wrapping paper patch.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/single4_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/single4_processed_small.avif&#34;
    alt=&#34;img/single4_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table3_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/wrapping-paper/img/table3_processed_small.avif&#34;
    alt=&#34;img/table3_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/wrapping-paper/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Typography, CSS, and wrapping paper</title>
      <link>https://com.micahrl.me/blog/typography-css-wrapping-paper/</link>
      <pubDate>Sat, 29 Nov 2025 08:00:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/typography-css-wrapping-paper/</guid>
      <description>
&lt;p&gt;I&amp;rsquo;m not a professional web designer or frontend developer at all,
but I really enjoy working with CSS.
That wasn&amp;rsquo;t always the case; at first I found it very frustrating.
But as I practiced working with it,
and as it improved over time,
I&amp;rsquo;ve come to really like using it.&lt;/p&gt;
&lt;p&gt;Similarly, spending time trying and tweaking fonts is a lot of fun.
I&amp;rsquo;ve definitely spent hours on Google Fonts trying different options for a new project.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always wanted to learn how to draw,
but never stuck with it through the learning phase during which my work sucks.
But working with CSS and selecting fonts got me into a tight enough improvement feedback loop
that it seems like it satisfies some of that creative visual urge.&lt;/p&gt;
&lt;p&gt;I think this is also why I love wrapping paper.
It&amp;rsquo;s a craft that I can make look good without much skill,
just a small amount of practice and selecting paper and supporting materials
that look good to me visually.&lt;/p&gt;
&lt;ul class=&#34;gallery&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/undertree2_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/undertree2_processed_small.avif&#34;
    alt=&#34;undertree2_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/twoblue.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/twoblue_small.avif&#34;
    alt=&#34;twoblue_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/single1.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/single1_small.avif&#34;
    alt=&#34;single1_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/yellow_processed.avif&#34;&gt;
  &lt;img
    src=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/yellow_processed_small.avif&#34;
    alt=&#34;yellow_processed_small.avif&#34;
    loading=&#34;lazy&#34;
  /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/typography-css-wrapping-paper/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Automated GitHub Issues search</title>
      <link>https://com.micahrl.me/blog/automated-github-issues-search/</link>
      <pubDate>Sat, 08 Nov 2025 05:45:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/automated-github-issues-search/</guid>
      <description>
&lt;p&gt;Terence Eden &lt;a href=&#34;https://shkspr.mobi/blog/2025/10/was-my-website-mentioned-in-a-github-issue/&#34; rel=&#34;external&#34;&gt;wanted&lt;/a&gt;
to know if his website was ever mentioned in a GitHub issue.
This sounded like a good way to procrastinate,
so I decided that I wanted to know that too.&lt;/p&gt;
&lt;p&gt;In pursuit of that goal, I couldn&amp;rsquo;t stop myself from making a few improvements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I added support for more than one search term&lt;/li&gt;
&lt;li&gt;I added the ability to find more than one result per run,
which also means we don&amp;rsquo;t have to run it as often.&lt;/li&gt;
&lt;li&gt;I put all the logic into JavaScript,
which avoids bash and combines several steps into one.
I also split that JavaScript out into a separate file
which keeps the workflow file small and makes the logic easier to edit in an IDE.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;

&lt;details &gt;
  &lt;summary&gt;GitHub workflow&lt;/summary&gt;
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;API Issue Watcher&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;schedule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Once per day at 05:39 UTC, picked a random time that wasn&amp;#39;t on minute 0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;cron&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;39 5 * * *&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Allow manual triggering from GitHub UI from the master branch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;workflow_dispatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;branches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;master&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Automatically run on every push to master branch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;branches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;master&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;permissions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;jobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;watch-and-create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;runs-on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ubuntu-latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# JSON array of search terms to query GitHub API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Each search term will be queried separately&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;SEARCH_TERMS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;[&amp;#34;micahrl.com&amp;#34;, &amp;#34;keymap.click&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ASSIGN_USER: mrled&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;steps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Checkout repository&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/checkout@v4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Restore latest seen ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;cache-latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/cache@v4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.github/latest_seen.txt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;latest-seen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Fetch items from API and process new ones&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/github-script@v7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;github-token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;${{ secrets.MY_PAT }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            const script = require(&amp;#39;./script.js&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;            await script({ github, context, core });&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Update cache with new latest seen ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;steps.fetch.outputs.HAS_NEW_ITEMS == &amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;          echo &amp;#34;Updated latest seen ID, cache will be saved&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Save cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/cache@v4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.github/latest_seen.txt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;latest-seen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/details&gt;
&lt;br /&gt;

&lt;details &gt;
  &lt;summary&gt;JavaScript logic&lt;/summary&gt;
  &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Fetch items from GitHub API and create issues for new ones
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * This script is used by the API Issue Watcher GitHub Action to:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * 1. Fetch search results from GitHub API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * 2. Compare with previously seen items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * 3. Create new issues for any new search results
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * 4. Update the latest seen ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;fs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Read the last seen IDs from cache file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @returns {Object} Object mapping search terms to their last seen IDs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;readLastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;readFileSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.github/latest_seen.txt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No previous IDs found, will process all items&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Save the last seen IDs to cache file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Object} lastSeenIds - Object mapping search terms to their last seen IDs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;saveLastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mkdirSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.github&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;recursive&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;writeFileSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;.github/latest_seen.txt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;stringify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Fetch items from GitHub API for a specific search term
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} searchTerm - The search term to query
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @returns {Promise&amp;lt;Array&amp;gt;} Array of items from the API response
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fetchItemsForSearchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;encodedTerm&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;sb&#34;&gt;`https://api.github.com/search/issues?q=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;encodedTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;amp;s=created&amp;amp;order=desc`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Find new items that haven&amp;#39;t been seen before
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Array} items - All items from the API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} lastSeenId - The ID of the last item we processed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @returns {Array} Array of new items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;findNewItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Create GitHub issues for new items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Array} items - Items to create issues for
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} searchTerm - The search term that found these items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Object} github - GitHub API client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Object} context - GitHub Actions context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} assignUser - Username to assign the issue to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createIssuesForItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Process in reverse order so oldest is created first
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;reverse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Creating issue for: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Format body as block quote
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;quotedBody&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&amp;gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;issues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`[API: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;] &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`Found new item: [&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;html_url&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;)\n\n&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;quotedBody&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;assignees&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Process a single search term: fetch items, find new ones, and create issues
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} searchTerm - The search term to process
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} lastSeenId - The last seen ID for this search term
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Object} github - GitHub API client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {Object} context - GitHub Actions context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param {string} assignUser - Username to assign the issue to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @returns {Promise&amp;lt;Object&amp;gt;} Object with newItemsCount and latestId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;processSearchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`\n=== Processing search term: &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; ===`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Old ID for &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;(none)&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Fetch items from API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fetchItemsForSearchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Total items found: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`No items found for &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Find new items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;findNewItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`New items to process: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Create issues for new items
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;createIssuesForItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Updated latest seen ID for &amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#34; to: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Main coordination function - processes all search terms
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Parse configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;searchTerms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;SEARCH_TERMS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;[]&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ASSIGN_USER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No search terms configured&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NEW_ITEMS_COUNT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HAS_NEW_ITEMS&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;sb&#34;&gt;`Processing &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; search term(s): &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Read last seen IDs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;readLastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Process each search term
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;totalNewItemsCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;hasAnyNewItems&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;searchTerms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;processSearchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lastSeenId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;assignUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;searchTerm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;latestId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;totalNewItemsCount&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newItemsCount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;hasAnyNewItems&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Save results and set outputs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hasAnyNewItems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;saveLastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastSeenIds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`\n=== Summary ===`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;sb&#34;&gt;`Total new items across all search terms: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;totalNewItemsCount&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NEW_ITEMS_COUNT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;totalNewItemsCount&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HAS_NEW_ITEMS&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;\n=== Summary ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No new items found for any search term&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NEW_ITEMS_COUNT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setOutput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HAS_NEW_ITEMS&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/details&gt;
&lt;p&gt;To make this work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new repository.&lt;/li&gt;
&lt;li&gt;Save the JavaScript logic to &lt;code&gt;script.js&lt;/code&gt; in the repository root
and the workflow YAML to &lt;code&gt;.github/workflows/search.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set repository to private (so that it doesn&amp;rsquo;t notify all the repos it links to in issues).&lt;/li&gt;
&lt;li&gt;Give actions read and write permissions under Repository Settings -&amp;gt; Actions -&amp;gt; General.&lt;/li&gt;
&lt;li&gt;Create a new Personal Access Token.
&lt;ul&gt;
&lt;li&gt;GitHub Settings → Developer settings → Personal access tokens →
&lt;a href=&#34;https://github.com/settings/personal-access-tokens/new&#34; rel=&#34;external&#34;&gt;Fine-grained tokens&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Set scope to the repo in question, and allow &lt;code&gt;Read and write&lt;/code&gt; to &lt;code&gt;Contents&lt;/code&gt; and &lt;code&gt;Issues&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add token as secret to this repo under name &lt;code&gt;MY_PAT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure the workflow by editing &lt;code&gt;.github/workflows/search.yml&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;Set the &lt;code&gt;cron&lt;/code&gt; schedule at the top to something that makes sense for you.
It would be polite to run this on a minute that isn&amp;rsquo;t divisible by 5.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;SEARCH_TERMS&lt;/code&gt; to a JSON array of search terms to monitor.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;ASSIGN_USER&lt;/code&gt; to the GitHub username that should be assigned to new issues, if you like.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/automated-github-issues-search/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Kindle Notebook export</title>
      <link>https://com.micahrl.me/blog/kindle-notebook-export/</link>
      <pubDate>Fri, 07 Nov 2025 07:25:00 -0600</pubDate>
      <guid>https://com.micahrl.me/blog/kindle-notebook-export/</guid>
      <description>
&lt;p&gt;The whole ebook/ereader ecosystem just bums me out whenever I think about it.&lt;/p&gt;
&lt;p&gt;For instance,
there is a &amp;ldquo;Kindle Notebook&amp;rdquo; feature which saves highlights and notes you make in Kindle books,
but getting these annotations out of the Kindle is a humiliating experience.
You have to either log in to the Kindle Cloud Reader web application and pull the highlights from JavaScript,
or log in to a Kindle app and email yourself an HTML file.
Each of these options require individually navigating to a book and going through steps in a GUI.
(You used to have a third sad option,
to connect your Kindle with a cable (!) and copy a text file off of it,
but this is no longer possible with modern Kindles.)&lt;/p&gt;
&lt;p&gt;The methods all produce different results, of course.
Highlights for books you bought from the Kindle store sync to the Kindle Cloud Reader,
but highlights from books you add outside of the Kindle store
sync only between native apps
(e.g. macOS and iOS; I assume Android and Windows too).
Via &lt;a href=&#34;https://readwise.io/bookcision&#34; rel=&#34;external&#34;&gt;Bookcision&lt;/a&gt; you can get structured data from the Cloud Reader,
but the official export from Kindle comes only in HTML that doesn&amp;rsquo;t even associate
a user&amp;rsquo;s notes with highlights from the text of the book.&lt;/p&gt;
&lt;p&gt;And you might think, well,
highlights and notes in &lt;em&gt;physical&lt;/em&gt; books are also sort of constrained to the medium,
maybe it makes sense that Amazon constrains Kindle highlights and notes to their ecosystem as well?
But this is unsatisfying for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It&amp;rsquo;s an artificial limitation by Amazon that restricts users,
not an inherent limitation of the technology&lt;/li&gt;
&lt;li&gt;Physical books have the advantage of being physically manipulable:
you can add sticky notes as tabs and flip through pages very quickly to find annotations,
but this is extremely inconvenient for ebooks&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Book publishers also do their best to become a villain in this story
(although as usual they&amp;rsquo;re too insignificant a player for anyone to notice):
they set a limit on the amount of a book you can highlight,
and if you highlight more than this amount,
exporting your highlights will be truncated.
One might think this is a reasonable compromise as long as its set high enough,
because someone could extract the whole text of a book this way,
but only if they hadn&amp;rsquo;t thought about this issue even a tiny bit.
For a user to accomplish this,
they&amp;rsquo;d have to painstakingly highlight the entire book across thousands of page turns,
and what they&amp;rsquo;d have to show for it is a giant text blob stripped of newlines and formatting.
Why would anyone do this in a world where
&lt;a href=&#34;https://en.wikipedia.org/wiki/Anna%27s_Archive&#34; rel=&#34;external&#34;&gt;Anna&amp;rsquo;s Archive&lt;/a&gt;
already has a full fidelity copy of the book for free?&lt;/p&gt;
&lt;p&gt;In my limited experience, this doesn&amp;rsquo;t matter;
books seem to allow highlighting at least 10% of total content,
and you probably can&amp;rsquo;t make use of even that amount.
Still, it&amp;rsquo;s a pathetic waste of everyone&amp;rsquo;s time,
and Amazon has managed to fuck up its implementation between apps,
showing different values for the amount you&amp;rsquo;re allowed to export
depending on whether you&amp;rsquo;re trying to do it from the Cloud Reader or a native app.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Anyway, I have added Kindle Notebook exports to relevant pages in the &lt;a href=&#34;https://com.micahrl.me/books/&#34;&gt;books&lt;/a&gt; section.
The site can now parse exports from both Bookcision and the Kindle apps.&lt;/p&gt;
&lt;p&gt;Like the rest of the books section,
I think this will be more useful to me than to anyone else.
Highlights aren&amp;rsquo;t really valuable on their own,
but &lt;em&gt;my&lt;/em&gt; highlights help remind me of something that I remember was important.
It&amp;rsquo;ll be nice to be able to find them easily with &lt;kbd&gt;cmd&lt;/kbd&gt;-&lt;kbd&gt;f&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works under the hood.&lt;/p&gt;

&lt;details &gt;
  &lt;summary&gt;The &lt;code&gt;bookcision.html&lt;/code&gt; partial parses Bookcision exports&lt;/summary&gt;
  &lt;p&gt;This is called from the book template.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- range $index, $hilite := .highlights -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- with $hilite.text }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ . }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- with $hilite.note }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ . }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- with $hilite.location -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Loc {{ .value }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;
  &lt;summary&gt;The &lt;code&gt;kindleNotebook.html&lt;/code&gt; partial parses exports from the Kindle apps&lt;/summary&gt;
  &lt;p&gt;This is a horrible partial that parses HTML with regex, cobbled together with ChatGPT.
If Amazon ever changes their export format, it&amp;rsquo;ll break.&lt;/p&gt;
&lt;p&gt;It is called from the book template.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{/* Usage: {{ partial &amp;#34;bookKindleNotebook.html&amp;#34; (dict &amp;#34;res&amp;#34; $kindleResource) }} */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $res := .res -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $raw := readFile $res.File.Filename -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{/* Match:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     - &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;sectionHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Section&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     - &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Heading&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Text&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*/}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $re := `(?s)&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;(sectionHeading|noteHeading)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;\s*(.+?)\s*&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;(?:\s*&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;\s*(.+?)\s*&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;)?` -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $matches := findRE $re $raw -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $count := len $matches -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- $consumed := newScratch -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;article&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;book-notes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- range $i, $m := $matches }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {{- $idx := printf &amp;#34;%d&amp;#34; $i -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {{- if not ($consumed.Get $idx) }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- $class := replaceRE $re &amp;#34;$1&amp;#34; $m -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- $content1 := replaceRE $re &amp;#34;$2&amp;#34; $m -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- $content2 := replaceRE $re &amp;#34;$3&amp;#34; $m | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- if eq $class &amp;#34;sectionHeading&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ $content1 | safeHTML }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- else if eq $class &amp;#34;noteHeading&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- $heading := $content1 -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- $text := $content2 -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- $isHighlight := in $heading &amp;#34;Highlight(&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- $isNoteHeading := and (not $isHighlight) (hasPrefix $heading &amp;#34;Note -&amp;#34;) -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- if $isHighlight }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $page := replaceRE `(?s).*Page\s+([0-9]+).*` &amp;#34;$1&amp;#34; $heading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $loc  := replaceRE `(?s).*Location\s+([0-9]+).*` &amp;#34;$1&amp;#34; $heading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $noteText := &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{/* Look ahead for an attached Note entry */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $nextIndex := add $i 1 -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- if lt $nextIndex $count }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- $next := index $matches $nextIndex -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- $nextClass := replaceRE $re &amp;#34;$1&amp;#34; $next -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- $nextHeading := replaceRE $re &amp;#34;$2&amp;#34; $next -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- $nextBody := replaceRE $re &amp;#34;$3&amp;#34; $next | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- $nextIsNote := and (eq $nextClass &amp;#34;noteHeading&amp;#34;) (hasPrefix $nextHeading &amp;#34;Note -&amp;#34;) -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- if $nextIsNote }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- $notePage := replaceRE `(?s).*Page\s+([0-9]+).*` &amp;#34;$1&amp;#34; $nextHeading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- $noteLoc  := replaceRE `(?s).*Location\s+([0-9]+).*` &amp;#34;$1&amp;#34; $nextHeading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{/* Heuristic:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    - Page matches or is missing on one side
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    - Location equal or slightly ahead (&lt;span class=&#34;err&#34;&gt;&amp;lt;&lt;/span&gt;= 10) if both present
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- $pageOK := or (eq $page &amp;#34;&amp;#34;) (eq $notePage &amp;#34;&amp;#34;) (eq $page $notePage) -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- $locOK := or
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    (eq $loc &amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    (eq $noteLoc &amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    (and
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      (ne $loc &amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      (ne $noteLoc &amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      (ge (sub (int $noteLoc) (int $loc)) 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                      (le (sub (int $noteLoc) (int $loc)) 10)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    )
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- if and $pageOK $locOK }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                {{- $noteText = $nextBody -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                {{- $consumed.Set (printf &amp;#34;%d&amp;#34; $nextIndex) true -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;data-page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;loc&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;data-location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- if $text }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ $text | safeHTML }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- if $noteText }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ $noteText | safeHTML }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- with $page }}Page {{ . }}{{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- if and $page $loc }}, {{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- with $loc }}Location {{ . }}{{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- else if $isNoteHeading }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{/* Standalone note not paired to a highlight */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $page := replaceRE `(?s).*Page\s+([0-9]+).*` &amp;#34;$1&amp;#34; $heading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{- $loc  := replaceRE `(?s).*Location\s+([0-9]+).*` &amp;#34;$1&amp;#34; $heading | default &amp;#34;&amp;#34; -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;note-only&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;data-page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;loc&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;data-location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{{ . }}&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{{&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- if $text }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ $text | safeHTML }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;aside&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- with $page }}Page {{ . }}{{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- if and $page $loc }}, {{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              {{- with $loc }}Location {{ . }}{{ end -}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figcaption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- else }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {{/* Fallback for any odd noteHeading formats */}}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- if $text }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ $text | safeHTML }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;blockquote&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;figure&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;article&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/details&gt;

&lt;details &gt;
  &lt;summary&gt;The book template&lt;/summary&gt;
  &lt;p&gt;This template is used to render each individual book.&lt;/p&gt;
&lt;p&gt;It looks for a &lt;code&gt;bookcision.json&lt;/code&gt; and/or &lt;code&gt;kindle-notebook.html&lt;/code&gt; file in each book&amp;rsquo;s page bundle,
and calls the appropriate partial if one is present.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- define &amp;#34;main&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;book-metadata&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{ partial &amp;#34;bookMetadata.html&amp;#34; . }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{ partial &amp;#34;bookCover.html&amp;#34; . }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{ .Content }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;section&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- if not .Params.NoHighlights }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{ $bookcision := .Resources.Get &amp;#34;bookcision.json&amp;#34; | transform.Unmarshal }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- with $bookcision }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Highlights and Notes&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {{ partial &amp;#34;bookcision.html&amp;#34; . }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{ $kindleNotebookExport := .Resources.Get &amp;#34;kindle-notebook.html&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- if $kindleNotebookExport }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Kindle Notebook Export&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {{ partial &amp;#34;bookKindleNotebook.html&amp;#34; (dict &amp;#34;res&amp;#34; $kindleNotebookExport) }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{{- end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/details&gt;

&lt;details &gt;
  &lt;summary&gt;Example &lt;code&gt;bookcision.json&lt;/code&gt; file&lt;/summary&gt;
  &lt;p&gt;An example JSON export from Bookcision&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;asin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;B00KWG9M2E&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Getting Things Done: The Art of Stress-Free Productivity&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;authors&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;David Allen and James Fallows&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;highlights&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Why Things Are on Your Mind Most often, the reason something is on your mind is that you want it to be different than it currently is, and yet: you haven’t clarified exactly what the intended outcome is; This consistent, unproductive preoccupation with all the things we have to do is the single largest consumer of time and energy. —Kerry Gleeson you haven’t decided what the very next physical action step is; and/or you haven’t put reminders of the outcome and the action required in a system you trust. That’s why it’s on your mind. Until those thoughts have been clarified and those decisions made, and the resulting data has been stored in a system that you absolutely know you will access and think about when you need to, your brain can’t give up the job. You can fool everyone else, but you can’t fool your own mind. It knows whether or not you’ve come to the conclusions you need to, and whether you’ve put the resulting outcomes and action reminders in a place that can be trusted to resurface appropriately within your conscious mind.* If you haven’t done those things, it won’t quit working overtime. Even if you’ve already decided on the next step you’ll take to resolve a problem, your mind can’t let go until and unless you park a reminder in a place it knows you will, without fail, look. It will keep pressuring you about that untaken next step, usually when you can’t do anything about it, which will just add to your stress.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;isNoteOnly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kindle://book?action=open&amp;amp;asin=B00KWG9M2E&amp;amp;location=652&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;652&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Before you can achieve any of that, though, you’ll need to get in the habit of keeping nothing on your mind. And the way to do that, as we’ve seen, is not by managing time, managing information, or managing priorities. After all: you don’t manage five minutes and wind up with six; you don’t manage information overload—otherwise you’d walk into a library and die, or the first time you connected to the Web, you’d blow up; and you don’t manage priorities—you have them. Instead, the key to managing all of your stuff is managing your actions.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;isNoteOnly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kindle://book?action=open&amp;amp;asin=B00KWG9M2E&amp;amp;location=711&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;711&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;There is no reason to ever have the same thought twice, unless you like having that thought.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;isNoteOnly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kindle://book?action=open&amp;amp;asin=B00KWG9M2E&amp;amp;location=784&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;784&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;We (1) capture what has our attention; (2) clarify what each item means and what to do about it; (3) organize the results, which presents the options we (4) reflect on, which we then choose to (5) engage with.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;isNoteOnly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kindle://book?action=open&amp;amp;asin=B00KWG9M2E&amp;amp;location=833&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;833&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Still others have good systems but don’t (4) reflect on the contents consistently enough to keep them functional. They may have lists, plans, and various checklists available to them (created by capturing, clarifying, and organizing), but they don’t keep them current or access them to their advantage. Many people don’t look ahead at their own calendars consistently enough to stay current about upcoming events and deadlines, and they consequently become victims of last-minute craziness.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;isNoteOnly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;kindle://book?action=open&amp;amp;asin=B00KWG9M2E&amp;amp;location=857&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;857&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Reflecting requires upkeep - there is a cost to this system. I never wanted to pay that cost but now is the time to embrace it.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;

&lt;details &gt;
  &lt;summary&gt;Example &lt;code&gt;kindle-notebook.html&lt;/code&gt; file&lt;/summary&gt;
  &lt;p&gt;An example HTML export from the a native Kindle app&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE html PUBLIC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;#34;-//W3C//DTD XHTML 1.0 Strict//EN&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;#34;XHTML1-s.dtd&amp;#34; &amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://www.w3.org/TR/1999/REC-html-in-xml&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xml:lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;bodyContainer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Arial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Helvetica&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding-left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding-right&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;notebookFor&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;bookTitle&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#333333&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;authors&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;119&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-bottom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;citation&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#333333&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-bottom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;sectionHeading&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#333333&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;noteHeading&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;700&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#333333&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;noteText&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;font-weight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#333333&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;padding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;highlight_blue&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;178&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;205&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;251&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;highlight_orange&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#ffd7ae&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;highlight_pink&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;191&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;206&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;highlight_yellow&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;247&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;206&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;notebookGraphic&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;notebookGraphic&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kp&#34;&gt;-o-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;err&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;icab-box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;   &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kp&#34;&gt;-khtml-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kp&#34;&gt;-moz-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;kp&#34;&gt;-webkit-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;         &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#888&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;max-width&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;hr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;border&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;none&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;none&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;repeat&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;scroll&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;221&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;221&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;221&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bodyContainer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;notebookFor&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                Notebook Export
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bookTitle&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                Johnstone, Keith - Impro - improvisation and the theater (1992)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;authors&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                Keith Johnstone
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;citation&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;sectionHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Introduction
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 9 · Location 55
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    I first met Johnstone shortly after he had joined the Court as a los-a-script play-reader, and he struck me then as a revolutionary idealist looking around for a guillotine. He saw corruption everywhere.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;sectionHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Notes on Myself
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 13 · Location 103
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    As I grew up, everything started getting grey and dull. I could still remember the amazing intensity of the world I’d lived in as a child, but I thought the dulling of perception was an inevitable consequence of age—just as the lens of the eye is bound gradually to dim. I didn’t understand that clarity is in the mind. I’ve since found tricks that can make the world blaze up again in about fifteen seconds, and the effects last for hours. For example, if I have a group of students who are feeling fairly safe and comfortable with each other, I get them to pace about the room shouting out the wrong name for everything that their eyes light on. Maybe there’s time to shout out ten wrong names before I stop them. Then I ask whether other people look larger or smaller—almost everyone sees people as different sizes, mostly as smaller. ‘Do the outlines look sharper or more blurred?’ I ask, and everyone agrees that the outlines are many times sharper. ‘What about the colours?’ Everyone agrees there’s far more colour, and that the colours are more intense. Often the size and shape of the room will seem to have changed, too. The students are amazed that such a strong transformation can be effected by such primitive means—and especially that the effects last so long.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 13 · Location 118
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    One afternoon I was lying on my bed and investigating the effects of anxiety on the musculature (how do you spend your afternoons?).
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 14 · Location 135
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    At about the age of nine I decided never to believe anything because it was convenient. I began reversing every statement to see if the opposite was also true. This is so much a habit with me that I hardly notice I’m doing it any more. As soon as you put a ‘not’ into an assertion, a whole range of other possibilities opens out—especially in drama, where everything is supposition anyway.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 22 · Location 285
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    When I hear that children only have an attention span of ten minutes, or whatever, I’m amazed. Ten minutes is the attention span of bored children, which is what they usually are in school—hence the misbehaviour.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Highlight(&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;highlight_yellow&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;yellow&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;span&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;) - Page 28 · Location 394
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    What really got me started again was an advert for a play of mine in the paper, a play called The Martian. I had never written such a play, so I phoned up Bryan King, who directed the theatre. ‘We’ve been trying to find you,’ he said. ‘We need a play for next week, does the title The Martian suit you?’
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteHeading&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Note - Page 28 · Location 396
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;noteText&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    WHAT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;div&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/details&gt;
&lt;p&gt;This system expects a directory structure like this in a Hugo site:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  books/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    book-name/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      bookcision.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      kindle-notebook.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Take the above and make your own!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in this, you might want to check out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://clippings.io/&#34; rel=&#34;external&#34;&gt;clippings.io&lt;/a&gt;,
a nice simple service for exporting Kindle annotations&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://notado.app/&#34; rel=&#34;external&#34;&gt;Notado&lt;/a&gt;,
a bookmarking service that can also pull in Kindle highlights (I haven&amp;rsquo;t tried this)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://readwise.io/i/micah330&#34; rel=&#34;external&#34;&gt;Readwise&lt;/a&gt; (invite link),
designed around reminding you of your highlights over time&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://readwise.io/bookcision&#34; rel=&#34;external&#34;&gt;Bookcision&lt;/a&gt;,
a free bookmarklet from Readwise that lets you download your highlights from the web without using their paid service at all&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://beepb00p.xyz/annotating.html&#34; rel=&#34;external&#34;&gt;How to annotate literally everything&lt;/a&gt;,
a blog post about highlighting and making notes on all kinds of content&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mjtsai.com/blog/2024/11/05/exporting-kindle-highlights-for-personal-documents/&#34; rel=&#34;external&#34;&gt;Exporting Kindle Highlights for Personal Documents&lt;/a&gt;,
a blog post about the Kindle app&amp;rsquo;s process for emailing yourself an HTML file&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://com.micahrl.me/projects/bibliographer/&#34;&gt;bibliographer&lt;/a&gt; (&lt;a href=&#34;https://github.com/mrled/bibliographer&#34; rel=&#34;external&#34;&gt;GitHub&lt;/a&gt;),
my project to create Hugo pages from Kindle, Audible, and Libro.fm libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/kindle-notebook-export/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>AWS account hygiene</title>
      <link>https://com.micahrl.me/blog/aws-account-hygiene/</link>
      <pubDate>Wed, 29 Oct 2025 07:20:00 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/aws-account-hygiene/</guid>
      <description>
&lt;p&gt;I&amp;rsquo;ve been neglecting making security improvements to my AWS account,
but a recent new project (announcement forthcoming) was a good opportunity to fix this.&lt;/p&gt;
&lt;p&gt;The project will deploy via CI,
and I&amp;rsquo;d like to limit the damage a compromised CI could do,
particularly to my primary DNS zones.
The best way to limit this is to create a separate AWS account scoped just to the project,
which is described below,
along with some other security improvements.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m happy to report that IAM Identity Center makes everything pretty smooth.
I was afraid this would cause more disruption,
but the new security speedbumps are manageable and don&amp;rsquo;t slow me down very much at all.&lt;/p&gt;
&lt;p&gt;This post is mostly just a note to myself.&lt;/p&gt;
&lt;h2 id=&#34;removing-tokens-from-root-user&#34;&gt;Removing tokens from root user&lt;/h2&gt;
&lt;p&gt;Amazon&amp;rsquo;s advice is to never use programmatic access tokens for the root user of an AWS account.&lt;/p&gt;
&lt;p&gt;This never made sense to me,
as for at least some work I use credentials with widely scoped access permissions.
What is the benefit to creating an admin level user with the same permissions that the root user has and using that instead?
But today I realized there is one way this makes sense:
the root user can delete the account and affect billing settings,
but an admin user with full CRUD permissions cannot.&lt;/p&gt;
&lt;p&gt;I think this difference is pretty minimal for my lab accounts,
but not zero, so I went ahead and disabled my long-lived root access tokens for my primary account.&lt;/p&gt;
&lt;p&gt;This is a one time task for each AWS account,
so the best way to do it is in the CloudShell.&lt;/p&gt;
&lt;h2 id=&#34;creating-sub-accounts-for-ci&#34;&gt;Creating sub accounts for CI&lt;/h2&gt;
&lt;p&gt;The easiest way to make sure a project&amp;rsquo;s wide resource creation and modification permissions
cannot be used to affect existing infrastructure is to create a separate account per project.
E.g. all my DNS for my primary domains are in Route53,
and I want to add a new project that can also modify DNS records for the project&amp;rsquo;s own domain.
The best separation is to just make a separate account for that project.&lt;/p&gt;
&lt;p&gt;You can also do this with resource names, tags, etc,
but this gets fragile.
What&amp;rsquo;s going to be easy to understand when I come back to this project in 18 months is that all its resources are in a dedicated account.&lt;/p&gt;
&lt;p&gt;Separate accounts are free.&lt;/p&gt;
&lt;p&gt;You will need to create an IAM user that can manage accounts, though,
because the main account root user cannot assume sub-account identities.&lt;/p&gt;
&lt;h2 id=&#34;organization-hygiene&#34;&gt;Organization hygiene&lt;/h2&gt;
&lt;p&gt;Creating separate accounts requires creating an AWS organization.&lt;/p&gt;
&lt;p&gt;The account that creates the org is the account that will own the org, and this cannot be changed later.&lt;/p&gt;
&lt;p&gt;Enable &amp;ldquo;Centralized root access for member accounts&amp;rdquo; in IAM from the org owner.&lt;/p&gt;
&lt;h2 id=&#34;iam-and-iam-identity-center&#34;&gt;IAM and IAM Identity Center&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;These are entirely separate AWS products, lol&lt;/li&gt;
&lt;li&gt;You have to IAM Identity Center in the console&lt;/li&gt;
&lt;li&gt;IAM Identity Center is like a directory of users that can be assigned AWS permissions &amp;mdash;
conceptually, it&amp;rsquo;s like Active Directory for AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-i-did&#34;&gt;What I did&lt;/h2&gt;
&lt;p&gt;My starting place: &lt;code&gt;me@micahrl.com&lt;/code&gt; was root user for my only AWS account, and it had programmatic access keys.&lt;/p&gt;
&lt;p&gt;From there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create AWS organization
&lt;ul&gt;
&lt;li&gt;My current AWS account is now the owner of that organization&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modify my root AWS account
&lt;ul&gt;
&lt;li&gt;This is root for my primary AWS account &amp;mdash; which is now also the organization owner&lt;/li&gt;
&lt;li&gt;Deactivate its access keys, preventing programmatic access.
(I found that these keys were created 3599 days ago - nearly 10 years!)&lt;/li&gt;
&lt;li&gt;Change its email address from my primary &lt;code&gt;me@micahrl.com&lt;/code&gt; address to an account root address &lt;code&gt;me+aws-primary@micahrl.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create new account under the organization for my new project (TBD&amp;hellip;)
&lt;ul&gt;
&lt;li&gt;The root email address for this account is &lt;code&gt;me+aws-PROJECT@micahrl.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Credentials are not created - neither username/password for logging in to the web console, nor access key for programmatic use&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enable IAM Identity Center
&lt;ul&gt;
&lt;li&gt;Created a new user with my primary &lt;code&gt;me@micahrl.com&lt;/code&gt; address&lt;/li&gt;
&lt;li&gt;Create a new permission set -&amp;gt; Predefined permission set -&amp;gt; AdministratorAccess&lt;/li&gt;
&lt;li&gt;Assign my new user the new permission set for each account:
AWS Organizations: AWS Accounts -&amp;gt; Select all accounts -&amp;gt; Assign users and groups -&amp;gt; Select the user and the permission set.&lt;/li&gt;
&lt;li&gt;It sends that new user an email, and I log in and create my account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take note of the &amp;ldquo;start URL&amp;rdquo;&lt;/strong&gt;, which this user will need to log in&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To use the IAM Identity Center account to log in to the web console:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visit the &amp;ldquo;Start URL&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select the AWS account to log in to&lt;/li&gt;
&lt;li&gt;It opens a new tab to the AWS console scoped to the account you selected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also copy credentials to be used on the command line after logging in to the Start URL,
but the nicest way to use an IAM Identity Center account on the command line is to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Configure the account one time on each workstation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws configure sso
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This launches an interactive command with the following prompts:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSO session name (Recommended): primary-micahrl # This doesn&amp;#39;t matter, it just names the session we use to log in to IAM Identity Center&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSO start URL [None]: https://SOMETHING.awsapps.com/start # This was provisioned with your IAM Identity Center instance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSO region [None]: us-east-2 # The region your IAM Identity Center instance is in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SSO registration scopes [sso:account:access]: # Leave blank&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Attempting to automatically open the SSO authorization page in your default browser.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If the browser does not open, open the following URL: ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (It waits for you to log in and authorize in a browser)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# There are 2 AWS accounts available to you.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#   Using the account ID XXXX # You can pick this by selecting with arrow keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The only role available to you is: AdministratorAccess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Using the role name &amp;#34;AdministratorAccess&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Default client Region [None]: us-east-2 # The default region you want to use when running the aws command etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# CLI default output format (json if not specified) [None]: # Leaving as the default is fine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Profile name [AdministratorAccess-379474500957]: primary-micahrl # Set a profile name, which is used below&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Log in whenever I need to use it, will launch a web browser and start a session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws sso login --profile primary-micahrl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# For the duration of my session, execute commands with --profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws sts get-caller-identity --profile primary-micahrl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws s3 ls ... --profile primary-micahrl &lt;span class=&#34;c1&#34;&gt;# etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# You can also inject AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY into your environment,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# which any AWS client can use directly, including &amp;#39;hugo deploy&amp;#39; etc:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;aws configure export-credentials --profile primary-micahrl --format env&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# After my session expires, I just have to reauthenticate with the same profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws sso login --profile primary-micahrl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# I use the same process to create profiles for all accounts that I added this IAM Identity Center user to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws configure sso
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also log in to the &amp;ldquo;start URL&amp;rdquo; on the web and get access to any account with delegated credentials&lt;/p&gt;
&lt;p&gt;All of this is free!&lt;/p&gt;
&lt;h2 id=&#34;update-adding-a-new-account&#34;&gt;Update: adding a new account&lt;/h2&gt;
&lt;p&gt;Now, I add a new account for each discrete project.
To do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log in to the root organization&lt;/li&gt;
&lt;li&gt;AWS Organizations application
-&amp;gt; (global region)
-&amp;gt; AWS accounts in the sidebar
-&amp;gt; Add an AWS account&lt;/li&gt;
&lt;li&gt;Create the account with an appropriate &lt;code&gt;me+aws-PROJECT@micahrl.com&lt;/code&gt; email address&lt;/li&gt;
&lt;li&gt;IAM Identity Center application
-&amp;gt; my primary IAM IC region (&lt;code&gt;us-east-2&lt;/code&gt; at the time of this writing)
-&amp;gt; AWS accounts in the sidebar
-&amp;gt; Select the new account and click Assign users or groups
-&amp;gt; Select my user and click Next
-&amp;gt; Select the &lt;code&gt;AdministratorAccess&lt;/code&gt; permission set and click next
-&amp;gt; Submit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This creates the account,
and gives my primary user the ability to manage it,
so that it is available on the Start URL.&lt;/p&gt;
&lt;p&gt;To add it to the command line with &lt;code&gt;aws sso login&lt;/code&gt;,
run &lt;code&gt;aws configure sso&lt;/code&gt; and give it a unique name,
as described above.&lt;/p&gt;
&lt;h2 id=&#34;update-iam-user-and-role-access-to-billing-information-on-root-account&#34;&gt;Update: &amp;ldquo;IAM user and role access to Billing information&amp;rdquo; on root account&lt;/h2&gt;
&lt;p&gt;This all works great,
but the IAM user didn&amp;rsquo;t have access to billing information in the root account.
In the &amp;ldquo;Billing and Cost Management&amp;rdquo; app in the console,
it would show &lt;code&gt;Access denied&lt;/code&gt; for all items for the root account only.&lt;/p&gt;
&lt;p&gt;To fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log in as the root user for the primary account&lt;/li&gt;
&lt;li&gt;Billing and Cost Management
-&amp;gt; Account
-&amp;gt; &amp;ldquo;IAM user and role access to Billing [sic] information&amp;rdquo; section
-&amp;gt; Activate IAM Access&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This seems to be on by default for new sub-accounts,
but is off by default for the root account.&lt;/p&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/aws-account-hygiene/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Fandom considered harmful</title>
      <link>https://com.micahrl.me/blog/fandom-considered-harmful/</link>
      <pubDate>Mon, 06 Oct 2025 23:00:00 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/fandom-considered-harmful/</guid>
      <description>
&lt;p&gt;My definition of a &amp;ldquo;fan&amp;rdquo; is a person who makes something a core part of their identity.
Colloquially, this definition is intertwined with that of the enthusiast and the supporter,
but I want to keep those other concepts separate.
Enthusiasts might know all the stats and have a good time at live events,
and supporters might invest resources toward a preferred outcome,
but fans make their objects of interest part of who they are.&lt;/p&gt;
&lt;p&gt;And I think that people are far too cavalier about what they allow into their identity.&lt;/p&gt;
&lt;p&gt;Entertainers, sports teams, and corporations do not belong in your core.
They change for reasons you have no control over,
and they have no duty of care to you.
These things all have some business or power-related purpose.
That&amp;rsquo;s not derogatory &amp;mdash;
money and power are morally neutral things,
and it only makes sense that part of our society is organized around them.
But it makes them unfit for stewardship of a whole human being.&lt;/p&gt;
&lt;p&gt;Ben Collins-Sussman had this clarity about being laid off from Google, when he said:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://social.clawhammer.net/blog/posts/2024-01-10-GoogleExitLetter/&#34;&gt;
    Please understand: &lt;mark&gt;&lt;em&gt;Google is not a person&lt;/em&gt;&lt;/mark&gt;.
    It’s many groups of people following locally-varying processes, rules, and culture.
    To that end, it makes no sense to either love or be angry at “Google”;
    it’s not a consciousness, and it has no sense of duty nor debt.
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    Ben Collins-Sussman,
    &lt;a
      href=&#34;https://social.clawhammer.net/blog/posts/2024-01-10-GoogleExitLetter/&#34;
      data-local-archive=&#39;warchive/20240117-140456-faq-on-leaving-google&#39;
    &gt;FAQ on leaving Google&lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Brian Cantrill has a great admonishment coming from his time at Sun as it was being purchased by Oracle:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://youtu.be/-zRN7XLCRhc&amp;t=2306s&#34;&gt;
    &lt;mark&gt;Do not fall into the trap of anthropomorphising Larry Ellison&lt;/mark&gt;. You need to think of Larry Ellison the way you think of a lawnmower. You don’t anthropomorphize your lawnmower, the lawnmower just mows the lawn, you stick your hand in there and it’ll chop it off, the end. You don’t think “oh, the lawnmower hates me” — lawnmower doesn’t give a shit about you, lawnmower can’t hate you. Don’t anthropomorphize the lawnmower. Don’t fall into that trap about Oracle.
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    Brian Cantrill,
    &lt;a href=&#34;https://www.youtube.com/watch?v=-zRN7XLCRhc&amp;t=2306s&#34;&gt;LISA11 - Fork Yeah! The Rise and Development of illumos at 38:26&lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;But I think this stops short.
Employees should not take Larry Ellison&amp;rsquo;s actions personally
&lt;em&gt;because he is acting on behalf of Oracle&lt;/em&gt;.
I think Brian is trying to imply that Larry has low moral character here,
which I have no opinion on;
it may well be true.
But you should never treat a corporation as a person,
whether the individuals that make it up are individually upright or depraved.&lt;/p&gt;
&lt;p&gt;Brent Simmons arrives at the same conclusion about Apple.&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://inessential.com/2024/01/17/corporations_are_not_to_be_loved&#34;&gt;
    But I need to remember, now and again, that Apple is a corporation, and &lt;mark&gt;corporations aren’t people, and they can’t love you back&lt;/mark&gt;. You wouldn’t love GE or Exxon or Comcast — and you shouldn’t love Apple. It’s not an exception to the rule: there are no exceptions.
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    Brent Simmons,
    &lt;a
      href=&#34;https://inessential.com/2024/01/17/corporations_are_not_to_be_loved&#34;
      data-local-archive=&#39;warchive/20240117-140602-brent-simmons-corporations-are-not-to-be-loved&#39;
    &gt;Corporations Are Not To Be Loved&lt;/a&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Eric Schwarz links to that post and adds an interesting observation:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://schwarztech.net/snippets/corporations-are-not-to-be-loved&#34;&gt;
    &lt;mark&gt;My relationship with Apple is a lot like following a sports team&lt;/mark&gt;...
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    Eric Schwarz,
    &lt;a
      href=&#34;https://schwarztech.net/snippets/corporations-are-not-to-be-loved&#34;
      data-local-archive=&#39;warchive/20240117-140707-eric-schwarz-corporations-are-not-to-be-loved&#39;
    &gt;Snippet: Corporations Are Not To Be Loved&lt;/a&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As a sports outsider, this captures what&amp;rsquo;s so strange to me about sports.
Like corporations, teams are not people.
Actually, not just &amp;ldquo;like&amp;rdquo; corporations;
teams &lt;em&gt;are&lt;/em&gt; corporations whose business happens to be sports.
A team decision might be inconvenient,
but there is no need for this:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://www.espn.com/mlb/story/_/id/41386662/fans-goodbye-oakland-leaving-coliseum-moving-las-vegas&#34;&gt;
    Even more than the sadness, even more than &lt;mark&gt;the anger and the despair and the disgust&lt;/mark&gt;, there is loneliness.
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    Tim Keown,
    &lt;a href=&#34;https://www.espn.com/mlb/story/_/id/41386662/fans-goodbye-oakland-leaving-coliseum-moving-las-vegas&#34;&gt;
      Oakland A&#39;s fans say painful farewell ahead of move to Las Vegas
    &lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Sadness makes sense, to a point, as the enthusiasts are losing something they enjoy.
Loneliness makes sense for some, as attending sports live can be a communal experience.
But anger and despair and disgust?
You don&amp;rsquo;t have to live that way.
This reminds me of some friends I had when I was a kid.
Their dad would be in a bad mood for &lt;em&gt;three days&lt;/em&gt; if the University of Texas lost a football game.
You don&amp;rsquo;t have to live that way, either
(and your family deserves better).&lt;/p&gt;
&lt;p&gt;John Gruber recently wrote of his feelings about decisions that Tim Cook made:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://daringfireball.net/2025/08/gold_frankincense_and_silicon&#34;&gt;
    Did Cook’s Oval Office display of fealty and his grotesque golden gift make you feel something? Did it engender an emotional response? Grossed out, perhaps? A little &lt;mark&gt;sick&lt;/mark&gt;? Angry? Offended? Me too. But did you feel good — reassured? &lt;mark&gt;proud&lt;/mark&gt;? — when Cook skipped that Middle East Trump tour in May?
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    John Gruber,
    &lt;a href=&#34;https://daringfireball.net/2025/08/gold_frankincense_and_silicon&#34;&gt;
      Gold, Frankincense, and Silicon
    &lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;An enthusiast might feel offended or reassured by a CEO&amp;rsquo;s decisions,
but only a fan could feel sick or proud.
Of the fans, I ask:
How can you justify pride in something you had no part in?
And is that pride worth the feelings of sickness?&lt;/p&gt;
&lt;p&gt;As bad as this problem is in technology and sports fan circles,
its worse with celebrities.
Taylor Swift and Joe Rogan and MrBeast &lt;em&gt;are not people&lt;/em&gt;
in the context of interaction with their fans;
they are businesses, and everything above about corporations applies to them just as well.
But they come to us in a person-shaped package,
pre-anthropromorphized for our convenience.
They don&amp;rsquo;t encourage fandom out of malice
(because they are businesses, which are incapable of malice)
but because they are incentivized to do so,
because they benefit when we tie our identity to theirs.&lt;/p&gt;
&lt;p&gt;Fans of these personalities are often described as having &amp;ldquo;parasocial relationships&amp;rdquo; with them,
which is a description that I think obscures more than it illuminates.
The simpler way to say it is in our definition of &amp;ldquo;fan&amp;rdquo; from earlier:
they have made that celebrity part of their identity.
For instance:&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://www.reddit.com/r/popculturechat/comments/1l4vdsq/comment/mwd8iku/&#34;&gt;
    I think some people really need to unpack why they feel so &lt;mark&gt;betrayed&lt;/mark&gt; by her not being a “lesbian”...
  &lt;/blockquote&gt;
  &lt;figcaption&gt;
    u/PurpleCentaur on
    &lt;a href=&#34;https://www.reddit.com/r/popculturechat/comments/1l4vdsq/comment/mwd8iku/&#34;&gt;reddit&lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A celebrity may or may not be deceitful (no comment on this particular case),
but only a fan can be betrayed.
(Blocked and Reported has a segment in a
&lt;a href=&#34;https://www.blockedandreported.org/p/premium-the-attempted-cancellation&#34; rel=&#34;external&#34;&gt;premium episode&lt;/a&gt;
with more examples of this particular category of fan reaction.)&lt;/p&gt;
&lt;p&gt;Because the fan internalizes the celebrity,
whatever the celebrity does becomes something that the &lt;em&gt;fan&lt;/em&gt; has to answer for,
something that &lt;em&gt;they judge themselves&lt;/em&gt; for.&lt;/p&gt;
&lt;figure class=&#34;quotefig&#34;&gt;
  &lt;blockquote cite=&#34;https://www.koreaboo.com/news/korean-netizens-disbelief-fan-posting-handwritten-apologies-behalf-nct-renjun/&#34;&gt;
    Hello I am a middle schooler NCTzen. First, &lt;mark&gt;I apologize for the damages caused by Renjun’s actions&lt;/mark&gt;. He has been sick and having a hard time lately, so I think his actions came out first.  I heard you are receiving much hate from fans despite him admitting his wrongdoing and apologizing. I also apologize for the damage received from thoughtless fans.&lt;/blockquote&gt;
  &lt;figcaption&gt;
    Anonymous K-Pop fan quoted in Koreaboo,
    &lt;a href=&#34;https://www.koreaboo.com/news/korean-netizens-disbelief-fan-posting-handwritten-apologies-behalf-nct-renjun/&#34;&gt;
      Korean Netizens In Utter Disbelief At Fan Posting A Handwritten Apology On Behalf Of NCT’s Renjun
    &lt;/a&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;An empathetic aficionado might care for victims of a celebrity&amp;rsquo;s thoughtlessness,
but only a fan could personally apologize for it.&lt;/p&gt;
&lt;p&gt;Instead, you can opt out.
Enjoy Linux or the New England Patriots or Chris Rock
without making those things part of who you are.
I tend to think those things are just expressions of something deeper anyway,
and &lt;span class=&#34;nocheck&#34;&gt;that that&lt;/span&gt; deeper thing can sometimes even be sublime.
Two examples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I value the tradeoffs that Apple has made to protect my privacy in iOS,
because I believe in individual dignity,
and privacy is a part of respecting that.
I &lt;a href=&#34;https://com.micahrl.me/blog/slippery-slopes-bright-lines/&#34;&gt;fear&lt;/a&gt; that one day Apple might lessen that protection.
If my fears are realized, I&amp;rsquo;ll be frustrated at my diminished choices,
but because I&amp;rsquo;m not a fan of Apple, my sense of self would remain unscathed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To me, the protections defined in the US Constitution are truly noble.
I don&amp;rsquo;t need to be a fan of the Founding Fathers
to feel stirred by the righteousness of the principles behind that document,
and by keeping those flawed humans out of my sense of who I am,
I feel no compulsion to explain away their faults, or accept them into myself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That freedom is enough to make me walk away from a fan identity altogether.&lt;/p&gt;
&lt;!-- NOTE TO SELF: Future article ideas

Political parties and agendas and bumper stickers are also not good stores of self.
One should not be a fan of abortion, but of autonomy;
one should not be a fan of AOC, but

---

Save your love for things that can love you back.

What goes there instead?

- values: equality, freedom of speech, charity
- people you are in a relationship with and are invested in you: your family, your wife, your friends. the test for this is sacrifice.
- subjects, areas of study: mathematics, computers, Magic the Gathering (not players), 20th century Russian literature, football as an abstract sport (not teams or players)

---

To adopt this:

- Gives you the freedom to engage in discussions about fraught topics without losing yourself,
  cf [Keep Your Identity Small](https://paulgraham.com/identity.html)

--&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/fandom-considered-harmful/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Deepfakes: just rip the bandaid off</title>
      <link>https://com.micahrl.me/blog/deepfakes-rip-bandaid-off/</link>
      <pubDate>Tue, 30 Sep 2025 14:00:00 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/deepfakes-rip-bandaid-off/</guid>
      <description>
&lt;p&gt;I roll my eyes every time someone obsequiously mentions the potential for deepfakes to &amp;ldquo;do harm&amp;rdquo;,
which has been causing me eye strain lately.&lt;/p&gt;
&lt;p&gt;The whole concept of a &amp;ldquo;deepfake&amp;rdquo; is bankrupt; it&amp;rsquo;s just a lie in a new format.
We put video on a pedestal,
and now that the overwhelming wave of automation has knocked it down&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;,
we need to stop wringing our hands and accept the new reality.
Video can&amp;rsquo;t be trusted.
Society has to adapt &amp;mdash; without leaning on censorship.&lt;/p&gt;
&lt;p&gt;We are strong enough to survive
a Google Docs that doesn&amp;rsquo;t interfere with text generation,
and a Photoshop that doesn&amp;rsquo;t interfere with still image generation,
and goddammit even an OpenAI Sora or &lt;span class=&#34;nocheck&#34;&gt;Google Veo&lt;/span&gt; that doesn&amp;rsquo;t interfere with video generation.
Video isn&amp;rsquo;t special.&lt;/p&gt;
&lt;p&gt;The sharp edge of this is ugly, but there&amp;rsquo;s nothing new about that.
The sharp edge of text and still image generation was already ugly.
The legal and social tools we have to deal with vile speech don&amp;rsquo;t need to be changed to prevent it.
Instead, we should change them to revert video to the mean:
treat it just like they already treat text and still images.
Video is now no better than rumor.
It shouldn&amp;rsquo;t hold up in court of law or court of public opinion any more.&lt;/p&gt;
&lt;p&gt;The alternative is to keep video on the pedestal,
and prohibit lying by policy.
This is tempting because it is a direct representation of what we really want:
for lies to be transparent,
to be able to trust whatever we read or hear or watch.
But it&amp;rsquo;s stupid because it&amp;rsquo;s impossible.
You can&amp;rsquo;t prohibit lies, and we wouldn&amp;rsquo;t want to live in a society that could.&lt;/p&gt;
&lt;p&gt;Counterintuitively, when we accept that,
we&amp;rsquo;ll provide better for those wounded by all the sharp edges.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;An utterly predictable outcome, discussed speculatively for decades.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/deepfakes-rip-bandaid-off/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Idempotently creating windows with AeroSpace</title>
      <link>https://com.micahrl.me/blog/aerospace-idempotently-create-windows/</link>
      <pubDate>Thu, 25 Sep 2025 06:51:36 -0500</pubDate>
      <guid>https://com.micahrl.me/blog/aerospace-idempotently-create-windows/</guid>
      <description>
&lt;p&gt;I started using &lt;a href=&#34;https://github.com/nikitabobko/AeroSpace&#34; rel=&#34;external&#34;&gt;AeroSpace&lt;/a&gt; on macOS a few months ago.
It&amp;rsquo;s a neat paradigm that works &lt;em&gt;pretty&lt;/em&gt; well,
despite working against any UX goals Apple could be said to have.
The keyboard-driven navigation has been worth putting up with the inconveniences and bugs so far to me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve recently been looking into idempotent window creation &amp;mdash;
meaning, creating a new window if and only if a window for that purpose doesn&amp;rsquo;t already exist.
For instance, a given project might always have at least three windows:
VS Code, a Terminal for normal interaction, and a Terminal running Claude Code.
When I start working on a project, I will want to open all those windows,
but if I was working on it before, I don&amp;rsquo;t want to open new copies of them.
To do this, I have tricks for both Terminal and VS Code.&lt;/p&gt;
&lt;h2 id=&#34;finding-an-existing-window-by-its-title&#34;&gt;Finding an existing window by its title&lt;/h2&gt;
&lt;p&gt;AeroSpace can list window titles by their application ID;
combine this functionality with grep to find any application window by its title regex.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Find a window ID based on its application bundle ID and a title regex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find_app_window_id&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;app_bundle_id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;title_regex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    aerospace list-windows --app-bundle-id &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$app_bundle_id&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --monitor all --format &lt;span class=&#34;s1&#34;&gt;&amp;#39;%{window-id} %{window-title}&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt; -r line&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;wid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;%% *&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nv&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;#* &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$title&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -qE &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$title_regex&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wid&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The application bundle ID is a macOS concept.
AeroSpace will list all open applications with &lt;code&gt;aerospace list-apps&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; aerospace list-apps
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;679   | com.apple.Terminal                                           | Terminal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;44453 | com.microsoft.VSCode                                         | Code
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;68472 | org.mozilla.firefox                                          | Firefox
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# ... etc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;finding-existing-terminal-windows&#34;&gt;Finding existing Terminal windows&lt;/h2&gt;
&lt;p&gt;The trick is to use xterm control sequences to embed a unique string into your Terminal&amp;rsquo;s title bar,
then find that a window with that unique string via the above trick.&lt;/p&gt;
&lt;p&gt;I use Unicode glyphs to make sure that no normal Terminal window will contain the title sequence.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The glyph for my primary shell terminal for a given project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;termglyph&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;❯&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The glyph for my Claude Code terminal for a given project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;llmglyph&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;∑&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I combine those glyphs with a short project identifier,
ending up with Terminal windows that contain &lt;code&gt;❯ me.micahrl.com&lt;/code&gt; or &lt;code&gt;∑ dhd&lt;/code&gt; in them.&lt;/p&gt;
&lt;p&gt;I also need a way to run commands on a new Terminal window,
both to set this title,
and to cd to the project dir, run Claude, etc.
Fortunately this already exists via AppleScript.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Open a new Terminal window running the given script.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;open_terminal_with_script&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    osascript -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;tell application &amp;#34;Terminal&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    do script &amp;#34;&amp;#39;&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$script&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    activate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;end tell&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Calling this directly like &lt;code&gt;open_terminal_with_script &#39;echo Hi; cd /tmp&#39;&lt;/code&gt; works ok,
but as you can see there will be issues with quoting.
The best way to sidestep that is to use a temporary file, and dot-source it.&lt;/p&gt;
&lt;p&gt;Putting that all together, we get:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Move or open a Terminal window by a special title, and run a command in it.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Rely on a title that should be unique in any possible Terminal title text.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# It is recommended to use a special glyph to make it unique.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Search for an existing window with that title, and if found, move it to the given workspace.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If not found, open a new Terminal window running the given command,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# and set its title to the given title with a terminal escape sequence.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (Note that setting the title will only actually set part of the window title,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# depending on your Terminal settings.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;terminal_move_or_open&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;cmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$3&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Create a temp file to hold the script to run.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# This gets around quoting issues with osascript.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# The script will delete itself before doing any work ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# it&amp;#39;s better to do it that way than try to do it from the parent shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# where we might delete it before Terminal has a chance to run it.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# TMPDIR on macOS is guaranteed to exist and be writable, and allow no other users.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;tmpfile&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TMPDIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/terminal_move_or_open_&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    cat &amp;gt; &lt;span class=&#34;nv&#34;&gt;$tmpfile&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; ENDSCRIPT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;# Run with set -x so the cmd is shown to the user when the terminal opens.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;set -x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;rm -f $tmpfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;printf &amp;#39;\033]0;%s\007&amp;#39; &amp;#39;$title&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;$cmd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;set +x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;ENDSCRIPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;existing_terminal&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;find_app_window_id &lt;span class=&#34;s1&#34;&gt;&amp;#39;com.apple.Terminal&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$title&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n1 &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$existing_terminal&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        aerospace move-node-to-workspace --window-id &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$existing_terminal&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$workspace&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# Run by dot-sourcing so that commands like &amp;#39;cd&amp;#39; will work&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        open_terminal_with_script &lt;span class=&#34;s2&#34;&gt;&amp;#34;. &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tmpfile&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I call it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Local directories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;terminal_move_or_open t &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;termglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; me.micahrl.com&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;cd &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;terminal_move_or_open t &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;llmglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; me.micahrl.com&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;cd &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#39;; /Users/mrled/.bun/bin/claude;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remote directories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;terminal_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;termglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; understatement1&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh chineseroom.micahrl.com -t &amp;#39;cd ~/work/understatement1 &amp;amp;&amp;amp; exec \$SHELL -l&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;terminal_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;llmglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; undersetatement1&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh chineseroom.micahrl.com -t &amp;#39;cd ~/work/understatement1 &amp;amp;&amp;amp; exec \$SHELL -l -i -c \&amp;#34;/home/callista/.local/bin/claude --dangerously-skip-permissions\&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;finding-existing-vs-code-windows&#34;&gt;Finding existing VS Code windows&lt;/h2&gt;
&lt;p&gt;This turns out to be really easy,
because VS Code always puts its project directory name in the title bar,
and we already have a function for finding an app&amp;rsquo;s window based on its title bar.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vscode_move_or_open&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;workspace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;window_regex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$3&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;existing_vscode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;find_app_window_id &lt;span class=&#34;s1&#34;&gt;&amp;#39;com.microsoft.VSCode&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$window_regex&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n1  &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$existing_vscode&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        aerospace move-node-to-workspace --window-id &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$existing_vscode&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$workspace&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# ?windowId=_blank forces a new window.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        open &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$uri&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;?windowId=_blank&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We use VS Code&amp;rsquo;s support for opening URIs because this allows us to specify remote project directories too.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# A local project directory in my homedir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vscode_move_or_open t &lt;span class=&#34;s1&#34;&gt;&amp;#39;me\.micahrl\.com$&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vscode://file/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# A remote project directory over SSH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vscode_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;understatement1 \[SSH: chineseroom.micahrl.com&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;vscode://vscode-remote/ssh-remote+chineseroom.micahrl.com/home/callista/work/understatement1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-i-use-this&#34;&gt;How I use this&lt;/h2&gt;
&lt;p&gt;I have functions for all my project workspaces that launch the IDE and the terminals, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;workspace_me_micahrl_com&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    aerospace workspace t
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    vscode_move_or_open t &lt;span class=&#34;s1&#34;&gt;&amp;#39;me\.micahrl\.com$&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;vscode://file/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    terminal_move_or_open t &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;termglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; me.micahrl.com&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;cd &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    terminal_move_or_open t &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;llmglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; me.micahrl.com&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;cd &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/mrldata/Repositories/me.micahrl.com&amp;#39;; /Users/mrled/.bun/bin/claude;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;workspace_understatement_dev_1&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    aerospace workspace w
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    vscode_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s1&#34;&gt;&amp;#39;understatement1 \[SSH: chineseroom.micahrl.com&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s1&#34;&gt;&amp;#39;vscode://vscode-remote/ssh-remote+chineseroom.micahrl.com/home/callista/work/understatement1?windowId=_blank&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    terminal_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;termglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; understatement1&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh chineseroom.micahrl.com -t &amp;#39;cd ~/work/understatement1 &amp;amp;&amp;amp; exec \$SHELL -l&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    terminal_move_or_open w &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;llmglyph&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; undersetatement1&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh chineseroom.micahrl.com -t &amp;#39;cd ~/work/understatement1 &amp;amp;&amp;amp; exec \$SHELL -l -i -c \&amp;#34;/home/callista/.local/bin/claude --dangerously-skip-permissions\&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;They&amp;rsquo;re invoked from a &lt;a href=&#34;https://github.com/mrled/dhd/blob/master/opt/bin/aerospace-workspace.sh&#34; rel=&#34;external&#34;&gt;script&lt;/a&gt;
by key bindings in my AeroSpace &lt;a href=&#34;https://github.com/mrled/dhd/blob/master/hbase/.config/aerospace/aerospace.toml&#34; rel=&#34;external&#34;&gt;configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;whats-missing&#34;&gt;What&amp;rsquo;s missing&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t have a good way to do this for Firefox windows &amp;mdash;
what I&amp;rsquo;d like is a way to query a window for all its tabs&amp;rsquo; URLs,
but I don&amp;rsquo;t know how to do that.&lt;/p&gt;
&lt;h2 id=&#34;other-windows&#34;&gt;Other windows&lt;/h2&gt;
&lt;p&gt;All the other app windows I use daily tend to be one window per app,
so AeroSpace&amp;rsquo;s &lt;code&gt;on-window-detected&lt;/code&gt; &lt;a href=&#34;https://nikitabobko.github.io/AeroSpace/guide#on-window-detected-callback&#34; rel=&#34;external&#34;&gt;callback&lt;/a&gt;
works fine for them.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;on-window-detected&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;app-id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;com.apple.ActivityMonitor&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move-node-to-workspace 10&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr /&gt;&lt;p&gt;Write a comment on &lt;a href=&#34;https://com.micahrl.me/blog/aerospace-idempotently-create-windows/&#34;&gt;the original post&lt;/a&gt;.&lt;/p&gt;
      </description>
    </item></channel>
</rss>
