<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>curtmerrill.com</title><link>http://curtmerrill.com/</link><description>Latest blog entries</description><atom:link href="http://curtmerrill.com/blog/feed/" rel="self"/><language>en-us</language><lastBuildDate>Thu, 01 Jan 2026 18:26:50 +0000</lastBuildDate><item><title>2025 in review: Travel</title><link>http://curtmerrill.com/blog/2026/2025-in-review-travel/</link><description>&lt;p&gt;First time visits are in &lt;strong&gt;bold&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clayton&lt;/strong&gt;, Georgia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rapid City, South Dakota&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Summerfield, Florida&lt;/li&gt;
&lt;li&gt;Chattanooga, Tennessee&lt;/li&gt;
&lt;li&gt;Tampa, Florida&lt;/li&gt;
&lt;li&gt;Orlando, Florida&lt;/li&gt;
&lt;li&gt;Lyons, Georgia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Castaway Cay, Bahamas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As of December 31, 2025, I&amp;rsquo;ve visited 37 of 56 U.S. states, inhabited territories and federal districts&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. &lt;/p&gt;
&lt;figure class="thirds"&gt;
&lt;img class="two-thirds" src="https://static.curtmerrill.com/2025/2025-flighty-passport.jpg" alt="Screenshot from iOS app, Flighty, showing a map and summary of 5 flights taken this year."&gt;
&lt;figcaption class="one-third"&gt;I logged five flights this year in &lt;a href="https://flighty.com"&gt;Flighty&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&amp;ldquo;&lt;a href="https://en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"&gt;List of states and territories of the United States&lt;/a&gt;.&amp;rdquo; Wikipedia, accessed 4 August 2025&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><pubDate>Thu, 01 Jan 2026 18:26:50 +0000</pubDate><guid>1d62e476-257a-4840-aaff-5c06ddeff7c7</guid></item><item><title>Pick 2: Keyboard and work light</title><link>http://curtmerrill.com/blog/2025/pick-2-keyboard-and-work-light/</link><description>&lt;h2&gt;Thing 1: &lt;a href="https://www.dewalt.com/product/dcl050/20v-max-led-hand-held-area-light-tool-only"&gt;Dewalt DCL050&lt;/a&gt; area light&lt;/h2&gt;
&lt;p&gt;I got this to help with repainting our half-bathroom. I disconnected the light fixture to paint, and there was no other light source.&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;plenty of light&lt;/li&gt;
&lt;li&gt;uses Dewalt batteries we already have&lt;/li&gt;
&lt;li&gt;flexible (can hang from a hook or stand on floor)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a little pricey&lt;/li&gt;
&lt;li&gt;easy to tip over when light is shining up&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Thing 2: Nuphy Air75 v3&lt;/h2&gt;
&lt;p&gt;My first &amp;ldquo;modern&amp;rdquo; mechanical keyboard was an &lt;a href="https://web.archive.org/web/20170804101609/http://www.wasdkeyboards.com/index.php/products/mechanical-keyboard/wasd-v2-87-key-custom-mechanical-keyboard.html"&gt;87-key V2&lt;/a&gt; from WASD Keyboards (apparently no longer in business). I got it with Cherry MX Blue switches and dampeners.&lt;/p&gt;
&lt;p&gt;I used it for a couple of years, but when I started working from an office again I wanted something quieter. I tried a &lt;a href="https://www.keychron.com/products/keychron-k6-wireless-mechanical-keyboard"&gt;Keychron K6&lt;/a&gt; with Gateron Red switches, but missed having a function row.&lt;/p&gt;
&lt;p&gt;Next up was a &lt;a href="https://www.keychron.com/products/keychron-k2-wireless-mechanical-keyboard"&gt;Keychron K2&lt;/a&gt;. There was a short adjustment period as I got used to the placement of the arrow keys and lack of space between the function and number rows. Overall, I liked it, though.&lt;/p&gt;
&lt;p&gt;I started having wrist pain and went looking for a more ergonomic keyboard. I tried a &lt;a href="https://www.zsa.io/voyager"&gt;ZSA Voyager&lt;/a&gt;, but couldn&amp;rsquo;t get used to it. I moved on to a &lt;a href="https://www.keychron.com/products/keychron-k15-max-alice-layout-qmk-wireless-custom-mechanical-keyboard"&gt;K15&lt;/a&gt;. The split layout seemed to help my wrists, but the arc of the keys made it tougher to accurately reach keys with my pinkies. It wasn&amp;rsquo;t a huge deal, though, and I was quite happy.&lt;/p&gt;
&lt;p&gt;Until&amp;hellip;&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t think I was in the market for a new keyboard, but the YouTube algorithm served up a &lt;a href="https://www.youtube.com/watch?v=rN9Qrs7h3KU"&gt;Switch and Click video&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Curiosity got the better of me and I ordered the &lt;a href="https://nuphy.refr.cc/default/u/stephenmerrill?s=sp&amp;amp;t=cp"&gt;Nuphy Air75 v3&lt;/a&gt; (referral link) with Blush Nano switches. I love it. I can type more quickly than I could on the K15 and it feels and sounds amazing. It&amp;rsquo;s also smaller than the K15, so it&amp;rsquo;s easier to pack between my home and office. And there&amp;rsquo;s lots of &lt;a href="https://www.youtube.com/watch?v=YkSMSlhVRnw"&gt;RGB&lt;/a&gt;, which isn&amp;rsquo;t a big selling point for me, but I do like the starburst effect (each key lights up and fades out as you type).&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 08:44:39 +0000</pubDate><guid>f992836d-786d-492b-aa49-39cb0e22fe2b</guid></item><item><title>Pokémon or Ikea?</title><link>http://curtmerrill.com/blog/2025/pokemon-or-ikea/</link><description>&lt;p&gt;Is &lt;I&gt;Oxmyren&lt;/i&gt; a countertop bathroom sink or a water-type from the Kanto region? Do you know your &lt;i&gt;Ekans&lt;/i&gt; from your &lt;I&gt;Ektorp&lt;/I&gt;?&lt;/p&gt;
&lt;p&gt;Test your knowledge by identifying the names as Pokémon or Ikea products (or just guess):&lt;/p&gt;
&lt;figure&gt;
&lt;div class="border" data-frame-src="https://static.curtmerrill.com/includes/2025-pokemon-ikea/index.html"&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;script src="/static/js/frames.js"&gt;&lt;/script&gt;

