<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:webfeeds="http://webfeeds.org/rss/1.0">
<author>
  <name>Paul Landers</name>
  <uri>https://ers.land/</uri>
</author>
<generator uri="https://gohugo.io">Hugo 0.164.0</generator>
<id>https://ers.land/</id>
<link rel="self" type="application/atom+xml" href="https://ers.land/feed.xml" hreflang="en-us"/>
<link rel="alternate" type="text/html" href="https://ers.land/" hreflang="en-us"/>
<logo>https://ers.land/site/icon/boat-round.svg</logo>
<subtitle>Paul Landers&#39; hobbies and software</subtitle>
<title>Paul Landers</title>
<updated>2026-09-09T19:23:53+00:00</updated>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2026/site-upgrades/</id>
  <link rel="alternate" href="https://ers.land/blog/2026/site-upgrades/"/>
  <title>Site Upgrades</title>
  <published>2026-08-22T22:00:00-04:00</published>
  <updated>2026-08-22T22:00:00-04:00</updated>
  <summary type="html">Over the summer, I have made some substaintial upgrades to the website.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;h2 id=&#34;a-new-website-address-again&#34;&gt;A New Website Address (Again)&lt;/h2&gt;&#xA;&lt;p&gt;I know I&amp;rsquo;ve done this quite a few times before.&#xA;And I always think it will be the last time, but it has not been.&#xA;Maybe &lt;code&gt;ers.land&lt;/code&gt; will be my final blog url? I guess I can&amp;rsquo;t say for sure.&lt;/p&gt;&#xA;&lt;p&gt;For a while, I had become less than happy with &lt;code&gt;p3l6.dev&lt;/code&gt;, for a few main reasons: The numbers, lowercase ambiguity, unclarity to non-tech folks.&#xA;Very few other blog urls or urls in general use numerals, most stick to just letters, which in fact was one reason this label was not in use at all.&#xA;I&amp;rsquo;d often worry that the lowercase &lt;code&gt;l&lt;/code&gt; would be read as a &lt;code&gt;1&lt;/code&gt;, even so far as that I actually registered &lt;code&gt;p316.dev&lt;/code&gt; as well. This ambiguity especially would bother me during job searches when I&amp;rsquo;d be expecting people to be able to find my resume easily.&#xA;To the same end, it was also difficult to spell out loud or over the phone.&#xA;Lastly, I&amp;rsquo;d constantly have to explain &lt;code&gt;kubernetes -&amp;gt; k8s&lt;/code&gt; type abbreviations to non-tech folks if they were interested in what the url meant.&#xA;Ironically, &lt;a href=&#34;/blog/2023/blog-rebranding&#34;&gt;my last post on this topic&lt;/a&gt; was very excited about &lt;code&gt;p3l6&lt;/code&gt;, and so I do plan to keep using it for usernames on other websites.&lt;/p&gt;&#xA;&lt;p&gt;A while back I picked up &lt;code&gt;ers.land&lt;/code&gt;, mainly because it made a nice email (&lt;a href=&#34;mailto:paul@ers.land&#34;&gt;paul@ers.land&lt;/a&gt;).&#xA;I like that it is as succinct as possible, while still containing my whole name!&#xA;After sitting on it for a while, I decided that it would make a great primary blog url too, it matches all the criteria that annoyed me about the previous one: obvious meaning, short, easy to spell and read, no numbers.&#xA;Of course, making that decision opened up a whole can of worms that I would need to work through first!&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-new-logo&#34;&gt;A New Logo&lt;/h2&gt;&#xA;&lt;p&gt;One main blocker to move to the new address was the icon, which was just a wordmark for p3l6.&#xA;If I moved the address, I&amp;rsquo;d want a more fitting icon to the new site.&#xA;And why should the icon be tied to the site address, anyway? This made it unsuitable for &amp;ldquo;profile icons&amp;rdquo; or &amp;ldquo;avatars&amp;rdquo; elsewhere.&#xA;I wanted to make something that could be both, the site icon and a universal avatar.&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;inline double&#34;&gt;&lt;img src=&#34;/images/logos/p3l6.svg&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;P3L6 wordmark&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;P3L6 wordmark&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure class=&#34;inline double&#34;&gt;&lt;img src=&#34;/site/icon/boat-round.svg&#34;&#xA;&#x9;&#x9;&#x9;alt=&#34;A boat&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;p&gt;New boat icon&lt;/p&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;I sketched a lot of different ideas, but in the end I went with this boat.&#xA;It is based on an art project I did in high school, which was in turn based on a symbol from the banner associated with the Scott&amp;rsquo;s confession of faith.&#xA;I used a vector sketching app for iPad to get my rough ideas out, but then created similar svg paths manually in plaintext.&#xA;Here&amp;rsquo;s an example, the sail portion of the icon:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;lt;!-- sail --&amp;gt;&lt;/span&gt;&#xA;&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;lt;path&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;na&#34;&gt;d=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;M 25 8&#xA;&lt;/span&gt;&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;     C 34 3 58 6 64 9&#xA;&lt;/span&gt;&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;     C 70 12 68 40 62 43&#xA;&lt;/span&gt;&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;     C 60 30 40 30 20 43&#xA;&lt;/span&gt;&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;     C 50 15 16 13 25 8 Z&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;na&#34;&gt;stroke=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#2A2E33&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;na&#34;&gt;stroke-width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0.5&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;na&#34;&gt;fill=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;url(#sail-gradient)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;na&#34;&gt;stroke-linejoin=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;round&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;hugo&#34;&gt;Hugo&lt;/h2&gt;&#xA;&lt;p&gt;Since I was making such broad changes, I revisited a previous investigation into alternative static site generators, besides jekyll.&#xA;Jekyll had been in use since the origins of the website, as that is the default for github pages.&#xA;Even though I&amp;rsquo;d upgraded to a newer version than the one pinned to github&amp;rsquo;s default, I still felt like I was pushing at the boundaries.&lt;/p&gt;&#xA;&lt;p&gt;I investigated some different options, before deciding to do a deeper dive into &lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt;.&#xA;This is the most popular generator&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; that is not based on some kind of javascript.&#xA;One of the things that I appreciated about Jekyll was not having to be have a node setup to use it (I did end up having similar version/dependency issues with the ruby installation of Jekyll, though).&lt;/p&gt;&#xA;&lt;p&gt;Migrating to Hugo was a bit of a learning curve; here&amp;rsquo;s some of good things about it:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Single binary install, no dependency or virtual environment management.&lt;/li&gt;&#xA;&lt;li&gt;A better folder layout. This was my main complaint with Jekyll: the collection folders (ie &lt;code&gt;_posts/ _sass/ _recipes/&lt;/code&gt;) made a lot of clutter, and the content did not match it&amp;rsquo;s own url structure. Instead of Jekyll&amp;rsquo;s &amp;ldquo;blog-aware&amp;rdquo;, Hugo makes it easy to enumerate subcontent from any particular folder.&lt;/li&gt;&#xA;&lt;li&gt;Markdown improvements: more supported with newer features and better customization hooks. Such as callouts/admonitions, marks, alignment with github-flavored-markdown.&lt;/li&gt;&#xA;&lt;li&gt;While the concept of sections was hard to understand at first, it is very powerful. It does mean that in practice I have more layout files than I did before, and yet the whole site is more cohesive in theme, as an page can be a &amp;ldquo;section&amp;rdquo; or listing of the descendent pages.&lt;/li&gt;&#xA;&lt;li&gt;The base language is golang. In practice this didn&amp;rsquo;t affect me (as I don&amp;rsquo;t know much golang) other than learning the go template format, which is different but more capable than the Jekyll templates.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;One oddity is that by default, templating cannot go into content pages. This is a safety feature that can be turned off for single author sites, but I left it on anyway as it seemed to force better habits of separating page design from content.&lt;/li&gt;&#xA;&lt;li&gt;Since the site didn&amp;rsquo;t rely on ruby anymore to run, I also migrated the rakefile to a &lt;a href=&#34;https://taskfile.dev&#34;&gt;taskfile&lt;/a&gt;. While similar, this file describes the tasks in yaml, similar to CI workflows. I had not used it format before, but it seems good for a basic command runner, and aligns with Hugo on golang.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;layout-changes&#34;&gt;Layout Changes&lt;/h2&gt;&#xA;&lt;p&gt;As noted above, hugo allows all content to exactly match it&amp;rsquo;s final url destination.&#xA;In addition, any folder can become a section, where subpages are enumerated as a list.&#xA;So I took this opportunity to move and restructure a lot of the content.&lt;/p&gt;&#xA;&lt;p&gt;Much of the content was not actually even accessible from the site menu previously, because there was so much miscellaneous.&#xA;I made an effort to regroup everything into logical&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; paths, and align the menus to this structure.&#xA;In addition, the menu now supports two layers, so section pages like &lt;a href=&#34;/hobby&#34;&gt;Hobbies&lt;/a&gt; will display their sub-sections in the main menu.&lt;/p&gt;&#xA;&lt;p&gt;Hugo also made it easy to add breadcrumbs to the top of the site, instead of a hack I was using on the previous site to add the parent link into specific content, ie blog articles and recipes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;combining-subscription-feeds&#34;&gt;Combining Subscription Feeds&lt;/h2&gt;&#xA;&lt;p&gt;Since there was already a lot of churn, and the atom rss feed was getting a new template and url anyway, I&amp;rsquo;ve combined the previous two feeds for blog and recipes together.&#xA;I&amp;rsquo;m not sure if jekyll would have supported this, but Hugo is quite flexible.&#xA;Even though my url was changing, I did not want the feeds relative url to change, it needed to stay &lt;code&gt;/feed.xml&lt;/code&gt;.&#xA;Last, by default hugo generates RSS feeds and jekyll was generating an Atom feed. I wanted to keep that too, so I ended up with a custom template for the feed.&lt;/p&gt;&#xA;&lt;p&gt;This did take quite a bit of configuration&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; though, here is everything I had to set to get it working (in addition to the template file)&lt;/p&gt;&#xA;&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;mainSections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;blog&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;cook&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;&#xA;&lt;/span&gt;&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;mediaTypes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;application/atom+xml&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;suffixes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;xml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;&#xA;&lt;/span&gt;&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;outputFormats&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;ATOM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;mediaType&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;application/atom+xml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;baseName&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;feed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;&#xA;&lt;/span&gt;&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;outputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;home&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;s1&#34;&gt;&amp;#39;html&amp;#39;&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;atom&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;page&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;s1&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;section&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;s1&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;&#xA;&lt;/span&gt;&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;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;rss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&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;limit&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;m&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&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;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;According to &lt;a href=&#34;https://jamstack.org/generators/&#34;&gt;Jamstack&amp;rsquo;s&lt;/a&gt; sortable list of generators, which is based on number of github stars.&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;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Logical to me, in any case.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Hugo advertises as minimal configuration required. This did turn out to be true, as configuring this non-standard feed represents one third of the whole configuration file!&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/sauce/queso/</id>
  <link rel="alternate" href="https://ers.land/cook/sauce/queso/"/>
  <title>Queso</title>
  <published>2026-07-10T09:00:00-04:00</published>
  <updated>2026-07-10T09:00:00-04:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 lb&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ground beef&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;8 oz&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;velveeta, cubed&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;monterey jack, shredded&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;¼ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;salsa&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;onion, chopped&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 can&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;green chilies, drained (4oz)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;large tomato, diced&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;jalapeño, chopped&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;¼ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;cilantro&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;chili powder&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ground cumin&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;dried oregano&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;red pepper flakes&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Cook beef and onion with salt and pepper in oil (7-9 min). Drain grease.&lt;/li&gt;&#xA;&lt;li&gt;Stir in spices.&lt;/li&gt;&#xA;&lt;li&gt;Stir in tomators, chilies, salsa.&lt;/li&gt;&#xA;&lt;li&gt;Stir in cheeses, until melted (3-4 min).&lt;/li&gt;&#xA;&lt;li&gt;Remove from heat and add jalapeno and cilantro.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;  &lt;blockquote class=&#34;alert alert-source&#34;&gt;&#xA;    &lt;p class=&#34;alert-title&#34;&gt;&#xA;        Source&#xA;    &lt;/p&gt;&#xA;    &lt;p&gt;Dolly Parton Cookbook&lt;/p&gt;&#xA;  &lt;/blockquote&gt;&#xA;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Consider swapping beef for chorizo&lt;/li&gt;&#xA;&lt;li&gt;It is pretty meaty, consider using less beef&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2026/color-theme/</id>
  <link rel="alternate" href="https://ers.land/blog/2026/color-theme/"/>
  <title>Creating a Custom Color Theme</title>
  <published>2026-05-27T20:00:00-04:00</published>
  <updated>2026-05-27T20:00:00-04:00</updated>
  <summary type="html">I have formalized my custom color palette to use for this site and syntax highlighting.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;I have tried to create syntax highlighting (or terminal color themes) in the past, but always abandoned them.&#xA;They are quite difficult to create, if you want a result that looks halfway decent.&#xA;Previously, I approached it in a difficult way; such as trying to force xcode&amp;rsquo;s default theme into basic ansi terminal colors, or other overconstrained goals.&#xA;The results always ended up inconsistent and visually unpleasant.&lt;/p&gt;&#xA;&lt;p&gt;On this attempt, two things clicked. The first was to use the &lt;a href=&#34;https://en.wikipedia.org/wiki/Oklab_color_space&#34;&gt;OKLCH color space&lt;/a&gt;, in which the lightness and chroma components are based on human perception. This is much different from RGB or HSL, because if colors have some of the same values, they will appear similar!&#xA;Exactly what you need for making a consistent looking color theme.&lt;/p&gt;&#xA;&lt;p&gt;My second realization was about what is most important about a syntax highlighting theme. It is not the color values themselves, as much as which language elements those colors represent.&#xA;Anytime I would try a popular theme from the internet, what would end up bothering me was that the strings were not red, or the comments were green, for example. As a seasoned xcode user, I am partial to the way the default colors are used, and anything else tends to seem off-putting.&#xA;Granted, I could have taken any off-the-shelf theme, such as Dracula, and changed the color assignments to match my preferences.&#xA;However, having to modify the theme defeats the main benefit of these popular themes: being are already available for many programs!&#xA;If I was already going to customize them, I might as well go full custom with changing color codes as well.&lt;/p&gt;&#xA;&lt;p&gt;So, while I was doing fine with the three random colors given to this blog, the seven dracula colors given to the terminal, and the nine default colors given to xcode; much like sauron, I thought it would be better to create one universal color theme to rule them all.&lt;/p&gt;&#xA;&lt;h2 id=&#34;examples&#34;&gt;Examples&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A &lt;a href=&#34;/site/mist/preview&#34;&gt;preview page&lt;/a&gt; contains example swatches for syntax highlighting themes and the full palette.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;a href=&#34;/site/mist&#34;&gt;main theme page&lt;/a&gt; contains all the hex codes and syntax assignments.&lt;/li&gt;&#xA;&lt;li&gt;A code highlighting example:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;/// A terrible prime number checker&lt;/span&gt;&#xA;&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;/// - Param number: an integer to check&lt;/span&gt;&#xA;&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;/// - Returns: true if the number is prime (eventually)&lt;/span&gt;&#xA;&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;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;isPrime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Int&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;nb&#34;&gt;Bool&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&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;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&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 class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;o&#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;&#xA;&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;guard&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x&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;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;n&#34;&gt;Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; is divisible by &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;\(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&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;kc&#34;&gt;false&lt;/span&gt;&#xA;&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;&#xA;&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;&#xA;&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;kc&#34;&gt;true&lt;/span&gt;&#xA;&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;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;development-process&#34;&gt;Development Process&lt;/h2&gt;&#xA;&lt;p&gt;I got started on this after reading &lt;a href=&#34;https://jvns.ca/blog/2026/05/04/css-colour-palettes/&#34;&gt;Julia Evan&amp;rsquo;s blog post&lt;/a&gt; about color themes.&#xA;It reminded me that I too had once used tailwind on my blog, but after having moved on I had no true replacement for the color palette.&#xA;Her blog made me aware of &lt;a href=&#34;https://stephango.com/flexoki&#34;&gt;Flexoki&lt;/a&gt;, which was novel to me in that it combined syntax highlighting and a website palette into the same theme.&lt;/p&gt;&#xA;&lt;p&gt;After poking around flexoki, I found a &lt;a href=&#34;https://github.com/kepano/flexoki/tree/main/_playground&#34;&gt;playground&lt;/a&gt; in its repository, which I understand the author used to extrapolate the expanded palette values based on the initial version&amp;rsquo;s basic accent colors.&#xA;I explored this playground a bit, trying various modifications: changing how it seeded the values, using a constant lightness/chroma for each color level, using a single hue to define each color.&#xA;I decided that a method using OKLCH like this would work well for my goals.&lt;/p&gt;&#xA;&lt;p&gt;Using the same color levels, names, and approximate lightness/chroma scales, I started writing &lt;a href=&#34;https://github.com/p3l6/blog/tree/main/site/mist/generate_colors.rb&#34;&gt;my own generation script&lt;/a&gt;, to convert the input arrays of lightness/chroma/hue into preview swatches and color codes. Since my constraints were a lot tighter, the script ended up fairly simple, at least for color calculation and conversions.&lt;/p&gt;&#xA;&lt;p&gt;Once the basic script was working, I started experimenting with different hues.&#xA;I used the color picker on &lt;a href=&#34;https://oklch.com&#34;&gt;oklch.com&lt;/a&gt;, and looked for hues that were similar to colors I&amp;rsquo;ve liked in the past: Xcode, Dracula, existing blog colors, etc. I picked a few colors this way, and interpolated or spaced out the remaining colors in between them.&#xA;I initially picked the background color based on Xcode&amp;rsquo;s default line highlight, and ended up using its resemblance to mist to name the theme.&lt;/p&gt;&#xA;&lt;p&gt;With the script inside my blog repository, I chose to have it output css variables and color codes directly into source files, overwriting their previous contents.&#xA;I considered running it as a custom publish step, but decided it will change so infrequently that the output can just be committed in the css and markdown.&lt;/p&gt;&#xA;&lt;p&gt;Once things were looking good on the blog, I translated it into a light theme for xcode and dark theme for terminal. Unfortunately, while dark mode was okay, the light mode was quite difficult to read! All the text looked very &amp;ldquo;washed out&amp;rdquo;.&#xA;I went about trying to adjust the lightness/chroma levels to have more contrast at the 600 level, and went in circles here for quite some time.&lt;/p&gt;&#xA;&lt;p&gt;It came down to three separate changes that wrapped up the project:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I dropped some color levels. I was using 13 levels per color, like flexoki, but 9 were sufficient for my needs. I also dropped the extra shades for &amp;lsquo;paper&amp;rsquo; and &amp;lsquo;black&amp;rsquo;, opting to just let those be the 100/900 levels of the base color.&lt;/li&gt;&#xA;&lt;li&gt;I realized that &lt;a href=&#34;https://harmonizer.evilmartians.com&#34;&gt;Harmoizer&lt;/a&gt; (which I had seen at the beginning but did not have the context yet to understand it) was exactly what I wanted to help choose lightness and chroma values. This tool considers the APCA contrast rating between text and background, to make sure text is legible.&lt;/li&gt;&#xA;&lt;li&gt;But the biggest factor was human error. I had assumed the light mode palette was the issue, since my dark mode terminal looked fine. But, in fact it was Xcode&amp;rsquo;s color picker to blame. You cannot simply enter hex codes into an Xcode theme, you must use the macOS system color picker. It defaulted to linear-rgb input instead of sRGB, which resulted in most of the colors I entered appearing significantly lighter than intended.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2026/more-backpacking-gear/</id>
  <link rel="alternate" href="https://ers.land/blog/2026/more-backpacking-gear/"/>
  <title>More Good Backpacking Gear</title>
  <published>2026-05-12T11:00:00-04:00</published>
  <updated>2026-05-12T11:00:00-04:00</updated>
  <summary type="html">On my recent backpacking trip, I took quite a few pieces of new gear. I wanted to share some of the reasons why it was great.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;As usual with my infrequent backpacking trips, by the time it comes around, I have a roundup of new equipment to take along.&#xA;Some of it is replacing worn out items, but more often it comes down to upgrades as the camping technology improves.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tent-and-trekking-poles&#34;&gt;Tent and Trekking Poles&lt;/h2&gt;&#xA;&lt;p&gt;My most important new gear this trip was a tent, the Six Moon Designs Scout. This tent uses trekking poles as the structural element.&#xA;This makes it quite lightweight, containing no poles of it&amp;rsquo;s own. It also sets up very fast, due to not having a separate rain fly.&#xA;It has good door access and lots of ventilation.&#xA;It&amp;rsquo;s unique diamond shape made it quite roomy in the parts that mattered, around where your arms naturally lay.&lt;/p&gt;&#xA;&lt;p&gt;The only downside I ran into was the requirement to have solid stakes holding the tension. One campsite of the three had very loose soil, and it was difficult to get a secure tie-down.&lt;/p&gt;&#xA;&lt;p&gt;Along with the tent, this was also the first trip in which I took my own trekking poles.&#xA;I do think it helped take some of the strain and swelling off of the hands, and generally made walking at bit more enjoyable by giving the arms something to do.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pillow&#34;&gt;Pillow&lt;/h2&gt;&#xA;&lt;p&gt;I upgraded my hiking pillow to the Nemo Fillo, as recommended by many reviewers.&#xA;It is as good as they said and made a big difference in my sleep quality.&#xA;The top layer of foam gives it home-like pillow comfort, while the the inflatable bag gives it a proper height.&lt;/p&gt;&#xA;&lt;h2 id=&#34;stove-pot&#34;&gt;Stove pot&lt;/h2&gt;&#xA;&lt;p&gt;Since my old cooking pot was cracked, I got the classic TOAKS 750ml pot.&#xA;I also switched to carrying the small fuel bottles instead of the medium size, as one nests perfectly in the pot with room for the stove on top.&#xA;I also brought a cheap fuel bottle stand from amazon, which didn&amp;rsquo;t feel essential for stability, but did keep the base of the fuel can out of the dirt (since it was going inside the cooking pot).&lt;/p&gt;&#xA;&lt;p&gt;The markings on the inside of the TOAKS are useful, and a big improvement over my previous one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;card-game&#34;&gt;Card Game&lt;/h2&gt;&#xA;&lt;p&gt;I brought a card game, Star Realms, to play in camp. This game was new to us, neither having played it before.&#xA;It is about the size of two standard card decks, for two players, and has a similar feel to magic or other battle games.&#xA;Star Realms was pretty fun, and quick to play, without having too many pieces. I would bring it along again.&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2026/axial-core-typeface/</id>
  <link rel="alternate" href="https://ers.land/blog/2026/axial-core-typeface/"/>
  <title>Axial Core Typeface</title>
  <published>2026-04-12T21:00:00-04:00</published>
  <updated>2026-06-08T21:00:00-04:00</updated>
  <summary type="html">Axial Core is a custom typeface created for handwriting, focused on reducing the number of distinct shapes.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;I have been working on a new handwriting typeface, which is aesthetically simpler than the traditional latin glyphs.&#xA;That may sound like a stretch, but at least in the way I think about the topological shapes of the letters, it is simpler.&#xA;It uses fewer distinct shapes in the glyphs, but makes more use out of rotating them.&lt;/p&gt;&#xA;&lt;h2 id=&#34;motivation&#34;&gt;Motivation&lt;/h2&gt;&#xA;&lt;p&gt;When examining the latin lowercase letters I find that many are far too dense, or take too many strokes to write.&#xA;Why are we crossing &lt;code&gt;t&lt;/code&gt;&amp;rsquo;s and dotting &lt;code&gt;i&lt;/code&gt;&amp;rsquo;s?&#xA;&lt;code&gt;e&lt;/code&gt; has three horizontal strokes in a narrow vertical space, which is overly cramped. The same is true of &lt;code&gt;s&lt;/code&gt;.&#xA;&lt;code&gt;k&lt;/code&gt; has a pen lift, unless you use the loop, in which case it is also too dense!&#xA;&lt;code&gt;q&lt;/code&gt; and &lt;code&gt;g&lt;/code&gt; are the very same shape, but with different finishing serifs.&lt;/p&gt;&#xA;&lt;p&gt;Instead, I have attempted, as much as possible: to reduce ambiguity, write each letter without lifting a pen, and avoid complex or dense shapes.&#xA;I drew inspiration from the group of letters &lt;code&gt;p d b q g&lt;/code&gt;, which all use the same basic circle-with-stem shape, flipped and rotated around.&#xA;I extended this concept to the entire alphabet.&lt;/p&gt;&#xA;&lt;p&gt;I focused on the lowercase letters only; uppercase letters complicate the system too much to consider, and can be largely irrelevant for simple notetaking.&lt;/p&gt;&#xA;&lt;h2 id=&#34;structure&#34;&gt;Structure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;the-core-shapes&#34;&gt;The Core Shapes&lt;/h3&gt;&#xA;&lt;p&gt;There are five core shapes, which each depict a vowel.&#xA;They are as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pointy half circle&lt;/li&gt;&#xA;&lt;li&gt;Quarter circle&lt;/li&gt;&#xA;&lt;li&gt;Short line&lt;/li&gt;&#xA;&lt;li&gt;Circle&lt;/li&gt;&#xA;&lt;li&gt;Half circle&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/typeface/core.png&#34; alt=&#34;Five core glyphs&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;stemmed-cores&#34;&gt;Stemmed Cores&lt;/h3&gt;&#xA;&lt;p&gt;Three of these have stemmed variants, made from combining the &amp;ldquo;short line&amp;rdquo; shape with one of the circle shapes.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Stemmed quarter circle&lt;/li&gt;&#xA;&lt;li&gt;Stemmed circle&lt;/li&gt;&#xA;&lt;li&gt;Stemmed half circle&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/typeface/stemmed.png&#34; alt=&#34;Three stemmed variations of the core glyphs&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;axial-rotations&#34;&gt;Axial Rotations&lt;/h3&gt;&#xA;&lt;p&gt;The core shapes (except short line and circle) are rotated to each cardinal direction, so that each forms a quad.&#xA;Similarly, each of the stemmed letters are be flipped to make a quad.&#xA;These six quads, plus the short line and circle make the 24 glyphs for the alphabet.&lt;/p&gt;&#xA;&lt;p&gt;In the next image, each core/stemmed letter is on the far left, followed by the rest of the quad that it makes.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/typeface/grid.png&#34; alt=&#34;All variations of the glyphs&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;notes-on-specific-letter-choices&#34;&gt;Notes on Specific Letter Choices&lt;/h2&gt;&#xA;&lt;p&gt;Each of these 24 glyphs needs to be assigned to a letter. The glyphs are shown below in alphabetical order.&#xA;Many of the choices I made should be quite obvious, and I&amp;rsquo;ve added some justification for the rest.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/typeface/alphabetical.png&#34; alt=&#34;The alphabetical layout of glyphs&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;E&lt;/code&gt; looks like the lower tail of the lowercase e&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;G&lt;/code&gt; looks like the &amp;lsquo;hook&amp;rsquo; part of the uppercase G&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;F&lt;/code&gt; is an uncrossed f&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;K&lt;/code&gt; is the angled part of the k. Also, looks like a &amp;lsquo;pointy&amp;rsquo; c&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;L&lt;/code&gt; looks like a lowercase l&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;M&lt;/code&gt; looks like the greek letter mu&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;S&lt;/code&gt; is a reverse c. Also it looks like the bottom half of an S&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;T&lt;/code&gt; is part of an uppercase T, with only one side of the top bar (see next section for thoughts on base-height)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;W&lt;/code&gt; is a flipped-over M (to be fair, this was one of the last letters to be assigned, and kinda got what was left)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;X&lt;/code&gt; is an uncrossed x&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Z&lt;/code&gt; is a &amp;lsquo;pointy&amp;rsquo; s&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;variations&#34;&gt;Variations&lt;/h2&gt;&#xA;&lt;p&gt;The group of stemmed quarter circles (&lt;code&gt;FTLJ&lt;/code&gt;) presents an interesting choice regarding the position of the letters relative to the baseline.&#xA;The two main options are presented in the next image.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/typeface/baseline.png&#34; alt=&#34;Height comparison for stemmed quarter circles&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I think the left group looks better, because it puts all the core symbols between the baseline and the x-height, with only the stems ascending or descending.&#xA;However, the right group more closely resembles the traditional letters.&#xA;I think both are valid choices, but have used the left group in the examples because it matches the rest of the aesthetic.&lt;/p&gt;&#xA;&lt;h2 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h2&gt;&#xA;&lt;p&gt;While this is primarily intended for handwriting, it could be neat to have a font file for it.&#xA;I have never created a font and don’t even know where to begin! But it could be something to explore.&#xA;Since the shapes are so repeated, there would not me much to design or draw.&lt;/p&gt;&#xA;&lt;p&gt;I mentioned at the start that I did not consider any uppercase letters.&#xA;It would be interesting to explore how that fits into the concise and simple system.&#xA;Maybe each uppercase is just larger than the lowercase letters?&#xA;I don&amp;rsquo;t know, but there&amp;rsquo;s room to explore here.&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2026/menu-downsizing/</id>
  <link rel="alternate" href="https://ers.land/blog/2026/menu-downsizing/"/>
  <title>Menu Downsizing</title>
  <published>2026-02-24T20:00:00-05:00</published>
  <updated>2026-02-24T20:00:00-05:00</updated>
  <summary type="html">Recently it seems that restaurants everywhere are downsizing their menus.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;So far, three of the restaurants we have been to this year have had noticeably smaller menus, when compared to our previous visit.&#xA;Usually presented as a menu &amp;ldquo;refresh&amp;rdquo;, with the hint of new things, the fact is that some of our favorites are no longer available.&lt;/p&gt;&#xA;&lt;p&gt;On average, we go out to eat once a week, or perhaps twice. Usually on friday or saturday.&#xA;That is to say, we have not yet been to a particularly large set of restaurants this year, so three of them makes a significant percentage.&#xA;At all three places, the folding menus were replaced by single sheets.&lt;/p&gt;&#xA;&lt;p&gt;We were able to come up with a few theories as to why this might be the case, although we are not by any means experts in this area.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;To disguise raising prices on the remaining options.&lt;/li&gt;&#xA;&lt;li&gt;Cost savings through removing lower margin items.&lt;/li&gt;&#xA;&lt;li&gt;Reduce kitchen staff by cutting categories of prepared ingredients.&lt;/li&gt;&#xA;&lt;li&gt;Increase efficiency by requiring fewer items to be made-to-order, fewer options means they can be anticipated more predictably.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not sure if this trend qualifies as shrinkflation, or if that is just a related concept, but I feel it is an equally worrying trend.&#xA;Have we just gotten unlucky with our visits this year? Is this an industry wide trend beginning?&#xA;We recall seeing this same situation during the covid years, but even then to a lesser extent.&lt;/p&gt;&#xA;&lt;p&gt;There is nothing to do but wait to see what happens, but, I can now imagine us expecting this each week when we choose a new place to visit.&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/side/stuffed-potatoes/</id>
  <link rel="alternate" href="https://ers.land/cook/side/stuffed-potatoes/"/>
  <title>Stuffed Potatoes</title>
  <published>2025-12-28T13:23:00-07:00</published>
  <updated>2025-12-28T13:23:00-07:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;3 lbs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;red potatoes&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;butter stick&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;sour cream&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;bacon, cooked and chopped&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;⅓ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;green onion (or chives)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;grated parmesan cheese&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2 C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;shredded cheddar cheese&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Make mashed potatoes:&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Boil potatoes&lt;/li&gt;&#xA;&lt;li&gt;Add butter, bacon, sour cream, green onion, parmesan&lt;/li&gt;&#xA;&lt;li&gt;Mash until smooth.&lt;/li&gt;&#xA;&lt;li&gt;Add salt and pepper to taste.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Spoon onto baking sheet.&lt;/li&gt;&#xA;&lt;li&gt;Top with cheddar cheese.&lt;/li&gt;&#xA;&lt;li&gt;Bake at 350 degrees for 20-25 minutes (cheese is melting and starting to brown).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;  &lt;blockquote class=&#34;alert alert-source&#34;&gt;&#xA;    &lt;p class=&#34;alert-title&#34;&gt;&#xA;        Source&#xA;    &lt;/p&gt;&#xA;    &lt;p&gt;Angus Barn&lt;/p&gt;&#xA;  &lt;/blockquote&gt;&#xA;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Original recipe used two butter sticks.&lt;/li&gt;&#xA;&lt;li&gt;Restaurant served this in a large ramekin.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/dessert/chocolate-chess-pie/</id>
  <link rel="alternate" href="https://ers.land/cook/dessert/chocolate-chess-pie/"/>
  <title>Chocolate Chess Pie</title>
  <published>2025-12-28T13:09:00-07:00</published>
  <updated>2025-12-28T13:09:00-07:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;6 Tbsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;salted butter&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2½ oz&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;semi-sweet chocolate chips&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1¼ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;sugar&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;eggs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;vanilla&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt; &lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;dash of salt&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pie crust (unbaked)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Melt butter and chocolate in microwave.&lt;/li&gt;&#xA;&lt;li&gt;Beat eggs.&lt;/li&gt;&#xA;&lt;li&gt;Mix in sugar, vanilla, salt.&lt;/li&gt;&#xA;&lt;li&gt;Mix in melted chocolate.&lt;/li&gt;&#xA;&lt;li&gt;Bake in pie crust for 35-45 minutes at 350 degrees.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;  &lt;blockquote class=&#34;alert alert-source&#34;&gt;&#xA;    &lt;p class=&#34;alert-title&#34;&gt;&#xA;        Source&#xA;    &lt;/p&gt;&#xA;    &lt;p&gt;Angus Barn&lt;/p&gt;&#xA;  &lt;/blockquote&gt;&#xA;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/dessert/lace-cookie/</id>
  <link rel="alternate" href="https://ers.land/cook/dessert/lace-cookie/"/>
  <title>Chocolate Lace Sandwich Cookies</title>
  <published>2025-12-23T21:32:00-05:00</published>
  <updated>2025-12-23T21:32:00-05:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;finely ground pecans&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;butter&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;¾ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;brown sugar&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;¼ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;honey&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;3 Tbsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;flour&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;½ tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;vanilla&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;¾ C&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;chocolate chips&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Preheat oven to 350.&lt;/li&gt;&#xA;&lt;li&gt;Heat butter, sugar, honey until melted.&lt;/li&gt;&#xA;&lt;li&gt;Add flour, nuts, vanilla.&lt;/li&gt;&#xA;&lt;li&gt;Drop rounded teaspoons onto silpat mat.&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Place them three inches apart, perhaps doing only 6 or 8 at a time. They easily run together.&lt;/li&gt;&#xA;&lt;li&gt;Bake 8-10 mins.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;When done, quickly remove silpat mat from baking pan, to cool faster.&#xA;&lt;ol&gt;&#xA;&lt;li&gt;After a couple minutes, they will have hardened enough to move to a wire rack.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;After all cookies are done and fully cool, make the sandwiches.&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Melt chocolate chips in the microwave.&lt;/li&gt;&#xA;&lt;li&gt;Use a brush to add the layer of chocolate.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This is rather tedious for the amount of cookies yielded.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2025/advent-of-code/</id>
  <link rel="alternate" href="https://ers.land/blog/2025/advent-of-code/"/>
  <title>Advent of Code 2025</title>
  <published>2025-12-12T09:45:00-05:00</published>
  <updated>2025-12-12T09:45:00-05:00</updated>
  <summary type="html">Thoughts from completing this year&#39;s adventofcode.com puzzles.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;I have worked on advent of code puzzles for the last few years to some extent. This year, there will only be 12 puzzles instead of 25, so I&amp;rsquo;m hoping to make it through them. In the past I would ordinarily run out of steam partway through, but with fewer puzzles, I am hopeful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;preparation&#34;&gt;Preparation&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve done some preparation, using generally the same swift harness as the last years.&#xA;However, I have cleaned up and simplified it quite a bit.&#xA;I removed the use of swift macros, which although neat, was not actually saving much code. I had added that macro in the year that swift macros were introduced, as an exercise.&lt;/p&gt;&#xA;&lt;p&gt;I considered adding a new string class (and substring) for AsciiString, to wrap the input and easily have random element access. I remembered having issues in the past with working around swift&amp;rsquo;s native support for unicode.&#xA;It seemed like a fun idea, that could use the new swift InlineArray and/or Span classes. However, I must have been remembering challenges from before regexes were introduced, as my last few years have don&amp;rsquo;t have the hacky character random access extension, nor seem to miss it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-1&#34;&gt;Day 1&lt;/h2&gt;&#xA;&lt;p&gt;A solid start, although part two was more challenging than I expected. I wanted to use division and modulus operations to calculate the zero passes. This seemed more in the spirit of the problem than a nested loop to move over each click. But I did find lots of edge cases to consider, when the dial either starts or ends at a zero already.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-2&#34;&gt;Day 2&lt;/h2&gt;&#xA;&lt;p&gt;I determined in planning that string random access would not likely to be something that would come up. But here I am on day two, doing index based substrings: &lt;code&gt;str[str.startIndex ..&amp;lt; str.index(str.startIndex, offsetBy: substringSize)]&lt;/code&gt;. Fortunately, there wasn&amp;rsquo;t too much, just a little ironic to hit it right away.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-4&#34;&gt;Day 4&lt;/h2&gt;&#xA;&lt;p&gt;A classic grid problem. I did end up adding a few new functions to my Grid class, although not all were used in the final solution. An elementwise &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;count(where:)&lt;/code&gt;, two functions to determine the available points around a point: &lt;code&gt;neighbors4(of:)&lt;/code&gt; and &lt;code&gt;neighbors8(of:)&lt;/code&gt;. Other than that the solution was pretty straightforward, sometimes it is nice to have a day where all the work happens in expanding the utility classes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-5&#34;&gt;Day 5&lt;/h2&gt;&#xA;&lt;p&gt;Today was my fastest turnaround between part one and part two so far. I lucked out in that the structure I found for the first part aligned perfectly with the second. For part one, instead of doing a naive double loop, I converted all input numbers into an array of &lt;code&gt;(index, kind)&lt;/code&gt; pairs. Then looping over a sorted list, just keeping track of the &amp;ldquo;current nested range depth&amp;rdquo; was all that was needed. For part two, it was a simple matter of adding an accumulator for the full range, when the nested depth returned to zero.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-7&#34;&gt;Day 7&lt;/h2&gt;&#xA;&lt;p&gt;Today was a complete refactor between parts one and two. This was the first day where part two fits the common the pattern: &amp;ldquo;the naive solution is easy but takes too long to run&amp;rdquo;. It would have had to count 48 trillion paths! I expect there will be more problems like this as the end approaches.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-9&#34;&gt;Day 9&lt;/h2&gt;&#xA;&lt;p&gt;Really tough day. Part one was almost trivial, since it reused most of the parsing from the previous day. Part two stumped me for a long time, trying to debug functions for intersection and interior checks. Eventually, I discovered the issue was not determining the correct rectangle, but that I was calculating the area as &lt;code&gt;abs(x - other.x + 1) * ...&lt;/code&gt; instead of &lt;code&gt;(abs(x - other.x) + 1) * ...&lt;/code&gt;, and had gotten lucky with that working on part one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-10&#34;&gt;Day 10&lt;/h2&gt;&#xA;&lt;p&gt;Part one was fairly straightforward to brute force, but took about 20 seconds, which was not promising for part two. After some optimization, it still was much to slow for part two. I was unable to find any algorithmic solution that ran in reasonable time for part two, but did think there might be a linear algebra approach to be taken. After a quick check, that seems to be the only way to do it, so I&amp;rsquo;ll leave it for another time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;day-12&#34;&gt;Day 12&lt;/h2&gt;&#xA;&lt;p&gt;I was going to skip this day entirely, after reading the prompt, writing this kind of packing algorithm would take so long. Usually, I finish the day before checking the work slack thread about it, but today it revealed that there was in fact no packing required, just counting the squares was enough. I tried that too, and got the right answer, but it feels sorta anticlimatic? In that it is not a general solution to the question, but a shortcut that works for the specific given input.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m happy with the amount of puzzles I solved this year. As stated in my goal, I completed all the days (aside from the linear algebra part two).&#xA;Additionally, I only had to look up hints for day 9, to double check where I was stuck, and day 12, which I would have otherwise skipped.&#xA;I very much like this 12 day format, and hope it returns next year.&lt;/p&gt;&#xA;&lt;p&gt;All my solutions can be found on my &lt;a href=&#34;https://github.com/p3l6/advent-of-code/tree/main/2025/AoC&#34;&gt;github repo.&lt;/a&gt;&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2025/mac-app-goal/</id>
  <link rel="alternate" href="https://ers.land/blog/2025/mac-app-goal/"/>
  <title>A New Goal to Publish a Mac App</title>
  <published>2025-11-09T15:00:00-05:00</published>
  <updated>2025-11-09T15:00:00-05:00</updated>
  <summary type="html">I recently had the realization that I have never shipped a side project mac app.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;I have been a macOS developer for many years now.&#xA;I have worked on apps and tools at various companies, and shipped their software that way.&#xA;But I have never actually shipped a side-project macOS app of my own!&lt;/p&gt;&#xA;&lt;p&gt;Long ago, I did do a couple small apps for iOS.&#xA;However, iOS is not currently, nor has ever been, a passion area for me.&#xA;I have also created on libraries and tools, such as &lt;a href=&#34;/2025/bag-notation/&#34;&gt;bag notation&lt;/a&gt;, which is a command line tool, and maintaining my simple xcode &lt;a href=&#34;https://github.com/p3l6/XLineTool/tree/main&#34;&gt;editor extension&lt;/a&gt;.&#xA;Neither of these is a real app that people can actually use.&lt;/p&gt;&#xA;&lt;p&gt;Every year, I do a simple retrospective and planning, where I consider the goals I had for the previous year and think of some new goals I&amp;rsquo;d like to work toward in the upcoming one.&#xA;Normally I do this in late december, but this time I have a new goal queued up already:&lt;/p&gt;&#xA;&#xA;  &lt;blockquote&gt;&#xA;    &lt;p&gt;Make a mac app, that does &lt;em&gt;&amp;hellip;something&amp;hellip;&lt;/em&gt; and publish it on the mac app store.&lt;/p&gt;&#xA;&#xA;  &lt;/blockquote&gt;&#xA;&#xA;&lt;p&gt;What this could app this be? I don&amp;rsquo;t know.&#xA;At one point I was considering a companion app for bag notation, but ran out of time.&#xA;Or perhaps a developer tool, building on the wrapper for my xcode editor extension.&#xA;Maybe even something completely different!&#xA;I am still on the lookout for ideas.&#xA;I think what makes a good idea twofold: something I&amp;rsquo;d at least like to use myself (especially helpful for motivation), and something that others also might find useful.&lt;/p&gt;&#xA;&lt;p&gt;There isn&amp;rsquo;t much more to say about this right now, other than I hope this will be a topic for more blog posts in the coming year as I narrow down some ideas and build it.&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/dessert/cobbler/</id>
  <link rel="alternate" href="https://ers.land/cook/dessert/cobbler/"/>
  <title>Dump Cobbler</title>
  <published>2025-10-22T08:45:00-04:00</published>
  <updated>2025-10-22T08:45:00-04:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;cake mix&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2 cans&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pie filling&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 can&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;soda&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Add pie filling to dutch oven.&lt;/li&gt;&#xA;&lt;li&gt;Add cake mix on top without stirring.&lt;/li&gt;&#xA;&lt;li&gt;Gently pour soda over top.&lt;/li&gt;&#xA;&lt;li&gt;Cook 30-45 mins.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Any cake and pie can be used, good combinations might be&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Chocolate, cherry, Dr Pepper&lt;/li&gt;&#xA;&lt;li&gt;Yellow, Peach, Ginger Ale&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2025/drinks-station/</id>
  <link rel="alternate" href="https://ers.land/blog/2025/drinks-station/"/>
  <title>Drinks Station</title>
  <published>2025-09-26T17:00:00-04:00</published>
  <updated>2025-09-26T17:00:00-04:00</updated>
  <summary type="html">As a step in improving our new house, we have finished constructing a drinks station in the empty nook next to our kitchen.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;Next to our kitchen we have a hallway with a small nook inside it.&#xA;Oddly, this nook was empty of any cabinetry, so we have had a plan to add some since we moved in.&#xA;It finally came to the top of the project list, and the results are great!&lt;/p&gt;&#xA;&lt;p&gt;We aren&amp;rsquo;t quite sure what the builders envisioned this space to be used for, without any counterspace.&#xA;In any case, we saw it as an opportunity to create a station for coffee, tea, and other drinks.&#xA;Perhaps some people would call this a butler&amp;rsquo;s station?&#xA;In any case, we decided we wanted to do a built-in, instead of just a table.&lt;/p&gt;&#xA;&lt;p&gt;Our initial ideas included:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A mini-fridge, with a glass door&lt;/li&gt;&#xA;&lt;li&gt;A counter on top of the fridge&lt;/li&gt;&#xA;&lt;li&gt;A small cabinet next to the fridge, depending on the sizes available&lt;/li&gt;&#xA;&lt;li&gt;An upper cabinet, with glass doors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;We looked at created this custom, using the cabinets available in home stores; similar to what we had added to the laundry room in our previous home.&#xA;However, this was stacking up to be a lot of finishing work, and the sizes weren&amp;rsquo;t quite lining up how we liked.&#xA;We fortunately checked into IKEA&amp;rsquo;s kitchen cabinet system, which we knew nothing about as anytime we visited the store we would skip through that section.&#xA;IKEA offers lots of options, including everything we had planned on our ideas list! And it all came in multiple colors, pre-finished.&#xA;We chose the faux-walnut finish, and researched all the &amp;ldquo;extras&amp;rdquo; needed to complete the build.&lt;/p&gt;&#xA;&lt;p&gt;The installation of the cabinets was fairly straightforward, only complicated by the limited time available to the young kids lifestyle.&#xA;One great decision was to buy a variety of the trims offered, and work out how best to use them as the project goes along.&#xA;The drawer and cabinet units are very customizable, we ended up with two drawers above the cabinet under the counter.&lt;/p&gt;&#xA;&lt;p&gt;I was unable to find a comparison picture of the state before, but here&amp;rsquo;s what it looks like all completed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/photographs/drink_station.jpeg&#34; alt=&#34;A butlers station&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;So this project is complete and working great!&#xA;We were able to clear off a lot of our kitchen counter space.&#xA;There is only one remaining task, if I get to it; try to mount the spare matching handle onto the fridge door.&#xA;The handles came in packs of two, so there is an extra one, and it would be neat if it matched at the bottom.&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/cook/sauce/burger-sauce/</id>
  <link rel="alternate" href="https://ers.land/cook/sauce/burger-sauce/"/>
  <title>Burger Sauce</title>
  <published>2025-07-22T10:44:00-04:00</published>
  <updated>2025-07-22T10:44:00-04:00</updated>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: right&#34;&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Ingredients&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2 Tbsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ketchup&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;2 Tbsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;mayo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 Tbsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;yellow mustard&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;worchestershire&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;finely chopped dill pickle slices&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;salt&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pepper&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;onion powder&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: right&#34;&gt;1 tsp&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;garlic powder&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;directions&#34;&gt;Directions&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Combine ingredients.&lt;/li&gt;&#xA;&lt;li&gt;Chill in fridge.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;appendix&#34;&gt;Appendix&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Amounts are approximate, and evolving.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2025/moving/</id>
  <link rel="alternate" href="https://ers.land/blog/2025/moving/"/>
  <title>Moving House</title>
  <published>2025-06-24T20:00:00-04:00</published>
  <updated>2025-06-24T20:00:00-04:00</updated>
  <summary type="html">Thoughts on moving with little children</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;We recently wrapped up a local move to a new house. It was somewhat unexpected, but the right opportunity presented itself to us to move into a home the right size for our growing family. However, wow, moving with a preschooler and a baby so very hard.&lt;/p&gt;&#xA;&lt;p&gt;My wife and I were very stressed during this time. Having two kids presents natural challenges to the amount of time available for chores and getting things done. For about a month, this entire &amp;ldquo;free time&amp;rdquo; was consumed by packing, for little bits at a time every day. Of course, having boxes everywhere and all the stuff disappearing will stress out any two year old, making their emotions come out on a hair trigger. We realized we have hit all three major life changes within the last twelve months: a new job, a new baby, and now a new house. We are hoping for a clear summer.&lt;/p&gt;&#xA;&lt;p&gt;After all the turmoil, setting in to the new home felt just right. We have a large list of fixes we want to do, but we feel so comfortable here. We bought the house despite the adjoining open space being slated for a new housing development, which would mean construction and losing being at the end of the dead-end street. However, we were truly blessed to hear that the whole development was withdrawn, less than two weeks after we moved in! We expect the development plans kept other interested buyers away; we are not sure we would have been able to buy the house without that. Someday, something will be constructed next door, there is no doubt, but this should allow a few years before that happens.&lt;/p&gt;&#xA;&lt;p&gt;Part of moving meant selling our previous house. There isn&amp;rsquo;t much to say about it other than selling never seems to be as smooth as you expect, going into the process. There were more speedbumps and hiccups than we could have predicted. But that all seems to be in the rear-view mirror, and we are excited to be where we are!&lt;/p&gt;&#xA;
  </content>
