<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Matthew Lang</title>
  <subtitle>Family guy and web developer</subtitle>
  <link href="https://www.matthewlang.me/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://www.matthewlang.me/" rel="alternate" type="text/html"/>
  <updated>2026-10-26T19:24:17+00:00</updated>
  <id>https://www.matthewlang.me/</id>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/26/nice-to-see/" rel="alternate" type="text/html"/>
    <published>2026-10-26T19:19:00+00:00</published>
    <updated>2026-10-26T19:19:00+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/26/nice-to-see/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/26/nice-to-see/"><![CDATA[<p>Nice to see that CSS Tricks is once again under <a href="https://css-tricks.com/css-tricks-has-a-new-owner/">independent ownership</a>.</p>

<p>Good luck to Geoff Graham and all the CSS Tricks team!</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Web Development"/>
    
    <summary type="html"><![CDATA[Nice to see that CSS Tricks is once again under independent ownership.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/24/it-s-hard-to/" rel="alternate" type="text/html"/>
    <published>2026-10-24T07:49:05+00:00</published>
    <updated>2026-10-24T07:49:05+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/24/it-s-hard-to/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/24/it-s-hard-to/"><![CDATA[<p>It’s hard to believe we have a weather warning for later in the day when the day starts like this.</p>

<p><img src="https://postpress.lon1.digitaloceanspaces.com/photos/2026/10/9bd1a820-f892-4295-8e91-39dd4d3dc0b5-autumn-sunrise-full.jpg" alt="Vivid red and orange sunset sky over silhouetted suburban houses and trees in a residential neighborhood." /></p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    
    <summary type="html"><![CDATA[It’s hard to believe we have a weather warning for later in the day when the day starts like this.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/20/loving-the-new/" rel="alternate" type="text/html"/>
    <published>2026-10-20T19:03:14+00:00</published>
    <updated>2026-10-20T19:03:14+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/20/loving-the-new/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/20/loving-the-new/"><![CDATA[<p>Loving the <a href="https://blog.joinmastodon.org/2026/10/5.0-a-closer-look/">new look for Mastodon 5.0</a>.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Internet"/>
    
    <summary type="html"><![CDATA[Loving the new look for Mastodon 5.0.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/14/i-played-18/" rel="alternate" type="text/html"/>
    <published>2026-10-14T18:05:06+00:00</published>
    <updated>2026-10-14T18:05:06+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/14/i-played-18/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/14/i-played-18/"><![CDATA[<p><img src="https://postpress.lon1.digitaloceanspaces.com/images/e7e7d82f-92e8-4242-a510-8f497b97b646-drew-october-golf-full.jpg" alt="A golfer in a red top and black pants follows through after driving a ball down a lush green fairway lined with trees." /></p>

<p>I played 18 holes this morning with Drew. Good to see him getting more technical with his golf.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Family"/>
    <category term="Golf"/>
    
    <summary type="html"><![CDATA[]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/11/sun-low-in/" rel="alternate" type="text/html"/>
    <published>2026-10-11T16:51:37+00:00</published>
    <updated>2026-10-11T16:51:37+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/11/sun-low-in/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/11/sun-low-in/"><![CDATA[<p>Sun low in the sky, a roast in the oven, apples stewing for later tonight, the Packers on television shortly. Pretty much a perfect evening ahead.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Home"/>
    <category term="Family"/>
    <category term="NFL"/>
    
    <summary type="html"><![CDATA[Sun low in the sky, a roast in the oven, apples stewing for later tonight, the Packers on television shortly. Pretty much a perfect evening ahead.]]></summary>
  </entry>
  
  <entry>
    <title type="html">My /photo page</title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/10/my-photo-page/" rel="alternate" type="text/html" title="My /photo page"/>
    <published>2026-10-10T20:15:03+00:00</published>
    <updated>2026-10-10T20:15:03+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/10/my-photo-page/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/10/my-photo-page/"><![CDATA[<p>After reading about Robert Birming’s <a href="https://robertbirming.com/make-photo-pages/">photo page</a>, I decided to add one to my own blog, with one change. My <a href="https://www.matthewlang.me/photo">own photo page</a> turned out pretty well. Here’s what I did.</p>

<p>Adding a new page in Jekyll is straightforward. It’s just a static page after all. Rendering a single photo in Jekyll wasn’t the challenge, though. I wanted to include archives of all the photos I will eventually share on this page, so I needed a way to build an image archive.</p>

<p>Jekyll is a static site generator, so it doesn’t have a database to query for archive photos. I needed another Jekyll-friendly database. Enter the <code class="language-plaintext highlighter-rouge">photos.yml</code> file.</p>

<p>This file contains the URLs for each photo’s full-sized and thumbnail versions, the caption, the alt text and the date the photo was taken. Each uploaded photo is added to the top of this file and acts as the source for the photo page and the archive.</p>

<p>I now needed a means to update this. I have my own publishing app, Postpress, that updates my Jekyll site. It’s a Rails application that lets me publish articles, upload images, and manage a few other data collections on my website. I already could upload images for my posts, so the photo upload uses the same process but saves to a separate photos folder.</p>

<p>I then collect the uploaded photo URLs, caption, date and LLM-generated alt text (which I always review), and add these to the top of the <code class="language-plaintext highlighter-rouge">photos.yml</code> file on my blog. Postpress commits these changes and pushes them back to my source code management host, where a new build of the website is triggered.</p>

<p>The resulting <code class="language-plaintext highlighter-rouge">photos.yml</code> file will look something like this:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="pi">-</span> <span class="na">url</span><span class="pi">:</span> <span class="s">https://notarealhost.com/photos/2026/10/golf-course-full.jpg</span>
  <span class="na">thumbnail</span><span class="pi">:</span> <span class="s">https://notarealhost.com/photos/2026/10/golf-course-thumb.jpg</span>
  <span class="na">alt</span><span class="pi">:</span> <span class="s">A golf course putting green with a white flag pin, lush fairway, scattered trees, and a partly cloudy blue sky.</span>
  <span class="na">caption</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Another</span><span class="nv"> </span><span class="s">view</span><span class="nv"> </span><span class="s">of</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">golf</span><span class="nv"> </span><span class="s">course.</span><span class="nv"> </span><span class="s">I</span><span class="nv"> </span><span class="s">wish</span><span class="nv"> </span><span class="s">I</span><span class="nv"> </span><span class="s">was</span><span class="nv"> </span><span class="s">more</span><span class="nv"> </span><span class="s">organised.</span><span class="nv"> </span><span class="s">I</span><span class="nv"> </span><span class="s">would</span><span class="nv"> </span><span class="s">have</span><span class="nv"> </span><span class="s">brought</span><span class="nv"> </span><span class="s">my</span><span class="nv"> </span><span class="s">clubs</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">played."</span>
  <span class="na">date</span><span class="pi">:</span> <span class="s">2026-10-10</span>
<span class="pi">-</span> <span class="na">url</span><span class="pi">:</span> <span class="s">https://notarealhost.com/photos/2026/10/nuphy-keyboard-full.jpg</span>
  <span class="na">thumbnail</span><span class="pi">:</span> <span class="s">https://notarealhost.com/photos/2026/10/nuphy-keyboard-thumb.jpg</span>
  <span class="na">alt</span><span class="pi">:</span> <span class="s">Close-up of a mechanical keyboard's upper-right corner featuring dark gray, white, and teal keycaps with an RGB light strip.</span>
  <span class="na">caption</span><span class="pi">:</span> <span class="s">I switched back to the original keycaps on my Nuphy Air75 keyboard. I quite like the default keycaps.</span>
  <span class="na">date</span><span class="pi">:</span> <span class="s">2026-10-09</span>
</code></pre></div></div>

<p>I have a handful of layouts and views, plus a plugin that aggregates all the data for the photo pages, letting you drill down into the archives by year and navigate back. As the <code class="language-plaintext highlighter-rouge">photos.yml</code> is located in the <code class="language-plaintext highlighter-rouge">_data</code> folder in Jekyll, I can reference these photos by using <code class="language-plaintext highlighter-rouge">site.data.photos</code>.</p>

<p><img src="https://postpress.lon1.digitaloceanspaces.com/images/dfa15664-ee0f-4488-bbb1-7f03b256318c-photo-year-view-full.png" alt="A photo archive page from 2026 showing two thumbnail images: a golf course on October 10 and a mechanical keyboard on October 9." /></p>

<p>Here are the files I needed to build this.</p>

<ul>
  <li><strong>photo.md</strong> - The photo page itself, which will grab the first photo from the <code class="language-plaintext highlighter-rouge">site.data.photos</code> collection.</li>
  <li><strong>photo/archive.html</strong> - The archive page showing a photo for each year I have posted.</li>
  <li><strong>photo-year.html</strong> - The page that displays all the photos for a year.</li>
  <li><strong>photo_archive.rb</strong> - A plugin that generates a page for each year.</li>
</ul>

<p>This took a bit of time today, but it was time well spent. I like to think of this as my own personal Instagram baked into my blog, without the hassle of actually having to post to Instagram.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Meta"/>
    <category term="Photos"/>
    
    <summary type="html"><![CDATA[After reading about Robert Birming’s photo page, I decided to add one to my own blog, with one change. My own photo page turned out pretty well. Here’s what I did.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/10/i-am-really/" rel="alternate" type="text/html"/>
    <published>2026-10-10T13:25:23+00:00</published>
    <updated>2026-10-10T13:25:23+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/10/i-am-really/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/10/i-am-really/"><![CDATA[<p>I am really intrigued by <a href="https://enkihost.com/">Enkihost</a>, a new host for Ruby applications by <a href="https://enkilabs.site">Albert Oliva</a>. Pricing seems very competitive, but I haven’t run an application there yet, let alone five. It’s certainly cheaper than my current DigitalOcean and Hatchbox setup.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Tools"/>
    <category term="Web Development"/>
    
    <summary type="html"><![CDATA[I am really intrigued by Enkihost, a new host for Ruby applications by Albert Oliva. Pricing seems very competitive, but I haven’t run an application there yet, let alone five. It’s certainly cheaper than my current DigitalOcean and Hatchbox setup.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/10/it-turned-out/" rel="alternate" type="text/html"/>
    <published>2026-10-10T11:55:50+00:00</published>
    <updated>2026-10-10T11:55:50+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/10/it-turned-out/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/10/it-turned-out/"><![CDATA[<p>It turned out to be a pretty good day for Drew’s coaching at Castle Park Golf Club today. Sunny, but also quite windy.</p>

<p><img src="https://postpress.lon1.digitaloceanspaces.com/images/03932566-6346-4f9f-bfd2-1f7489fc3aaa-castle-park-coaching-full.jpg" alt="Golf course green with red flag, lined by autumn-colored trees and rolling green hills under a partly cloudy sky." /></p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Family"/>
    <category term="Golf"/>
    
    <summary type="html"><![CDATA[It turned out to be a pretty good day for Drew’s coaching at Castle Park Golf Club today. Sunny, but also quite windy.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/10/09/starting-a-week/" rel="alternate" type="text/html"/>
    <published>2026-10-09T20:12:51+00:00</published>
    <updated>2026-10-09T20:12:51+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/10/09/starting-a-week/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/10/09/starting-a-week/"><![CDATA[<p>Starting a week off work tomorrow to take Drew to an all-day golf coaching session at Castle Park Golf Club. I’ll be pitching up in the clubhouse all day. Expect a few posts tomorrow, and maybe a few blog changes.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Family"/>
    <category term="Golf"/>
    <category term="Meta"/>
    
    <summary type="html"><![CDATA[Starting a week off work tomorrow to take Drew to an all-day golf coaching session at Castle Park Golf Club. I’ll be pitching up in the clubhouse all day. Expect a few posts tomorrow, and maybe a few blog changes.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/29/i-updated-firefox/" rel="alternate" type="text/html"/>
    <published>2026-09-29T20:32:04+00:00</published>
    <updated>2026-09-29T20:32:04+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/29/i-updated-firefox/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/29/i-updated-firefox/"><![CDATA[<p>I updated Firefox to the <a href="https://blog.mozilla.org/en/firefox/new-firefox-design-is-here/">new design</a> today, and it’s nice to see it looking modern once again. I’m also glad to see Compact Mode is back, now with an auto option for smaller screens.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Tools"/>
    
    <summary type="html"><![CDATA[I updated Firefox to the new design today, and it’s nice to see it looking modern once again. I’m also glad to see Compact Mode is back, now with an auto option for smaller screens.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/24/every-morning-is/" rel="alternate" type="text/html"/>
    <published>2026-09-24T07:22:52+00:00</published>
    <updated>2026-09-24T07:22:52+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/24/every-morning-is/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/24/every-morning-is/"><![CDATA[<p>Every morning is the same. I close tabs for pull requests I reviewed yesterday and check which ones have been merged.</p>

<p>GitHub’s favicon shows a green tick for a pull request ready to merge, but it would be nice if it updated to a purple indicator when a pull request is already merged.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="GitHub"/>
    <category term="Grumbles"/>
    
    <summary type="html"><![CDATA[Every morning is the same. I close tabs for pull requests I reviewed yesterday and check which ones have been merged.]]></summary>
  </entry>
  
  <entry>
    <title type="html">Have plain text files had their day?</title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/23/have-plain-text-files-had-their-day/" rel="alternate" type="text/html" title="Have plain text files had their day?"/>
    <published>2026-09-23T22:12:42+00:00</published>
    <updated>2026-09-23T22:12:42+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/23/have-plain-text-files-had-their-day/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/23/have-plain-text-files-had-their-day/"><![CDATA[<p>This <a href="https://paste.sr.ht/~awal/b76caf6f213a96a634454fa7292c035a10035b49">paste on Sourcehut</a> isn’t particularly positive reading if you are a fan of plain text files. I’m not sure what not to make of this. Are software engineers the last group keeping plain-text files alive? I’m not sure. <a href="https://obsidian.md/">Obsidian</a> is still a popular tool and it can’t be only software engineers that use it.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Tools"/>
    <category term="Writing"/>
    
    <summary type="html"><![CDATA[This paste on Sourcehut isn’t particularly positive reading if you are a fan of plain text files. I’m not sure what not to make of this. Are software engineers the last group keeping plain-text files alive? I’m not sure. Obsidian is still a popular tool and it can’t be only software engineers that use it.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/22/now-page-updated/" rel="alternate" type="text/html"/>
    <published>2026-09-22T20:23:35+00:00</published>
    <updated>2026-09-22T20:23:35+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/22/now-page-updated/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/22/now-page-updated/"><![CDATA[<p><a href="https://www.matthewlang.me/now/">Now page</a> updated.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Meta"/>
    
    <summary type="html"><![CDATA[Now page updated.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/22/alice-girard-guittard/" rel="alternate" type="text/html"/>
    <published>2026-09-22T07:33:34+00:00</published>
    <updated>2026-09-22T07:33:34+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/22/alice-girard-guittard/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/22/alice-girard-guittard/"><![CDATA[<p>Alice Girard Guittard reminds us of the intentional internet and why it’s better for us.</p>

<blockquote>
  <p>You didn’t really have one big app that you could open and order it to entertain you. Instead, you had a few dozen of bookmarks to websites, each with a specific idea in mind. A site for video game news, that one website with lots of tutorials, a blog about anime that didn’t update often enough, a wiki about a TV show from the 90s…</p>

  <p>— <a href="https://alicegg.tech/2026/09/21/attention">Attention is all you have</a> by Alice Girard Guittard</p>
</blockquote>

<p>A reminder that it’s still there. You just have to go looking for it.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="IndieWeb"/>
    <category term="Open Web"/>
    
    <summary type="html"><![CDATA[Alice Girard Guittard reminds us of the intentional internet and why it’s better for us.]]></summary>
  </entry>
  
  <entry>
    <title type="html">Laurel: a weekend Hanami project</title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/21/laurel-a-weekend-hanami-project/" rel="alternate" type="text/html" title="Laurel: a weekend Hanami project"/>
    <published>2026-09-21T20:06:24+00:00</published>
    <updated>2026-09-21T20:06:24+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/21/laurel-a-weekend-hanami-project/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/21/laurel-a-weekend-hanami-project/"><![CDATA[<p>Over the weekend, I wanted to build something with Hanami. I wanted to build something with Hanami more as a learning exercise than anything else. I had a bookmark manager written in Rails that has been languishing on the side, so I thought I would build something a bit more functional using Hanami. I called it Laurel.</p>

<p>Bookmarks usually build up for me. I wanted to build a way to resurface bookmarks so they can be acted on. It’s something I didn’t have in the previous bookmark application. I also didn’t want to be distracted by using background processing. Any methods that calculate ranks or anything else like that will be handled during the request.</p>

<p>This isn’t my first Hanami project. I built a couple of smaller applications a couple of years ago, but I never kept them because they were just a way to see what Hanami can do.</p>

<p>Getting the project started was familiar. Typing <code class="language-plaintext highlighter-rouge">bundle exec hanami new</code> is almost the same as kicking off a new Rails project. Once I had a blank application set up, I started looking into the code. It has similarities to Rails, but also differences.</p>

<p>I’m not going to delve into the experience of using Hanami or compare it to Rails, but I enjoyed using it, and the developer experience is good.</p>

<p>As for the project’s goal, I eventually finished it on Sunday night. It includes the following features:</p>

<ul>
  <li>Capture: add/edit, tag, import</li>
  <li>Curate: the digest page, Elo comparisons, evergreen marking, archiving, snoozing or ignoring bookmarks</li>
  <li>Decay: the HN-style ranking score</li>
</ul>

<p><img src="https://postpress.lon1.digitaloceanspaces.com/images/c3798cd4-b565-43a9-904c-8f3b79f69e2c-laurel-digest-page-full.png" alt="Bookmark digest interface showing a priority comparison between two articles and a list of saved bookmarks with action buttons." /></p>

<p>The digest page is the real workhorse of the application. Here you can decide which of the two bookmarks is more important and also action other bookmarks that appear on this page. Being able to action bookmarks over time with the archive, snooze or ignore buttons is more helpful to me and actively curates the collection.</p>

<p>The difficult part was deploying the application to Hatchbox. I originally had an error in the application that appeared only in the production environment, not the development environment. I eventually resolved this issue, but I still seem to have a deployment issue: it requires a restart after deployment, and I’m sure this is a mistake on my part when setting up the application.</p>

<p>I’m going to definitely keep using this, and over the next few weekends, I’ll be adding more features and hopefully resolving that deployment issue on Hatchbox as well.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Web Development"/>
    <category term="Tools"/>
    
    <summary type="html"><![CDATA[Over the weekend, I wanted to build something with Hanami. I wanted to build something with Hanami more as a learning exercise than anything else. I had a bookmark manager written in Rails that has been languishing on the side, so I thought I would build something a bit more functional using Hanami. I called it Laurel.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/20/i-promised-a/" rel="alternate" type="text/html"/>
    <published>2026-09-20T20:55:49+00:00</published>
    <updated>2026-09-20T20:55:49+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/20/i-promised-a/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/20/i-promised-a/"><![CDATA[<p>I promised a write-up of my weekend project tonight, but between wrestling with Hatchbox and almost seeing the Packers crumble, I think I’ll pass for now. Project’s going well though — just hitting some snags deploying to production.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Web Development"/>
    <category term="Packers"/>
    
    <summary type="html"><![CDATA[I promised a write-up of my weekend project tonight, but between wrestling with Hatchbox and almost seeing the Packers crumble, I think I’ll pass for now. Project’s going well though — just hitting some snags deploying to production.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/19/the-packers-head/" rel="alternate" type="text/html"/>
    <published>2026-09-19T20:39:11+00:00</published>
    <updated>2026-09-19T20:39:11+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/19/the-packers-head/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/19/the-packers-head/"><![CDATA[<p>The Packers head to MetLife tomorrow, aiming to erase some of the damage from last week’s loss to the Vikings. Bad penalties, a stuffed sneak and a fourth-quarter collapse. A nightmare start to the season. The Jets are beatable. The question is whether GB can close the door this time.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Packers"/>
    <category term="NFL"/>
    
    <summary type="html"><![CDATA[The Packers head to MetLife tomorrow, aiming to erase some of the damage from last week’s loss to the Vikings. Bad penalties, a stuffed sneak and a fourth-quarter collapse. A nightmare start to the season. The Jets are beatable. The question is whether GB can close the door this time.]]></summary>
  </entry>
  
  <entry>
    <title type="html">Bookmarks that come back</title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/18/bookmarks-that-come-back/" rel="alternate" type="text/html" title="Bookmarks that come back"/>
    <published>2026-09-18T21:07:38+00:00</published>
    <updated>2026-09-18T21:07:38+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/18/bookmarks-that-come-back/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/18/bookmarks-that-come-back/"><![CDATA[<p>I started working on a new bookmark manager tonight using the <a href="https://hanakai.org/">Hanakai</a> toolset. It comprises the Hanami framework, Dry validation library and the Rom persistence toolkit.</p>

<p><img src="https://postpress.lon1.digitaloceanspaces.com/images/ead26aa5-3066-4294-bc9c-f7dd4baff9a6-hanami-bookmark-app-full.png" alt="A bookmark digest interface showing an Elo-ranked comparison of two bookmarks with archive, snooze, and ignore actions below each entry." /></p>

<p>This little project has two goals. The first is to learn Hanakai. Ruby on Rails is a reliable web framework, and I’ve used it for over 15 years, but I want to try something different. The second is to try something different with a bookmark manager. Instead of just saving bookmarks and forgetting about them, I’m going to try to build a bookmark manager that resurfaces bookmarks over time. It will do this on a schedule and based on bookmarks that fit the criteria for being resurfaced. The idea is that, over time, you’ll weed out anything that isn’t relevant and be left with only the bookmarks that matter.</p>

<p>I initially envisioned this as an email workflow, but I’m going to keep it simple and display the decision in the web app. Email would have meant building the sending infrastructure, but I didn’t want to deal with that this weekend.</p>

<p>The fundamentals are already in place. I will be dipping in and out of this over the weekend with a view to having something to deploy on Sunday night. The final decision screen will be for me only, but I’ll follow this blog post with more information on how I got on.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Web Development"/>
    <category term="Tools"/>
    
    <summary type="html"><![CDATA[I started working on a new bookmark manager tonight using the Hanakai toolset. It comprises the Hanami framework, Dry validation library and the Rom persistence toolkit.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/17/jen-and-i/" rel="alternate" type="text/html"/>
    <published>2026-09-17T21:47:31+00:00</published>
    <updated>2026-09-17T21:47:31+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/17/jen-and-i/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/17/jen-and-i/"><![CDATA[<p>Jen and I finished season 2 of Lioness tonight. A great season. Just enjoyable television. I think we’re going to catch up with Slow Horses tomorrow.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Television"/>
    
    <summary type="html"><![CDATA[Jen and I finished season 2 of Lioness tonight. A great season. Just enjoyable television. I think we’re going to catch up with Slow Horses tomorrow.]]></summary>
  </entry>
  
  <entry>
    <title></title>
    
    <link href="https://www.matthewlang.me/posts/2026/09/16/im-trying-to/" rel="alternate" type="text/html"/>
    <published>2026-09-16T22:12:14+00:00</published>
    <updated>2026-09-16T22:12:14+00:00</updated>
    <id>https://www.matthewlang.me/posts/2026/09/16/im-trying-to/</id>
    <content type="html" xml:base="https://www.matthewlang.me/posts/2026/09/16/im-trying-to/"><![CDATA[<p>I’m trying to work out a way of keeping some of my notes in Obisidian in sync with a section of my blog. There is a benefit to doing this, but the content is slightly different for each. For the moment, I’ll manually pull Obsidian files into my blog, but in the future I hope to automate this.</p>
<hr><p>Thank you for reading this post via RSS. ❤️</p>]]></content>
    <author>
      <name>Matthew Lang</name>
    </author>
    <category term="Meta"/>
    <category term="Tools"/>
    
    <summary type="html"><![CDATA[I’m trying to work out a way of keeping some of my notes in Obisidian in sync with a section of my blog. There is a benefit to doing this, but the content is slightly different for each. For the moment, I’ll manually pull Obsidian files into my blog, but in the future I hope to automate this.]]></summary>
  </entry>
  
</feed>