&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;My kiddo started getting interested in Pokémon this school year, so I started hearing a lot about Pikachu and lots of others. Then, on a trip to Ikea, I realized that some of the names sounded like they could be caught with a Poké Ball. I found lists of &lt;a href="https://pokemondb.net/pokedex/all"&gt;Pokémon&lt;/a&gt; and &lt;a href="https://lar5.com/ikea/"&gt;Ikea products&lt;/a&gt; and created this quiz.&lt;/p&gt;</description><pubDate>Sat, 10 May 2025 13:35:14 +0000</pubDate><guid>6210531b-dbbe-4578-9828-8ca8b8cc0792</guid></item><item><title>Who shows up to city council on time?</title><link>http://curtmerrill.com/blog/2025/atlanta-city-council/</link><description>&lt;p&gt;Atlanta City Council meeting minutes include which members were present and what time they arrived, which made me curious—who shows up on time?&lt;/p&gt;
&lt;p&gt;The council uses &lt;a href="https://granicus.com"&gt;Granicus&lt;/a&gt; to post agendas and minutes in a &lt;a href="https://citycouncil.atlantaga.gov/legislation/city-council-meeting-minutes"&gt;structured HTML page&lt;/a&gt;. I downloaded minutes for all of the meetings in 2024—165 in all.&lt;/p&gt;
&lt;figure&gt;
&lt;img class="border" src="https://static.curtmerrill.com/2025/meeting.jpg"&gt;
&lt;figcaption&gt;The first page of the meeting minutes shows who attended and what time they arrived.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then I compared the stated arrival time for each attendee to the meeting&amp;rsquo;s scheduled time. I used Simon Wilson&amp;rsquo;s &lt;code&gt;llm&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;The models I have access to wouldn&amp;rsquo;t accept PDFs as attachments, so I first had to convert each file to a PNG. Since the attendance information is always on the first page, it was relatively straightforward to do with imagemagick.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for f in $(ls pdfs); do
  magick convert -density 150 &amp;quot;pdfs/$f[0]&amp;quot; &amp;quot;pngs/$f.png&amp;quot;
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After testing a few documents one a time, I wrote a Python script to submit all 165 and generate a CSV. There was still some manual clean-up required, including normalizing the spelling of names (the llm output created multiple variations for some of the names).&lt;/p&gt;
&lt;p&gt;So who shows up on time? The council legislative assistants rarely show up late—they usually arrive at least 30 minutes before the meeting.&lt;/p&gt;
&lt;p&gt;Councilman Julian Bond is the tardiest, averaging 30 minutes late over 52 meetings.&lt;/p&gt;
&lt;h2&gt;Charts&lt;/h2&gt;
&lt;figure&gt;
&lt;div id="charts"&gt;&lt;/div&gt;
&lt;/figure&gt;

