Seth Larsonhttps://sethmlarson.dev/feed2026-06-18T00:00:00ZSeth Larsonhttps://sethmlarson.dev[email protected]https://github.com/sethmlarson.pnghttps://github.com/sethmlarson.pngWerkzeugTIL “@here” only notifies online users on Discord and Slackhttps://sethmlarson.dev/til-at-here-only-notifies-online-users-on-discord-and-slack?utm_campaign=rss2026-06-18T00:00:00Z2026-06-18T00:00:00ZSeth Larson<p>I'm in a few Discord servers of friends and we get together in-person
regularly. Whenever I was the one organizing an event
I would attempt to ping everyone details in the Discord using <code>@here</code>.</p>
<p>After the initial ping I would usually follow-up with
folks over text, which is fine and expected part of organizing.
More often than not, invitees would be <em>way more responsive</em> over text than over Discord. I created an <a href="https://sethmlarson.dev/sms-bcc">SMS BCC
tool</a> because of how effective texting is for organizing events.</p>
<p>Turns out that <code>@here</code> is <a href="https://superuser.com/questions/1212953/how-do-everyone-and-here-work-whats-the-difference-between-them"><em>functionally different</em></a> from <code>@everyone</code> or <code>@channel</code> on Slack and Discord.
<!-- more -->
<code>@here</code> only sends notifications to users that are <em>currently online</em> 🟢, not offline ⚫
or “away” 🟡. This makes <code>@here</code> useful for when you’re trying to play
an online multiplayer game or chat synchronously... but not for planning
a hang-out in advance. So none of my usually-offline friends on Discord
would get my initial notification, only the follow-ups. I’ll be using
<code>@channel</code> for this purpose from now on.</p>
<p>I learned this from a friend and <em>three people</em> including me were not aware
of this distinction, so I figure I have to share this on the blog. Maybe
this will help you increase the turn-out for the next event you host
for Discord friends. What other Discord or Slack hacks am I probably unaware of?
Send them to me via email or on social media.</p>
<p><em>Happy organizing!</em> </p>
<br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>Linting is important for code review: screen includedhttps://sethmlarson.dev/linting-screen-during-code-review?utm_campaign=rss2026-06-11T00:00:00Z2026-06-11T00:00:00ZSeth Larson<p>Today I was reviewing a pull request for some Python code
when I saw a semicolon in the diff.
<!-- more -->
Screenshot
provided below, which as we all know is the best way to share
text on the internet:</p>
<p>
<center>
<img alt="Picture of code with a semicolon (;)" style="border: 2px black solid; max-width: 100%;" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5329_small.jpeg"/>
<br><small><em></em></small>
</center>
</p>
<p>I was just about to leave a comment, but then I scrolled the page a bit and... </p>
<p>
<center>
<img alt="Same picture of code, but the dot on top of the semicolon has shifted away revealing it is only a piece of dirt on the screen above a comma (,)" style="border: 2px black solid; max-width: 100%;" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5332_small.jpeg"/>
<br><small><em></em></small>
</center>
</p>
<p>Ah. Time to clean my laptop screen then... 🧼🫧</p>
<br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>Are insecure code completions a vulnerability?https://sethmlarson.dev/are-insecure-code-completions-a-vulnerability?utm_campaign=rss2026-06-10T00:00:00Z2026-06-10T00:00:00ZSeth Larson<p>Three months ago I saw that PyCharm shipped with a
“<a href="https://www.jetbrains.com/help/pycharm/full-line-code-completion.html">Full Line Completion</a>” plugin that “uses a local deep
learning model to suggest entire lines of code”. These
suggestions manifest as whole-line suggestions after
you start typing and can be accepted with <code>Tab</code>. Essentially
auto-complete for entire lines.</p>
<p>I decide to test this functionality. I started by
writing <code>import urllib3</code>, created a new line,
and then typed <code>u</code> and received a suggested completion for the line
marked below with a
<span style="border: 2px black dashed; padding-left: 2px; padding-right: 2px;">dashed border</span>.
I was not impressed by the result:</p>
<!-- more -->
<div class="codehilite">
<pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">urllib3</span>
<span class="n">u</span><span style="border: 2px black dashed"><span class="n">rllib3</span><span class="o">.</span><span class="n">disable_warnings</span><span class="p">(</span><span class="n">urllib3</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">InsecureRequestWarning</span><span class="p">)</span></span>
</code></pre>
</div>
<p>Accepting this line would mean that any insecure
requests made with <code>urllib3</code> would not result in a user-visible warning.
I didn't accept this suggestion and then began to instantiate a
<code>urllib3.PoolManager</code> and what I feared would come next was confirmed:</p>
<div class="codehilite">
<pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">urllib3</span>
<span class="n">urllib3</span><span class="o">.</span><span class="n">PoolManager</span><span class="p">(</span>
<span style="border: 2px black dashed"> <span class="n">cert_reqs</span><span class="o">=</span><span class="s1">'CERT_NONE'</span><span class="p">,</span></span>
</code></pre>
</div>
<p>The suggestion offered to disable certificate verification (<a href="https://docs.python.org/3/library/ssl.html#ssl.CERT_NONE"><code>CERT_NONE</code></a>) which
would make every request made by the <code>PoolManager</code> susceptible to
monster-in-the-middle (MITM) attacks. Accepting this code as-is would
mean the program I am writing has a severe vulnerability. If I
had accepted the prior suggestion too, then <code>urllib3</code> would
have no chance to warn the user about this mistake prior
to productionizing this code.</p>
<p>Clearly <em>something</em> insecure is going on here, but for a CVE
to be assigned we have to decide which software component is
vulnerable. Does this behavior warrant a CVE at all? I am not sure
which is unfortunate, without a security-angle to a bug
report companies are less likely to prioritize reports.</p>
<p>I reported this behavior to JetBrains for “Full Line Code Completion” v253.29346.142
and clearly their support staff weren't certain whether this defect
was a security vulnerability or not either. When I asked to
publish a blog post about this behavior after they confirmed
this report wasn’t a “direct security vulnerability” (which
I agree with) but then was asked not to publicize my report and referred to
PyCharm’s <a href="https://www.jetbrains.com/legal/docs/terms/coordinated-disclosure/">Coordinated Disclosure Policy</a>
so... which is it? Security vulnerability or not?</p>
<p>I ended up waiting the 90 days anyway and I didn't hear
back with any substantive update from the development team. I double-checked again
today using “Full Line Code Completion” v261.24374.152
and the behavior is identical, suggesting the same
insecure code for both contexts. </p>
<p>This isn’t meant to be a specific dig at PyCharm or JetBrains,
I have no-doubt that examples like this exist in every code generation
model available. I don’t think using CVEs for this purpose is
appropriate or helpful for users, either. But not prioritizing and addressing this
behavior at the source means more work to mitigate
the potential for insecure code to be accepted by users who are trusting
what is offered to them by their IDE.</p>
<p>What do you think? I am interested in knowing your thoughts
about this specific class of issue with code generation models.</p>
<br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>Is the Super Smash Bros. Brawl donut from Mister Donut?https://sethmlarson.dev/is-the-donut-from-super-smash-bros-brawl-a-mister-donut?utm_campaign=rss2026-06-05T00:00:00Z2026-06-05T00:00:00ZSeth Larson<p>Happy <a href="https://en.wikipedia.org/wiki/National_Donut_Day">Donut Day</a> (and <a href="https://sethmlarson.dev/fedi-donut-friday">#FediDonutFriday</a>) to those who celebrate! 🍩
<a href="https://www.presentandcorrect.com/">Present and Correct</a> shared a link to the <a href="https://www.misterdonut.jp/enjoy/zukan/donut/y1971.html">Mister Donut
museum on Bluesky</a> and upon clicking through
I was greeted with a familiar face: a chocolate ring donut.</p>
<p>Strangely, I've seen this chocolate ring donut before: from the <a href="https://sethmlarson.dev/food-jpegs-in-super-smash-bros-and-kirby-air-riders">hours
staring at sprite-sheets</a> from the Super Smash Bros.
and Kirby Air Riders franchises. That donut looked just
like the one from Super Smash Bros. Brawl.</p>
<!-- more -->
<p>“But Seth”, I hear you say, “chocolate ring donuts all look the same
anyway!” Maybe... <em>and yet...</em></p>
<p><center>
<img width="140px" style="" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/food-jpegs/ssbb-donut.png">
<img width="128px" src="https://www.misterdonut.jp/enjoy/zukan/donut/img/00053.jpg"/>
</center></p>
<p>Funnily enough, the <a href="https://github.com/Render96/Render96Wiki">Render96 wiki</a>, which collects origins for
artwork for many games like Super Smash Bros., lists
<a href="https://github.com/Render96/Render96Wiki/wiki/Super-Smash-Bros.-Melee#currently-missing">the donut from Super Smash Bros. Melee</a> as one of the few foods
where the origin is not known. Could this donut <em>also</em> be a Mister Donut?
We'll probably never know!</p>
<br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>How much “Super Mario” per year?https://sethmlarson.dev/super-mario-per-year?utm_campaign=rss2026-05-29T00:00:00Z2026-05-29T00:00:00ZSeth Larson<p>It's impossible to objectively quantify art, but we try anyway.
For example: Is “<a href="https://en.wikipedia.org/wiki/Super_Mario">Super Mario</a>” a good video-game franchise?</p>
<p>Looking at review scores, Super Mario includes some of the most universally-acclaimed games ever published: Galaxy, Galaxy 2, and Odyssey
are respectively the #4, #5, and #13 highest ranking video-games
of all time on Metacritic, all with 97 overall. <em>Chances seem good?</em></p>
<!-- more -->
<p>What if we tried quantifying art in a different and slightly more reductive way?
This blog post introduces and calculates a new unit: <strong>“Super Mario per year”</strong>.
If you enjoy this franchise like I do then this unit is of particular importance to you.</p>
<!-- more -->
<h2>Calculating “Super Mario per year”</h2>
<p>There have been ~19 titles (and two add-ons) published to what I consider
the "main-line" Super Mario games, both 2D and 3D. Below is a table
with every title, the year it was published, and the approximate
duration to play. This last column is the most subjective, because
there’s speed-runners, casual players, completionists. If you think any value
is way off, <a href="mailto:[email protected]">send me an email</a>.</p>
<table>
<thead>
<tr>
<th>Game</th>
<th>2D/3D</th>
<th>Platform</th>
<th>Year</th>
<th>Time to Beat</th>
</tr>
</thead>
<tbody>
<tr>
<td>Super Mario Bros.</td>
<td>2D</td>
<td>NES</td>
<td>1985</td>
<td><a href="https://retroachievements.org/game/1446">5 hours</a></td>
</tr>
<tr>
<td>Super Mario Bros. Lost Levels</td>
<td>2D</td>
<td>NES</td>
<td>1986</td>
<td><a href="https://retroachievements.org/game/5183">10 hours</a></td>
</tr>
<tr>
<td>Super Mario Bros. 2</td>
<td>2D</td>
<td>NES</td>
<td>1988</td>
<td><a href="https://retroachievements.org/game/1994">5 hours</a></td>
</tr>
<tr>
<td>Super Mario Bros. 3</td>
<td>2D</td>
<td>NES</td>
<td>1988</td>
<td><a href="https://retroachievements.org/game/1995">5 hours</a></td>
</tr>
<tr>
<td>Super Mario Land</td>
<td>2D</td>
<td>GB</td>
<td>1989</td>
<td><a href="https://retroachievements.org/game/504">5 hours</a></td>
</tr>
<tr>
<td>Super Mario World</td>
<td>2D</td>
<td>SNES</td>
<td>1990</td>
<td><a href="https://retroachievements.org/game/228">10 hours</a></td>
</tr>
<tr>
<td>Super Mario Land 2</td>
<td>2D</td>
<td>GB</td>
<td>1992</td>
<td><a href="https://retroachievements.org/game/540">10 hours</a></td>
</tr>
<tr>
<td>Super Mario 64</td>
<td>3D</td>
<td>N64</td>
<td>1996</td>
<td><a href="https://retroachievements.org/game/10003">15 hours</a></td>
</tr>
<tr>
<td>Super Mario Sunshine</td>
<td>3D</td>
<td>GC</td>
<td>2002</td>
<td><a href="https://retroachievements.org/game/6049">20 hours</a></td>
</tr>
<tr>
<td>New Super Mario Bros.</td>
<td>2D</td>
<td>DS</td>
<td>2006</td>
<td><a href="https://retroachievements.org/game/11729">10 hours</a></td>
</tr>
<tr>
<td>Super Mario Galaxy</td>
<td>3D</td>
<td>Wii</td>
<td>2007</td>
<td><a href="https://retroachievements.org/game/189">15 hours</a></td>
</tr>
<tr>
<td>New Super Mario Bros. Wii</td>
<td>2D</td>
<td>Wii</td>
<td>2009</td>
<td><a href="https://retroachievements.org/game/95">5 hours</a></td>
</tr>
<tr>
<td>Super Mario Galaxy 2</td>
<td>3D</td>
<td>Wii</td>
<td>2010</td>
<td><a href="https://retroachievements.org/game/190">15 hours</a></td>
</tr>
<tr>
<td>Super Mario 3D Land</td>
<td>3D</td>
<td>3DS</td>
<td>2011</td>
<td><a href="https://howlongtobeat.com/game/9361">15 hours</a></td>
</tr>
<tr>
<td>New Super Mario Bros. 2</td>
<td>2D</td>
<td>3DS</td>
<td>2012</td>
<td><a href="https://howlongtobeat.com/game/6535">10 hours</a></td>
</tr>
<tr>
<td>New Super Mario Bros. U</td>
<td>2D</td>
<td>Wii U</td>
<td>2012</td>
<td><a href="https://howlongtobeat.com/game/63660">15 hours</a></td>
</tr>
<tr>
<td>Super Mario 3D World</td>
<td>3D</td>
<td>Wii U</td>
<td>2013</td>
<td><a href="https://howlongtobeat.com/game/9362">20 hours</a></td>
</tr>
<tr>
<td>Super Mario Odyssey</td>
<td>3D</td>
<td>Switch</td>
<td>2017</td>
<td><a href="https://howlongtobeat.com/game/42833">25 hours</a></td>
</tr>
<tr>
<td>Bowser's Fury (Super Mario 3D World)</td>
<td>3D</td>
<td>Switch</td>
<td>2021</td>
<td>5 hours</td>
</tr>
<tr>
<td>Super Mario Bros. Wonder</td>
<td>2D</td>
<td>Switch</td>
<td>2023</td>
<td><a href="https://howlongtobeat.com/game/130444">15 hours</a></td>
</tr>
<tr>
<td>Meetup at Bellabel Park (Super Mario Bros. Wonder)</td>
<td>2D</td>
<td>Switch</td>
<td>2026</td>
<td>5 hours</td>
</tr>
</tbody>
</table>
<p>Using the table above we can calculate approximately how much new
Super Mario gameplay is published on average per year.</p>
<table>
<thead>
<tr>
<th>Year</th>
<th>All-Time Avg</th>
<th>10-Year Avg (10YA)</th>
<th>2D (10YA)</th>
<th>3D (10YA)</th>
</tr>
</thead>
<tbody>
<tr>
<td>1985</td>
<td>5.0</td>
<td>5.0</td>
<td>5.0</td>
<td>0.0</td>
</tr>
<tr>
<td>1986</td>
<td>7.5</td>
<td>7.5</td>
<td>7.5</td>
<td>0.0</td>
</tr>
<tr>
<td>1987</td>
<td>5.0</td>
<td>5.0</td>
<td>5.0</td>
<td>0.0</td>
</tr>
<tr>
<td>1988</td>
<td>6.2</td>
<td>6.2</td>
<td>6.2</td>
<td>0.0</td>
</tr>
<tr>
<td>1989</td>
<td>6.0</td>
<td>6.0</td>
<td>6.0</td>
<td>0.0</td>
</tr>
<tr>
<td>1990</td>
<td>6.7</td>
<td>6.7</td>
<td>6.7</td>
<td>0.0</td>
</tr>
<tr>
<td>1991</td>
<td>5.7</td>
<td>5.7</td>
<td>5.7</td>
<td>0.0</td>
</tr>
<tr>
<td>1992</td>
<td>6.2</td>
<td>6.2</td>
<td>6.2</td>
<td>0.0</td>
</tr>
<tr>
<td>1993</td>
<td>5.6</td>
<td>5.6</td>
<td>5.6</td>
<td>0.0</td>
</tr>
<tr>
<td>1994</td>
<td>5.0</td>
<td>5.0</td>
<td>5.0</td>
<td>0.0</td>
</tr>
<tr>
<td>1995</td>
<td>4.5</td>
<td>5.0</td>
<td>5.0</td>
<td>0.0</td>
</tr>
<tr>
<td>1996</td>
<td>5.4</td>
<td>6.0</td>
<td>4.5</td>
<td>1.5</td>
</tr>
<tr>
<td>1997</td>
<td>5.0</td>
<td>5.0</td>
<td>3.5</td>
<td>1.5</td>
</tr>
<tr>
<td>1998</td>
<td>4.6</td>
<td>5.0</td>
<td>3.5</td>
<td>1.5</td>
</tr>
<tr>
<td>1999</td>
<td>4.3</td>
<td>4.0</td>
<td>2.5</td>
<td>1.5</td>
</tr>
<tr>
<td>2000</td>
<td>4.1</td>
<td>3.5</td>
<td>2.0</td>
<td>1.5</td>
</tr>
<tr>
<td>2001</td>
<td>3.8</td>
<td>2.5</td>
<td>1.0</td>
<td>1.5</td>
</tr>
<tr>
<td>2002</td>
<td>4.7</td>
<td>4.5</td>
<td>1.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2003</td>
<td>4.5</td>
<td>3.5</td>
<td>0.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2004</td>
<td>4.2</td>
<td>3.5</td>
<td>0.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2005</td>
<td>4.0</td>
<td>3.5</td>
<td>0.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2006</td>
<td>4.3</td>
<td>4.5</td>
<td>1.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2007</td>
<td>4.8</td>
<td>4.5</td>
<td>1.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2008</td>
<td>4.6</td>
<td>4.5</td>
<td>1.0</td>
<td>3.5</td>
</tr>
<tr>
<td>2009</td>
<td>4.6</td>
<td>5.0</td>
<td>1.5</td>
<td>3.5</td>
</tr>
<tr>
<td>2010</td>
<td>5.0</td>
<td>6.5</td>
<td>1.5</td>
<td>5.0</td>
</tr>
<tr>
<td>2011</td>
<td>5.4</td>
<td>8.0</td>
<td>1.5</td>
<td>6.5</td>
</tr>
<tr>
<td>2012</td>
<td>6.1</td>
<td>10.5</td>
<td>4.0</td>
<td>6.5</td>
</tr>
<tr>
<td>2013</td>
<td>6.6</td>
<td>10.5</td>
<td>4.0</td>
<td>6.5</td>
</tr>
<tr>
<td>2014</td>
<td>6.3</td>
<td>10.5</td>
<td>4.0</td>
<td>6.5</td>
</tr>
<tr>
<td>2015</td>
<td>6.1</td>
<td>10.5</td>
<td>4.0</td>
<td>6.5</td>
</tr>
<tr>
<td>2016</td>
<td>5.9</td>
<td>10.5</td>
<td>4.0</td>
<td>6.5</td>
</tr>
<tr>
<td>2017</td>
<td>6.5</td>
<td>12.0</td>
<td>3.0</td>
<td>9.0</td>
</tr>
<tr>
<td>2018</td>
<td>6.3</td>
<td>10.5</td>
<td>3.0</td>
<td>7.5</td>
</tr>
<tr>
<td>2019</td>
<td>6.1</td>
<td>10.5</td>
<td>3.0</td>
<td>7.5</td>
</tr>
<tr>
<td>2020</td>
<td>6.0</td>
<td>10.0</td>
<td>2.5</td>
<td>7.5</td>
</tr>
<tr>
<td>2021</td>
<td>5.9</td>
<td>9.0</td>
<td>2.5</td>
<td>6.5</td>
</tr>
<tr>
<td>2022</td>
<td>5.8</td>
<td>7.5</td>
<td>2.5</td>
<td>5.0</td>
</tr>
<tr>
<td>2023</td>
<td>6.0</td>
<td>6.5</td>
<td>1.5</td>
<td>5.0</td>
</tr>
<tr>
<td>2024</td>
<td>5.9</td>
<td>4.5</td>
<td>1.5</td>
<td>3.0</td>
</tr>
<tr>
<td>2025</td>
<td>5.7</td>
<td>4.5</td>
<td>1.5</td>
<td>3.0</td>
</tr>
<tr>
<td>2026</td>
<td>5.7</td>
<td>5.0</td>
<td>2.0</td>
<td>3.0</td>
</tr>
</tbody>
</table>
<p>This table will help you calculate approximately how much Super Mario
is coming in the next decade. The current 10-year window
pace shows <strong>5 hours of Super Mario per year</strong>.</p>
<p>Looking at the trends, it looks like we may have
already passed peak 2D and 3D Mario individually.
This table also shows how overdue we are for a new <em>big</em> 3D
Super Mario title, the last entry being Super Mario Odyssey
almost a decade ago in 2017.</p>
<p>If I were to somewhat morbidly apply these numbers I can
estimate how much more new “Super Mario” gameplay I’m likely to
experience. Let’s be optimistic and apply the “All-Time Average”
instead of the “10-Year Average”: the resulting number is 256 hours.
Around 10 games of similar size to “Super Mario Odyssey”... <em>seems good to me!</em></p>
<h2>Super Mario Blogroll</h2>
<p>If you want to read more Super Mario writing here
are a few personal selections from <a href="/blogroll">my blogroll</a>:</p>
<ul>
<li>“<a href="https://www.thrillingtalesofoldvideogames.com/blog/mario-101-history">Mario 101: For Super Players</a>” by Drew Mackie</li>
<li>“<a href="https://www.archdaily.com/783657/the-sheets-of-graph-paper-they-used-to-design-super-mario-bros">Super Mario Bros was designed on graph paper</a>” by Nicolás Valencia</li>
<li>“<a href="https://lmnt.me/blog/the-most-mario-colors.html">The most Mario colors</a>” by Louie Mantia</li>
</ul>
<p>Happy gaming!</p>
<br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>