</entry>
<entry>
  <author>
    <name>Paul Landers</name>
  </author>
  <id>https://ers.land/blog/2025/zed-extension/</id>
  <link rel="alternate" href="https://ers.land/blog/2025/zed-extension/"/>
  <title>Zed Extension for Bag Notation</title>
  <published>2025-03-22T22:00:00-04:00</published>
  <updated>2025-03-22T22:00:00-04:00</updated>
  <summary type="html">The zed extension for bag notation is available, in developer mode.</summary>
  <content type="html" xml:base="https://ers.land/" xml:lang="en">
    &lt;p&gt;In my &lt;a href=&#34;/2025/bag-notation/&#34;&gt;last post&lt;/a&gt;, about the bag notation language, I mentioned that one of the next tasks was to create an extension for the zed editor. I have finished a first version of this, and it can be installed locally in developer mode.&lt;/p&gt;&#xA;&lt;h2 id=&#34;features&#34;&gt;Features&lt;/h2&gt;&#xA;&lt;p&gt;The feature set, if it can be called a set, is just the basics. It has syntax highlighting and a couple tasks. The syntax highlighting relies on the same tree-sitter definition the actual parsing tool, so it is correct, and won&amp;rsquo;t drift as changes happen to the format. The helper jobs are wrappers for &lt;code&gt;bag pdf&lt;/code&gt; and &lt;code&gt;bag format -i&lt;/code&gt; for the currently opened file.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;p&gt;As it is such a niche tool, it is not submitted to the small set of official zed extensions. Instead, it has to be installed as a developer extension. You can do this by cloning &lt;a href=&#34;http://github.com/p3l6/bag-notation&#34;&gt;the repository&lt;/a&gt; and then, from zed, opening the &lt;code&gt;./zed-extension&lt;/code&gt; folder as a developer extension.&lt;/p&gt;&#xA;&lt;p&gt;Also, the extension doesn&amp;rsquo;t install the actual parsing tool, that must be done manually. As in the previous post, it can be installed with &lt;code&gt;brew install p3l6/tap/bag-notation&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;learnings&#34;&gt;Learnings&lt;/h2&gt;&#xA;&lt;p&gt;While I was initially optimistic about incorporating my existing tree-sitter definition into the zed extension, it turned out to be fairly tricky to do. This was mostly due to zed expecting the tree-sitter to be in it&amp;rsquo;s own repository. However, I am trying to keep the parser, tree-sitter, and extensions all in a single mono-repo (at least for now).&lt;/p&gt;&#xA;&lt;p&gt;Eventually, it was working by recursively checking out the repository inside itself, and pointing zed at a subdirectory inside the nested clone. So, not ideal for many reasons.&lt;/p&gt;&#xA;&lt;p&gt;Also, I would have expected the query files to be reused, if packaged inside the tree-sitter definition, but no, zed expects them to only be inside the extension itself. Since I have a mon-repo for this, I have symlinked them together for now.&lt;/p&gt;&#xA;&lt;p&gt;Other than these gotchas, creating the zed extension was fairy simple, largely a matter of implementing the relevant tree-sitter queries.&lt;/p&gt;&#xA;&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;&#xA;&lt;p&gt;If I have time to continue working on this, the next step would be to investigate language server support in the parser binary. This would surface errors and autocomplete information to the zed editor.&lt;/p&gt;&#xA;
  </content>
</entry>
</feed>