&lt;h2&gt;Postscript&lt;/h2&gt;
&lt;p&gt;I tried a couple of different approaches for plotting the data, and settled on the histograms above as the clearest.&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://static.curtmerrill.com/2025/beeswarm.jpg"&gt;
&lt;figcaption&gt;An attempted beeswarm plot of meeting arrival times.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
&lt;img src="https://static.curtmerrill.com/2025/heatmap.png"&gt;
&lt;figcaption&gt;Draft of a heat map plot showing frequency of arrival times.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;style&gt;

.chart-title {
  max-width: unset;
  font-size: var(--step-0);
}

p.annotation {
  margin-top: 0;
  margin-bottom: 0;
  font-size: var(--step--1);
  color: var(--color-text-muted);
}
p.annotation:first-of-type {
  margin-top: calc(var(--space-s) / 4);
}
p.annotation:last-of-type {
  margin-bottom: var(--space-s);
}

.label text {
  fill: oklch(from var(--color-neutral-95) 40% c h);
  font-size: var(--step--1);
  font-weight: bold;
}

rect:not([fill]) {
  fill: var(--color-alt1);
}
.axis .tick text {
  fill: var(--color-text-muted);
  font-size: var(--step--1);

}
.axis .tick line {
  stroke: oklch(from var(--color-text-muted) 80% c h);
}

text.x-axis {
  fill: var(--color-text-muted);
  font-size: var(--step--1);
  text-anchor: middle;
}

rect.orange {
  fill: var(--color-alt1);
}

rect.green {
  fill: var(--color-green-base);
}

.chart-subtitle &gt; span {
  font-weight: normal;
  color: oklch(from var(--color-neutral-95) 50% c h);

}
&lt;/style&gt;

&lt;script src="/static/js/council.js"&gt;&lt;/script&gt;</description><pubDate>Wed, 30 Apr 2025 18:53:30 +0000</pubDate><guid>1f11bf45-c70f-4973-8e64-4fe4d6968ba7</guid></item><item><title>Blog Questions Challenge</title><link>http://curtmerrill.com/blog/2025/blog-questions-challenge/</link><description>&lt;p&gt;As best as I can tell, this started with &lt;a href="https://blog.avas.space/bear-blog-challenge/"&gt;a post on blog.avas.space&lt;/a&gt;. I can&amp;rsquo;t remember where I first saw it&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; — that&amp;rsquo;s one downside of RSS readers: you lose some visual cues, so it&amp;rsquo;s harder to recall specific sites. No one tagged me, but I thought it was a fun idea.&lt;/p&gt;
&lt;h2 class="h3"&gt;Why did you start blogging in the first place?&lt;/h2&gt;

&lt;p&gt;I think I started my first &amp;ldquo;blog&amp;rdquo; in 2000. I was hand-writing HTML and uploading it to a friend&amp;rsquo;s server. Those files were lost sometime in the era of &lt;a href="https://en.wikipedia.org/wiki/Zip_drive"&gt;Zip disks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I began publishing online as a way to experiment with the web and share updates with my friends and family. I posted about what I was doing, including photos and playlists from my &lt;a href="https://www.ksuaradio.com"&gt;college radio&lt;/a&gt; show.&lt;/p&gt;
&lt;h2 class="h3"&gt;What platform are you using to manage your blog, and why did you choose it? Have you blogged on other platforms before?&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;m currently using &lt;a href="https://github.com/curtmerrill/cmsmc"&gt;Curt Merrill&amp;rsquo;s System for Managing Content&lt;/a&gt; (CMSMC), a Django app I&amp;rsquo;m building. I chose to create my own platform to gain experience in developing and deploying a web app and to focus on the features I want or need.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve used other systems before, including &lt;a href="https://wordpress.org"&gt;WordPress&lt;/a&gt;, &lt;a href="https://www.movabletype.org"&gt;Movable Type&lt;/a&gt;, LiveJournal, &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;, &lt;a href="https://jekyllrb.com"&gt;Jekyll&lt;/a&gt;, and &lt;a href="https://getpelican.com"&gt;Pelican&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class="h3"&gt;How do you write your posts? For example, in a local editing tool or in a panel/dashboard that's part of your blog?&lt;/h2&gt;

&lt;p&gt;Lately, I&amp;rsquo;ve been starting posts in my notes app, &lt;a href="https://noteplan.co"&gt;NotePlan&lt;/a&gt;. I haven&amp;rsquo;t set up a decent text editor in my CMS, so writing there is a frustrating experience.&lt;/p&gt;
&lt;h2 class="h3"&gt;When do you feel most inspired to write?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m most inspired to write when I&amp;rsquo;m reading others&amp;rsquo; blogs. But once I create a new document and give it a title, writing suddenly feels like the last thing I want to do.&lt;/p&gt;
&lt;h2 class="h3"&gt;Do you publish immediately after writing, or do you let it simmer as a draft?&lt;/h2&gt;

&lt;p&gt;It takes me a while to complete a post. I tend to jot down a few notes and then step away for a while. Later, I&amp;rsquo;ll come back to create an outline and let that sit. Over multiple sessions, I flesh it out until I get tired of editing and finally click &amp;ldquo;publish.&amp;rdquo; But I almost always find more edits to make afterward.&lt;/p&gt;
&lt;h2 class="h3"&gt;What’s your favorite post on your blog?&lt;/h2&gt;

&lt;p&gt;Recency bias may be at play, but I&amp;rsquo;d go with &lt;a href="https://curtmerrill.com/blog/2025/framed/"&gt;Framed&lt;/a&gt;. I&amp;rsquo;m proud of getting the figures to update as I log more plays of the game.&lt;/p&gt;
&lt;h2 class="h3"&gt;Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature?&lt;/h2&gt;

&lt;p&gt;My main goal is to publish more often.&lt;/p&gt;
&lt;p&gt;As for features, I&amp;rsquo;d like to add &lt;a href="https://indieweb.org/Webmention"&gt;Webmention&lt;/a&gt; support, and I really admire Darek Kay&amp;rsquo;s &lt;a href="https://darekkay.com/blog/rss-styling/"&gt;styled RSS feed&lt;/a&gt;.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Here are some others&amp;rsquo; responses: &lt;a href="https://kevquirk.com/blog/blog-questions-challenge"&gt;Kev&lt;/a&gt;, &lt;a href="https://netigen.com/read/blog-questions-challenge"&gt;netigen&lt;/a&gt;, &lt;a href="https://home.hedy.dev/posts/blog-questions-challenge/"&gt;hedy&lt;/a&gt;, &lt;a href="https://joelchrono.xyz/blog/blog-questions-challenge-2025/"&gt;Joel&lt;/a&gt;, &lt;a href="https://ethanmarcotte.com/wrote/blog-questions-challenge/"&gt;Ethan&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><pubDate>Fri, 14 Mar 2025 19:27:32 +0000</pubDate><guid>610b736d-52ed-47a1-986c-bea0651b946a</guid></item><item><title>Weeknotes 2025-W8</title><link>http://curtmerrill.com/blog/2025/weeknotes-2025-w8/</link><description>&lt;p&gt;This week I transitioned away from Django’s built-in &lt;code&gt;flatpages&lt;/code&gt; app to my own version. The built-in version only has one “body” so whenever you save changes, those edits become public immediately. I like to be able to save and preview changes before making them public.&lt;/p&gt;
&lt;p&gt;My page model has two “body” fields. I write and make edits in &lt;code&gt;body_markdown&lt;/code&gt;. I have a view and template so that I can see how it will render without publishing. When I’m ready to publish, I render the contents of &lt;code&gt;body_markdown&lt;/code&gt; into the &lt;code&gt;body_html&lt;/code&gt; field. The public-facing view and template display &lt;code&gt;body_html&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Having the option to edit and preview a draft version let me feel comfortable re-doing my &lt;a href="/now/"&gt;/now&lt;/a&gt; page. I could experiment and test and didn’t have to worry about publishing partially finished edits.&lt;/p&gt;
&lt;p&gt;I set up my second automation in &lt;a href="https://www.home-assistant.io"&gt;Home Assistant&lt;/a&gt; this week, too. I have a tendency to leave the light on in the closet, but now I don’t have to worry about it.&lt;/p&gt;
&lt;p&gt;When the closet &lt;a href="https://www.aqara.com/en/product/motion-sensor-p1"&gt;sensor&lt;/a&gt; detects motion, it starts a 5-minute timer. When the timer reaches zero, it turns off the light. If the timer has started and motion is detected again, the timer restarts at 5 minutes.&lt;/p&gt;
&lt;p&gt;In my post about the &lt;a href="https://curtmerrill.com/blog/2025/light-up-map/"&gt;light-up map&lt;/a&gt;, I included a short video. I downloaded &lt;a href="https://www.blackmagicdesign.com/products/davinciresolve"&gt;DaVinci Resolve&lt;/a&gt; and watched a one-minute tutorial on YouTube for how to blur sections of the frame. It was surprisingly easy considering I’d never used the program before.&lt;/p&gt;
&lt;p&gt;While tabbing through the handful of sites I visit regularly, I came across &lt;a href="https://sober-ringtones.wize.io"&gt;Sober Ringtones&lt;/a&gt;. My phone is on silent 99.9% of the time, but I decided to use one of these anyway. Setting up a custom ringtone is kind of a pain. I had to download Garageband to my iPhone, figure out how to import the MP3 clip, trim the length of the “song,” and &lt;em&gt;then&lt;/em&gt; I could export it to use as a ringtone. I’m glad I don’t expect to do this very often.&lt;/p&gt;</description><pubDate>Sun, 23 Feb 2025 00:39:56 +0000</pubDate><guid>dc07cf62-c2d0-422c-ac44-78375947ba41</guid></item><item><title>Light-up map</title><link>http://curtmerrill.com/blog/2025/light-up-map/</link><description>&lt;p&gt;Last summer I had some time off and I wanted to build something for my child (a couple years ago I built a simple &lt;a href="https://curtmerrill.com/blog/2020/busy-box-v1/"&gt;busy box&lt;/a&gt;). I was already thinking of something involving a map when I saw &lt;a href="https://www.youtube.com/@laurakampf/"&gt;Laura Kampf&lt;/a&gt; make a light-up map showing the locations of where people lived (unfortunately, I can&amp;rsquo;t find the specific video now).&lt;/p&gt;
&lt;p&gt;My local makerspace has a &lt;a href="https://glowforge.com"&gt;Glowforge&lt;/a&gt; that I wanted to try out. It can import a vector illustration, so I started with an SVG of the United States. I ordered push buttons and LEDs and carefully measured them so I could add correctly sized holes.&lt;/p&gt;
&lt;p&gt;I assembled the SVG in &lt;a href="https://affinity.serif.com/en-us/designer/"&gt;Affinity Designer&lt;/a&gt;. It took a couple of tries to get everything arranged so that it would fit within the Glowforge’s work area, and then a couple more tries to make sure the different elements were in proper layers for the Glowforge software to differentiate between cutting (for the holes) and etching (for the map and labels).&lt;/p&gt;
&lt;p&gt;The labels are set in &lt;a href="https://aresluna.org/the-hardest-working-font-in-manhattan/"&gt;Gorton&lt;/a&gt;, a font I got for backing a &lt;a href="https://www.kickstarter.com/projects/mwichary/shift-happens"&gt;Kickstarter project about keyboards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After finishing the front panel, I cut some sides and back to match. Then it was time to wire everything up. My original idea was to use a microcontroller, but I decided to keep it simple and stick to plain circuits. I did use a &lt;a href="https://www.adafruit.com/product/4090"&gt;USB breakout board&lt;/a&gt; for power, though.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Chaotic wiring inside wooden box" src="https://static.curtmerrill.com/2025/map-inside.jpg"&gt;
&lt;figcaption&gt;The inside of the box isn't pretty, but it works OK.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I looked up the forward voltages on the LEDs and wired each switch to an appropriate resister and the corresponding diode. I connected the wrong leads a couple of times, but I was able to recover by cutting the wire and joining it inside some heat-shrink tubing.&lt;/p&gt;
&lt;p&gt;There is one mistake that I didn&amp;rsquo;t recover from. I wanted one location to light up in two different colors, so I used an RGB LED. I wanted one button to make it up red and another button to light it up yellow. I used mismatched resisters on the red and yellow leads, though, and electricity takes the path of least resistance, so it only lights up red.&lt;/p&gt;
&lt;figure&gt;
&lt;video controls muted poster="https://static.curtmerrill.com/2025/map-demo-poster.jpg"&gt;
&lt;source src="https://static.curtmerrill.com/2025/map-demo.mp4" type="video/mp4" /&gt;
&lt;/video&gt;
&lt;figcaption&gt;Demonstration of the lights&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Other than that, I&amp;rsquo;m happy with how it turned out and it&amp;rsquo;s gotten some use. My daughter even complimented me on my &amp;ldquo;invention&amp;rdquo;—just about the highest praise one can receive.&lt;/p&gt;</description><pubDate>Mon, 17 Feb 2025 23:23:39 +0000</pubDate><guid>a813b9eb-c90e-4f0a-b17b-ab0b201a4f20</guid></item><item><title>Framed</title><link>http://curtmerrill.com/blog/2025/framed/</link><description>&lt;p&gt;I&amp;rsquo;ve been playing &lt;a href="https://framed.wtf"&gt;Framed&lt;/a&gt; &lt;span id="date-range"&gt;for a while&lt;/span&gt;, and logging my results.&lt;/p&gt;
&lt;p&gt;Of the &lt;span id="game-count"&gt;many&lt;/span&gt; games I&amp;rsquo;ve played, I&amp;rsquo;ve correctly identified the movie &lt;span id="correct-count"&gt;quite a few&lt;/span&gt; times&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s interesting is that I&amp;rsquo;ve been able to identify &lt;span id="unseen-correct-count"&gt;a handful&lt;/span&gt; without having seen the movie. Some of which I recognize from exposure through pop culture, while others are lucky guesses (sometimes helped by autocomplete).&lt;/p&gt;
&lt;figure&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;&lt;th class="table-num" scope="col"&gt;Seen&lt;/th&gt;&lt;th class="table-num" scope="col"&gt;Not seen&lt;/th&gt;&lt;th class="table-num" scope="col"&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Correct&lt;/th&gt;&lt;td class="table-num" id="seen-correct"&gt;&lt;/td&gt;&lt;td class="table-num" id="not-seen-correct"&gt;&lt;/td&gt;&lt;td class="table-num" id="total-correct"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Incorrect&lt;/th&gt;&lt;td class="table-num" id="seen-incorrect"&gt;&lt;/td&gt;&lt;td class="table-num" id="not-seen-incorrect"&gt;&lt;/td&gt;&lt;td class="table-num" id="total-incorrect"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;th scope="row"&gt;Total&lt;/th&gt;&lt;td class="table-num" id="seen-all"&gt;&lt;/td&gt;&lt;td class="table-num" id="not-seen-all"&gt;&lt;/td&gt;&lt;td class="table-num" id="total"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;/table&gt;
&lt;figcaption&gt;Breakdown of results based on whether or not I've seen the movie
&lt;/figure&gt;

&lt;p&gt;For the movies that I do identify correctly, it takes an average of &lt;span id="average-guesses"&gt;a few&lt;/span&gt; guesses.&lt;/p&gt;
&lt;figure&gt;
&lt;div id="framed-histogram"&gt;&lt;/div&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Here is a list of the games where I correctly identified the movie on the first frame:&lt;/p&gt;
&lt;ul id="first-guesses" class="cluster framed-list" role="list"&gt;&lt;/ul&gt;

&lt;script src="/static/js/framed.js"&gt;&lt;/script&gt;
&lt;style&gt;
#guess-chart-title { margin-block-start: 0; }
.label.y g.tick &gt; text { font-size: var(--step--1); font-weight: bold; }
rect { fill: var(--color-brand); }
ul.framed-list { justify-content: left; font-variant-numeric: tabular-nums; }
.framed-list &gt; li { flex: 0 0 4ch; }
&lt;/style&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;span id="framed-timestamp"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;The figures in this post will update as I continue to log more games.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><pubDate>Sun, 02 Feb 2025 19:52:04 +0000</pubDate><guid>11889ec5-abf4-437b-99d9-f07719371437</guid></item><item><title>Tailscale and Certbot for accessing my homelab</title><link>http://curtmerrill.com/blog/2024/tailscale-and-certbot-for-accessing-homelab/</link><description>&lt;p&gt;For my internal network at home, I have a &lt;a href="https://pi-hole.net"&gt;Pi-hole&lt;/a&gt; instance running as my DNS server. I&amp;rsquo;ve added records to point subdomains at their appropriate servers. &lt;/p&gt;
&lt;p&gt;&lt;a href="https://tailscale.com"&gt;Tailscale&lt;/a&gt; gives each server its own &amp;ldquo;Tailnet&amp;rdquo; IP address that is only accessible from devices within the Tailnet. By adding &lt;a href="https://tailscale.com/kb/1054/dns#public-dns-records"&gt;public A records&lt;/a&gt; for my services using their Tailnet IPs, I can now access my homelab services using their subdomains whether I&amp;rsquo;m on my local network or connected to my Tailnet.&lt;/p&gt;
&lt;p&gt;One downside is that I need to update DNS records in two places when I add or remove a subdomain. That doesn&amp;rsquo;t happen too often, though, so it&amp;rsquo;s not a big deal.&lt;/p&gt;
&lt;p&gt;Thanks, Tailscale!&lt;/p&gt;
&lt;h2&gt;HTTPS all the things!&lt;/h2&gt;
&lt;p&gt;I use &lt;a href="https://letsencrypt.org"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; and &lt;a href="https://certbot.eff.org"&gt;Certbot&lt;/a&gt; for generating SSL certificates for my projects. My usual method is to use Certbot and its &lt;a href="https://eff-certbot.readthedocs.io/en/stable/using.html#nginx"&gt;nginx plugin&lt;/a&gt;. That generates a file that is served via the web so that Let&amp;rsquo;s Encrypt can verify I control the domain.&lt;/p&gt;
&lt;p&gt;Since my homelab services are only accessible from within my network or via Tailscale, I wasn&amp;rsquo;t sure I could use Certbot. &lt;/p&gt;
&lt;p&gt;My first thought was to create a simple service on my public-facing Linode VPS to generate a certificate and then copy files to my home server. I could probably automate that process, but I was worried that the certificates could get out of sync and that my services would be temporarily unreachable.&lt;/p&gt;
&lt;p&gt;Then I came across the &lt;a href="https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins"&gt;DNS based certificate process&lt;/a&gt;. Certbot has a plugin to use the Linode API to generate a TXT record for domain verification. It was easy to set up and now I have a wildcard certificate for my internal domain that can be reliably renewed.&lt;/p&gt;
&lt;p&gt;Thanks, Certbot!&lt;/p&gt;</description><pubDate>Mon, 30 Dec 2024 15:25:48 +0000</pubDate><guid>4b2cebe4-b657-4887-ae47-ceb692abebd8</guid></item><item><title>2024 in review: Travel</title><link>http://curtmerrill.com/blog/2024/2024-in-review-travel/</link><description>&lt;p&gt;First time visits are in &lt;strong&gt;bold&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chattanooga, Tennessee&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Baltimore, Maryland&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;St. Simon&amp;rsquo;s&lt;/strong&gt;, Georgia&lt;/li&gt;
&lt;li&gt;Birmingham, Alabama&lt;/li&gt;
&lt;li&gt;Fairbanks and Denali, Alaska&lt;/li&gt;
&lt;li&gt;Knoxville, Tennessee&lt;/li&gt;
&lt;li&gt;Walt Disney World, Florida&lt;/li&gt;
&lt;li&gt;Washington, DC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pigeon Forge&lt;/strong&gt; and Knoxville, Tennessee&lt;/li&gt;
&lt;li&gt;Washington, DC&lt;/li&gt;
&lt;li&gt;Knoxville, Tennessee&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As of December 31, 2024, I&amp;rsquo;ve visited 35 of 56 U.S. states, territories and federal districts&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. &lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://static.curtmerrill.com/2024/flighty.png"&gt;
&lt;figcaption&gt;Image of year-end stats from &lt;a href="https://flighty.com"&gt;Flighty&lt;/a&gt; iOS app.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;50 states; Washington, DC; American Samoa; Guam; Northern Mariana Islands, Puerto Rico; U.S. Virgin Islands (&lt;a href="https://en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States"&gt;via Wikipedia&lt;/a&gt;)&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><pubDate>Fri, 27 Dec 2024 00:33:04 +0000</pubDate><guid>f876a0cd-a3c3-44ae-8ce6-f361b1907f63</guid></item></channel></rss>