<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/assets/css/xml.xsl"?>
<rss version="2.0">
  <channel>
    <title>TK&#39;s Web Quest</title>
    <link>https://tk-web.quest</link>
    <description>Tk&#39;s Web Quest is a personal website being made by hand, one log entry at a time.</description>
    <language>en</language>
    <lastBuildDate>Fri, 02 Oct 2026 00:00:00 +0000</lastBuildDate>
    
      <item>
        <title>The Process is the Juice</title>
        <link>https://tk-web.quest/blog/the-process-is-the-juice/</link>
        <guid>https://tk-web.quest/blog/the-process-is-the-juice/</guid>
        <pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>&quot;No. I don't care.&quot; The simple phrase coming from my wife somewhat took me aback. I was showing her the latest addition to our home server. I wasn't expecting a particularly strong enthusiasm from her in any case. To her, I was reinventing the wheel. Adding yet another solution to a solved problem. Sure, I tell her with each new service that &quot;now we don't have to use this other thing.&quot; Some of these solutions, these reinventions, have been for some sort of financial or feature benefit. A network share and file server replaces Dropbox. A photo library replaces Google Photos. A media server replaces bluray players and discs. All of them, to some degree though, are met with one question:</p>
<blockquote>
<p>Is all this work really worth it?</p>
</blockquote>
<p>At first, I was dismissive. If the work wasn't worth it, would I be doing it? The end goal is important. In this very specific example, it's digital independence. It's not paying hundreds of dollars a year for services that lock me in and tie me down, and of course the people in my life benefit from this too. AdGuard blocking ads on every device in the house has been a smash hit. The peace of mind of reliable and secure backups without that data being scraped by Google has been really nice.</p>
<p>But with every container, every service, every experiment, I began to think more about the question. Is it even the right question? Every time I feel like I hit equilibrium with the server, I find something new to do with it. A new tweak. A different application. A new service. More things I can host myself to eliminate my need for the tech giants. I am obviously not working on this thing with any sort of specific goal in mind. The work isn't <em>worth</em> it. I'm not trading anything here. I'm not ascribing value to my labor. No. The work is the entire point of it.</p>
<p>Process. Something about the process works for me. It makes me think of jigsaw puzzles. Not in that building out my self hosted infrastructure is particularly puzzle-like. No. I'm thinking about why a person might build jigsaw puzzles. You spend time, sometimes hours, putting together all the little pieces, but once the puzzle is done and on the table in front of you, there's some satisfaction, yes, but there's also a slight disappointment. It's over. The process is done and the jigsaw puzzle needs broken up and put back away. I feel the same way about most of my other hobbies. I like the act of taking photos a lot more than the act of going back to look at them. The feeling of carving into a piece at the lathe is electric, but my completed projects sit in drawers and boxes, forgotten and mundane.</p>
<p>Why does the process feel so much better than the accomplishment? When I'm turning something at the lathe, the thing being created feels so much more alive and interesting to me. While it's coming into being, the project feels like it is filled with the unlimited possibility of creativity. It doesn't matter how it comes out to some degree because I brought it forth from a featureless block of wood or acrylic.</p>
<p>But that endless possibility doesn't exist in the same way when I'm just plodding away at my home server does it? I don't think so. It's more of a satisfaction of organization. Everything goes in its rightful place and everything clicks together in such a way as to become a little clockwork mechanism. Here, the gears are of course digital, but I imagine the feeling I get when I send a test through a convoluted chain of software and get a positive result is not unlike a watchmaker seeing their creation click to life, keeping perfect time for the first time.</p>
<p>Another, perhaps more psychological view is that I love the feeling of rapid growth that is attached to attaining any new skill. Every art takes a lifetime to master, but you can get pretty okay at a lot of things just by practicing a little bit consistently. I know I'm not great at a great many things, but that just means there's plenty for me to choose from when I feel like I want to get better at something. It also helps when I get stuck somewhere in one hobby. There's three more that I can work on while my subconscious unpicks the knot.</p>
<p>Maybe that's also why I love to share my process for this site so much. The site being in a finished state isn't the point. the site being nice and pretty with all the features I could want isn't the point. The point is the process. The endless refinement and polishing of both my skill as a writer or developer becomes the thing that feels the most fun and interesting to me, so naturally it's the thing that I want to share with you, the reader the most.</p>
<p>Trust the process.</p>
]]></description>
      </item>
    
      <item>
        <title>Readable RSS</title>
        <link>https://tk-web.quest/blog/readable-rss/</link>
        <guid>https://tk-web.quest/blog/readable-rss/</guid>
        <pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Hey there folks, I know I <a href="/blog/the-last-infrastructure-update-for-a-while/">said I wouldn't do it</a> but damn it all, we're doing it because this is <em>cool</em> and is a part of one of my favorite web technologies, RSS!</p>
<p>After doing the huge sprint that was converting my website to 11ty, I sat back and clicked through each page. Homepage? Beautiful. Blog posts? functional and readable. Games pages? Fantastic. RSS feed..? Oof. This thing was ugly. Just raw, naked XML sitting on the page... but it didn't have to be.</p>
<p>I first saw a themed RSS feed when I was subscribing to the wonderful <a href="https://shellsharks.com/feeds/scroll-feed.xml">Shellsharks's Scrolls</a> feed. I didn't know it at the time, but I was looking at an XML file that had been themed using something called Extensible Stylesheet Language, or XSL. XSL works kind of similarly to CSS. It tells the browser how it should render the raw XML of the feed. The one key differentiator here is that XSL includes both HTML and CSS elements in the same file. The HTML gives the page structure while the CSS gives the page styling.</p>
<p>I did some looking into XSL and found <a href="https://www.cedricbonhomme.org/2025/08/18/rss-xslt-styling/">this post</a> from Cedric Bonhomme. The post itself is pretty light, but gave me the key information I needed to get started, as well as links to examples of both a template and an RSS feed using that template. Now that I'm writing about it, I'm sure I could have looked at Shellsharks's site, but that doesn't really matter. Since the layout uses real CSS, I was able to just copy over most of the css straight from the stylesheet used for the main site, although stripped down to make it a little smaller and easier to work in, since I wouldn't need 88x31 buttons, for example. The rest of the layout was relatively simple, just applying the correct classes to everything and consistently checking to make sure all the little tweaks were working correctly.</p>
<p>This is what the html portion of the xsl looks like.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-brand__link<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>attribute</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>href<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/rss/channel/link<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>attribute</span><span class="token punctuation">></span></span>
        TK's Web Quest
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Home<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/blog/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Blog<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/games/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Games<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/webring/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Webring<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/about/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>About<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/search/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Search<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/tags/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Tags<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-nav__link<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/changelog/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Changelog<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>content-grid--single<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stack-rows<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>breadcrumbs<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>breadcrumbs__list<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>attribute</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>href<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/rss/channel/link<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>attribute</span><span class="token punctuation">></span></span>
              Home
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>
            RSS Feed
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__chrome<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            feed-info.txt
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__lights<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__eyebrow<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
          // ABOUT RSS
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__header<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          TK's Web Quest RSS Feed
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__body<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>
            RSS (Really Simple Syndication) is a classic internet technology for the distribution of content across the web. It powers all kinds of things, from the homepage at <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://overworld.vg<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Overworld<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> to podcast feeds, to blogs, just like this one! RSS is a fetch based protocol. While some RSS readers will go fetch new posts automatically in the background and notify you, the intended experience (at least on this site) is for the RSS reader to go get new posts <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>i</span><span class="token punctuation">></span></span>when you want them<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>i</span><span class="token punctuation">></span></span>. When you pull to refresh or open your reader, it scans through your subscriptions to look at feeds just like this one. If there's a new post, then it pulls the content straight from the XML. It's an indie-web friendly way to follow and read my posts as well as the posts of many other creators. I try to make my posts look as nice as I can on the main site, but if you are more likely to read them if they exist in the same place as other RSS subscriptions, then I would greatly appreciate you subscribing to this feed!
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span>About this page:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>
              This is the RSS feed for TK's Web Quest. No, really, I'm serious! Look at the url in your browser. That "feed.xml" on the end means this is a real RSS feed and you can copy that link straight into your reader to subscribe. The feed on this page is styled using eXtensible Stylesheet Language, a relatively uncommon styling format specificially designed to allow XML to render like HTML with CSS. Like RSS, this is nothing new, but has fallen by the wayside as people hand-make their websites less and trust platforms to design everything for them more. 
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__chrome<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">clas</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            feed.xml
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__lights<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__header<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          Recent Entries
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>retro-panel__body<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>
            Entries from the blog, sorted by date (newest first)
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>panel-grid<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>for-each</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/rss/channel/item<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>article</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post-card<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post-card__meta<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>// <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>time</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>dt-published<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pubDate<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>time</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h3</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post-card__title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>
                  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>attribute</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>href<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>link<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
                  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>attribute</span><span class="token punctuation">></span></span>
                  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>title<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
              <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h3</span><span class="token punctuation">></span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>article</span><span class="token punctuation">></span></span>
          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>for-each</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>           
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span></code></pre>
<p>As you can see, it's very standard html. There's a couple of tags that probably look unusual though.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>attribute</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>href<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>link<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>attribute</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>title<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span></code></pre>
<p>These are pulling attributes from the XML to inject into the page. In this case, it's an html anchor tag, but without the usual <code>href=&quot;&quot;</code> to point the anchor anywhere. The first xsl tag, <code>&lt;xsl:attribute name=&quot;href&quot;&gt;</code> tells the browser to put the contents of this tag into the href attribute in the preceeding anchor tag. Then, we get the actual link with another little piece of xsl. <code>&lt;xsl:value-of select=&quot;link&quot;&gt;</code> tells the browser to grab the link from the given post. After we close the attribute tag, we do the same thing, just getting the title instead. The other thing xsl gives us in this template is iteration.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">xsl:</span>for-each</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/rss/channel/item<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">xsl:</span>for-each</span><span class="token punctuation">></span></span></code></pre>
<p>This code, which is wrapped around the HTML that creates the entries in the feed, iterates through every &quot;item&quot; inside the &quot;channel&quot; tag in the XML to generate the html elements needed for each entry to show up in the list. Coding one entry ends up coding the entire list.</p>
<p>Alright, that's it for this one. If you'd like to view the RSS feed page, <a href="/feed.xml">click here</a>. If you'd like to view the xsl template, <a href="/assets/css/xml.xsl">click here then press ctrl+U</a>.</p>
]]></description>
      </item>
    
      <item>
        <title>Notebooks</title>
        <link>https://tk-web.quest/blog/notebooks/</link>
        <guid>https://tk-web.quest/blog/notebooks/</guid>
        <pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I want to talk to you today about notebooks. Not &quot;journaling&quot; explicitly. There's too much baggage in that term. especially with all the <em>systems</em> people use. Bullet journaling for productivity, gratitude journaling to make you a better person, dream journaling to make an attempt at understanding yourself, the list goes on and on, and the anxiety around doing it &quot;right&quot; does too. What should I write? how should I write? if I don't feel like it, do I have to? All these questions get in the way of the core of what writing is actually <em>for</em>. I want to talk about that part of it, what I've been trying lately, and how it has been working.</p>
<p>First off, I've never been big on journals, diaries, or anything else of that nature. The pop culture conception of journaling, of writing down everything that happened during a given day, is boring and not useful to me. I liked the <em>idea</em> of keeping a journal, but I never stuck to it. I feel like that has probably been my psyche understanding that I needed <em>something</em> from writing, but it didn't really know what or how to get there. I'm still not completely convinced it will stick this time, but I've been writing a lot more in the last few weeks than I have in the last thirty years. That said, this isn't a promise of anything. No secret well of creativity, no imperviousness to distraction, no secret to lead a good life. This is simply the thought process I have been going through and the impressions I've gotten of it after a little over a month.</p>
<h1 id="a-notebook" tabindex="-1">A Notebook <a class="heading-anchor" href="#a-notebook"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I have found, in my experiments, that digital tools just can't cut it for me. I need a physical pen and physical paper. Even a stylus on a touch screen isn't it. That's fine for drawing, where I am spoiled by the rapid undo gestures and the line smoothing, but for <em>writing</em> I need to be writing with a real pen and real paper. I've tried <em>so many</em> digital tools over the years. None of them worked like I wanted to. So, I did a lot of thinking and careful consideration of what I wanted and what I could reasonably commit to in terms of materials. I came up with this list of requirements for my own re-introduction to writing stuff down in a notebook.</p>
<ul>
<li>The notebook must be physical, with real paper.</li>
<li>The notebook must have more than 48 pages.</li>
<li>The notebook must be able to fit in a pocket in most of my clothes.</li>
<li>I should be able to write in the notebook without a completely solid surface.</li>
<li>The pen must be comfortable to use.</li>
<li>I must have a way to physically bind the pen to the notebook so they travel together.</li>
<li>I must be able to get the notebook out and ready to write in <em>quickly</em> and should be able to put it away just as quickly.</li>
<li>The materials must be either refillable or cheap to replace</li>
</ul>
<p>If I had to sum this list up, it would be that it is a <em>practical</em> list of must-haves. I'm a very pragmatic person, so my list is all about the experience rather than the look or how it makes me feel to see the notebook on my desk. This is the kind of list that <em>I</em> need to get writing again. So here's what I came up with:</p>
<p><img src="my-notebook.jpg" alt="A photo of my notebook. A simple, black hardcover book. A black elastic band holds a black pen to the side. The pen is a Rotring 600"></p>
<p>This is my notebook. The book itself is <a href="https://www.amazon.com/dp/B0D29961B9">from Amazon</a>. I did a lot of looking until my requirements were (mostly) met. I checked stationery and bookstores near me to see if I could manage to get something locally that would fit the bill and it just wasn't feasible. Even though I looked long and hard, this wasn't quite perfect, so I had to do a little customizing. I cut the ribbon bookmarks and existing elastic off of the book entirely. I didn't need or want the ribbons and the elastic was going the wrong direction. If I was going to use it to hold a pen to the book, I needed to make sure it wrapped around the package horizontally. I got a roll of elastic from a local craft store, measured and sewed my own loop. It's not affixed to the book in any way, but keeps it closed and holds the pen tight to the side exactly how I want.</p>
<p>The pen is a <a href="https://www.rotring.com/pens-pencils/gel-pens/rotring-600-gel/SAP_2195930.html">Rotring 600</a> in gel ink. It's a really nice, fully metal-bodied pen that takes Parker style refills. Notably not a pen I would replace unless it were to fully break or get lost. I haven't exhausted the ink that came with it yet, but when I run out, I think my pick is going to be the <a href="https://www.amazon.com/dp/B07JNNVQGJ">0.5mm Kako G2 refills</a> that I frustratingly cannot find anywhere but Amazon. They don't hold the most ink, but they write extremely nicely. They're the refills I would provide with the pens I made when I was doing more woodturning.</p>
<h1 id="writing" tabindex="-1">Writing <a class="heading-anchor" href="#writing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Many people have said over the centuries that writing <em>is</em>, in a very intense way, thinking. Writing is pulling thoughts, feelings, and ideas out of your brain so that they can be absorbed later. Whether by you or by some other person it doesn't really matter. The purpose of writing is to convey information. That is, importantly, not specifically to <em>convey information to someone</em>, but to <em>move the information from one place to another</em>. Getting something out of your head into a pit that it never needs to come out from is absolutely a reason to write something down. However, I have found that ideas that stick in my brain are probably worth considering, so when I write them down, I don't want to do so to get rid of them, but rather to allow my subconscious to work on them without my mind having to keep them in &quot;active&quot; thought just to prevent them from disappearing.</p>
<p>I have borrowed heavily from <a href="https://youtu.be/_QVYfPnNOg4?si=gfHUnJixdlOAza1P">Perry Daniels</a>'s video on the subject, but it isn't a perfect copy 1-to-1 of his method. First of all, mine comes with no promises. Not even ones of more creativity. But it has worked for me. Before I get into my exact structure, though, I wanted to say a small piece on rules and systems in general.</p>
<p>If you are doing something, anything, for yourself, then you get to make the rules and decide if they need to be followed or not. Just because someone promises the moon with their &quot;system&quot; doesn't mean it will actually work that way for you. If you like the steps I've laid out below, then please follow them! If something doesn't fit, then abandon it! We get so caught up these days with worrying about if we're doing something correctly or not that often times we don't do it at all. The more you write, the easier it becomes to decide what to write and where to write it. So, here we go: <em>my</em> rules.</p>
<ul>
<li>Write down anything that feels like it is worth more consideration - This means both creative ideas and projects I would like to pursue.</li>
<li>No organization - No index, no sticky tabs, no color coding. Notes can be given a small phrase or keyword for context, but if I have to worry about leaving blank space to go back to a thought, I'll never write in the damn thing and end up with fifty notebooks all for their own trains.</li>
<li>To-dos, work notes, and task lists don't go in <em>unless they're attached to a project</em> - This book is meant to be revisited. So many tasks on projects are in themselves ideas to explore, so they deserve to be here, but I don't want my daily chores or work notes in here. This is my personal notebook for me. Not for anyone else.</li>
<li>When a project gets its own task list and todo elsewhere, copy things out of the notebook to it regularly.</li>
<li>Re-read old notes regularly - Like I said before, these are ideas worth keeping. I want to revisit my old notes to remind myself of those ideas and keep working on them in the background.</li>
<li>Drawings, printouts, and other references absolutely belong here. If something is digital, print a QR code to paste in if an image won't do.</li>
<li>Carry the notebook as many places as possible. A notebook does no good on a desk ten miles away. If it's in a bag that's fine, but a pocket is ideal. We want extremely fast retrievability.</li>
<li>Don't worry about wasted pages or space. The paper is cheap. There will always be more.</li>
<li>Understanding at a glance the worthiness of an idea to add to the book will come with time. Err on the side of more going in, not less.</li>
</ul>
<h1 id="in-practice" tabindex="-1">In practice <a class="heading-anchor" href="#in-practice"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>So far, I have been greatly enjoying my new notebook. I've found myself more consistently coming up with and notating ideas for upcoming projects and I also feel like I haven't been losing those ideas. I'm still frustrated with my rustiness in drawing, writing, and creativity, but I find the practice is helping me significantly. I did also just buy a cheap bluetooth thermal printer that can print out stickers, so I am excited to finally be able to put more digital stuff into my notebook as well.</p>
<p>Do you carry a notebook? How has that practice been going for you?</p>
]]></description>
      </item>
    
      <item>
        <title>The last infrastructure update for a while</title>
        <link>https://tk-web.quest/blog/the-last-infrastructure-update-for-a-while/</link>
        <guid>https://tk-web.quest/blog/the-last-infrastructure-update-for-a-while/</guid>
        <pubDate>Sun, 27 Sep 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Okay I know I know. I write too much about building the website. This is the last big infrastructure update for the site for some time. I'll continue to make small updates here and there, but this is the last big one worth writing about and it's because it's a change truly worth celebrating.</p>
<h2 id="i-finally-kicked-cloudflare-off-of-the-stack-for-tks-web-quest-and-all-my-other-self-hosted-stuff" tabindex="-1">I finally kicked Cloudflare off of the stack for TK's Web Quest and all my other self-hosted stuff! <a class="heading-anchor" href="#i-finally-kicked-cloudflare-off-of-the-stack-for-tks-web-quest-and-all-my-other-self-hosted-stuff"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Cloudflare has been a thorn in my side for quite some time. It's the one major thing that I felt guilty about using for my site. A huge amount of the web's traffic goes through Cloudflare, so much so that they feel kind of like a monopoly that sprang up overnight. Some of their free services are <em>genuinely</em> useful too! Tunnels are basically magic for folks behind restrictive networks if they want to host their own services and using tunnels on Cloudflare basically locks you into their DNS and caching.</p>
<p>But over time, it became very apparent that Cloudflare's teams were very interested in AI, to the point of <a href="/blog/emdash-dont-use-this-thing/">reinventing Wordpress by smushing AI into Astro and calling it secure</a>. In the end, I know that I will never be able to completely excise AI from my self hosted services. Too many people use it to wildly varying degrees for it to be completely removed. Their attitude rubs me the wrong way <em>and</em> they're a monopoly though, so this is where I'm putting my energy.</p>
<h2 id="the-previous-layout" tabindex="-1">The previous layout <a class="heading-anchor" href="#the-previous-layout"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p><img src="tunnels.png" alt="An illustration of how tunnels work in a very general sense. Data flows over HTTPS to a server, the server forwards HTTP traffic inside an encrypted tunnel. The tunnel goes through a firewall and terminates, allowing individual applications access to the traffic."></p>
<p>This is how tunnels work. I've labeled the server as CF here, but it's worth noting that my new Pangolin setup works exactly the same. At least for TK-web. Encrypted HTTPS web traffic goes from the user's computer to the tunnel concentrator at Cloudflare. Cloudflare terminates the transport encryption there, so they can read the contents of everything coming and going over the connection. They then wrap that traffic in an encrypted tunnel to send it to my server. Once it lands in my server, the tunnel connector program unwraps the data and forwards it to the correct application based on the URL the user requested. When the service responds, the traffic goes back exactly the way it came in, through the tunnel, then unwrapped at Cloudflare, who reinstates the HTTPS connection and sends it back to the user.</p>
<h2 id="the-new-way" tabindex="-1">The new way <a class="heading-anchor" href="#the-new-way"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>With Pangolin, <em>I</em> own the tunnel server, which means I am the trusted endpoint, even if your computer is connecting to my VPS's IP rather than my home network where the data actually is. Owning that tunnel means I'm no longer allowing my or my users' data to be given to Cloudflare. I also am not using their tunnels for streaming media, which is against their TOS. I'm <em>also</em> not subject to their 100MB file transfer limit, which means if I have a big Forgejo commit, or want to upload a big audiobook directly to my Grimmory server, then I can.</p>
<p>Pangolin does also give me one extra huge benefit and that is making resources available to myself <em>without</em> making them public on the internet. These private resources require a VPN tunnel to be established between my device and the Pangolin server, which forwards the VPN traffic to my home network. The setup is Zero Trust, which means even if someone somehow got my Pangolin server address and a login for it, they would also need access to my specific admin account to give their device access to the private VPN tunnel. This means I can make configuration changes to my home server securely from outside my network without having to fuss with a separate VPN service.</p>
<p>In conclusion, I'm really happy with the setup and am glad to no longer be contributing to Cloudflare's web security monopoly. Now I can finally get back to focusing on writing!</p>
]]></description>
      </item>
    
      <item>
        <title>The Quest Returns on 11ty!</title>
        <link>https://tk-web.quest/blog/the-quest-returns-on-11ty/</link>
        <guid>https://tk-web.quest/blog/the-quest-returns-on-11ty/</guid>
        <pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>As I wrote about <a href="/blog/reckoning-with-myself/">a week and a half back</a>, I was being frustrated by Hugo's Go-based templating system. What should have been relatively straightforward became impossible to accomplish. I was frustrated at the code, I was more frustrated at the documentation, and I got so annoyed that I threw up my hands and bailed.</p>
<p>But I didn't stop working.</p>
<p><img src="screenshot-2026-09-25-122631.png" alt="A small screenshot showing 135 commits being merged from &quot;11ty-conversion&quot; to &quot;main&quot;" title="135 commits just flew by"></p>
<p>Welcome to the brand new TK's Web Quest! This site is built with 11ty, a static site generator I can actually understand! I used the Retro Garden starter for this site, but customizing it has been a <em>DREAM</em> compared to Hugo templates. I'm having a fantastic time building the site, but also there's been a really clear finish line and now, we've hit it.</p>
<p><img src="screenshot-2026-09-25-122947.png" alt="A screenshot of the main TK's Web Quest homepage, in the Midnight theme" title="A screenshot of the site's current look, for posterity."></p>
<p>Let's take a little tour of some of the stuff I love about this site. First off, it has multiple themes! Light and dark, with extra different color options for the accents in light mode. I would love to eventually add more varied color themes for dark mode, but that will have to wait a bit.</p>
<p><img src="screenshot-2026-09-25-125254.png" alt="A screenshot of the TK-web Search page" title="Local search makes a triumphant return!"></p>
<p>Next up is local search! This is using PageFind, which runs the searches locally on your computer rather than on my server. No data changes hands when you search until you click a result!</p>
<p><img src="screenshot-2026-09-25-125806.png" alt="A screenshot of TK-Web's Tags cloud" title="All of the old posts have been properly tagged and updated!"></p>
<p>As I moved over the posts from my old site, I updated them with tags so that if you're interested in a topic, you can click the tag at the bottom of the post or on the Tags page to see more posts like it!</p>
<p><img src="screenshot-2026-09-25-130040.png" alt="A screenshot of The Worst Webring's page" title="Now even ringier!"></p>
<p>The webring has been updated to be <em>more</em> automatic than it was before. Mostly a backend change, but now the table of members in the page and the array of members that the webring script pulls from come from the same exact spot! They cannot be out of sync anymore.</p>
<p><img src="screenshot-2026-09-25-130144.png" alt="A screenshot of the Lost Stars page." title="Game pages have also seen some love!"></p>
<p>Finally, game pages have gotten some upgrades. You can now play my Pico-8 games directly from the blog more easily!</p>
<p>After writing this post, I have of course found multiple things I want to fix, but I'm still exceptionally excited to continue working on the site and most importantly, get back to writing thanks to Decap CMS!</p>
<p><img src="screenshot-2026-09-25-130450.png" alt="A screenshot of this post being written in Decap CMS" title="I can even write posts from the web now!"></p>
]]></description>
      </item>
    
      <item>
        <title>The Fall Colors Come to Colorado</title>
        <link>https://tk-web.quest/blog/the-fall-colors-come-to-colorado/</link>
        <guid>https://tk-web.quest/blog/the-fall-colors-come-to-colorado/</guid>
        <pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>The Guanella Scenic Byway snakes through the mountains between the towns of Grant and Georgetown, winding through the valley between several mountain peaks in the Rockies. Emily and I got up before the sun did to make sure we could get to the Georgetown side ahead of the crowds last weekend. The road isn't too long. If you drove straight up to the pass summit, it would only take about 45 minutes. We stopped about halfway up at the Guanella Pass Campground to stretch our legs and get the camera ready.</p>
<p><img src="guanella_3200.png" alt="A photograph taken just before the sun made it over the mountains. In the foreground, a picnic table is covered in a thin film of water, reflecting the background. The trees of Guanella Pass are visible both in the reflection and above the table in the frame. Aspen and pine trees in contrasting shades of green and gold litter the mountainside. In the far background, a woman stands off to the side facing away from the camera. She's wearing a denim jacket and black leggings."></p>
<p><img src="guanella_3229.png" alt="A photo of Guanella Campground. The dirt road stretches forward from the bottom of the frame, dusted with fallen yellow aspen leaves. The road forks in the middle of the frame, making a loop around a stand of trees. A one way sign points off to the right from the fork. Flanking the road are dark evergreen trees, but the stand of trees in the center are aspens, in their bright fall yellow colors. Above the trees, the sky is a pale blue, with a few loose clouds left over from the rainstorm that had blown through that morning."></p>
<p>As we were getting ready to leave the campground and continue our journey up the pass, the sun just started to peek over Sugarloaf Peak to our left, spraying the side of Otter Mountain with sunlight.</p>
<p><img src="guanella_3208.png" alt="A photo of Otter Mountain from the entrance to Guanella Campground. Dark evergreen trees line the left and right edges of the frame in the close foreground. In the mid-foreground, a band of yellow aspen trees lightly obscures the band of evergreens behind them. Cutting through the middle of the frame is the edge of the shadow cast by the mountain across the valley. The sun highlights another group of aspen trees further up the mountain. Above those, more pine trees straddle the rocky side of the mountain. In the top-center and top-left edges of the frame, the blue sky is bisected by a cloud."></p>
<p>We continued our drive up the pass for about ten more minutes before stopping again. This time on the switchbacks that make the final ascent up to the pass summit. From this vantage, we could just barely see Clear Lake, five miles away, nestled between the mountains.</p>
<p><img src="guanella_3261.png" alt="A photo from further up Guanella pass, looking down into the valley. Otter Peak is on the left side of the frame, with groves of aspens interspersed among the pines, their bright yellow leaves shining brightly in the morning sun. Two skinny pine trees highlight the center of the frame, much closer to the camera than the mountain in the background. Two more pines line the left and right edges of the frame, even closer to the camera. Off in the distance, in the right half of the frame, Clear Lake can be seen poking out between the mountain slopes."></p>
<p>After reaching the summit and looking around, we took our time coming back down the way we came, stopping a few times to take more pictures. The road was starting to get crowded by this point, but I was still able to get a nice picture of the trees and the road winding through them.</p>
<p><img src="guanella_3345.png" alt="A photograph of the road leading up to Guanella Pass. The road curls to the right before snaking back to the left out of sight up the valley. The pines and aspens line the road, making the outdoor space feel cozy and autumnal. The sky above is grey and overcast. Another storm is rolling in."></p>
<p>We explored off the road a little ways as well, taking our time to enjoy South Clear Creek as it babbles its way down the valley.</p>
<p><img src="guanella_3341.png" alt="Clear creek is in the center of the frame. Truly a creek at this elevation, water tumbles over the stones in the creekbed. Trees crowd close around the water source, aspen and pine alike. Lower bushes also flank the banks of the river. A sunbeam pierces the canopy, highlighting a splash of yellow leaves on the right side of the frame. The creek and foliage is somewhat occluded by a bare tree in the foreground."></p>
<p>In the end, it was a very enjoyable trip. I'm glad I got up early enough to beat the crowds. By the time we left around noon, it was getting crowded. If we go back next year, I'm definitely keeping my alarm set for 5:45 again.</p>
<p><img src="guanella_3351.png" alt="A photo of an oxeye daisy in closeup, with dead leaves on the ground in the unfocused background. Bare tree branches above cast thin shadows across the daisy's petals."></p>
]]></description>
      </item>
    
      <item>
        <title>Reckoning with myself</title>
        <link>https://tk-web.quest/blog/reckoning-with-myself/</link>
        <guid>https://tk-web.quest/blog/reckoning-with-myself/</guid>
        <pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I think I’m throwing in the towel. Not completely giving up on having a website. I still want to have one and I want to write on it and I want it to be hosted on my machine and I want it to be my home online.</p>
<p>I’m done building it all myself with no assistance.</p>
<p>The experiment with the static TK-web.quest has been interesting and successful. I’ve learned a lot about the web and developing a website. However, I haven’t been writing for the site and I haven’t been spending time developing it. For several months, it has languished. I don’t feel like I <em>have</em> to be writing the website all the time. That’s not it. I feel like in order to write more, I want the website to be <em>just right</em> and my knowledge and skill just isn’t enough to make it happen.</p>
<p>There’s no specific breaking point that completely destroyed my interest in continuing the work in the same manner I have been, but there comes a point in many projects where someone asks “Is the juice worth the squeeze?” In this case, the person asking that question was me, frustrated after trying for several hours to learn how to write a proper render hook for the images on my site. Hugo, which is the tool that builds my site, uses Go for its templating language. Go is fast to build. Hugo is very snappy. But the problem is that <em><strong>I can’t fucking read this shit</strong></em>. I cannot look at the partials and understand what is going on. I’m not a code smith by trade and by no means should reading code come as naturally to me as it should to anyone who does development with more regularity and passion than I do, but I should be able to puzzle out 40 lines in two hours and I just couldn’t.</p>
<p>So, where does that leave us? Well, I still really like writing blog posts in Markdown and I just added Decap CMS to my site to allow me to write from anywhere, even if I don’t have git access. But I’ve dug through the Hugo themes that are out there and there just isn’t a ton of movement in that space. I basically have to use a well-developed and continually supported theme because Hugo has gone through enough changes that older themes just don’t work right without going in and tinkering significantly with them. Something that we already know I can’t really do given my abhorrence of Go. Plus, my site is broken and fragmented enough that I will want to do significant restructuring anyway just to make things work. So, if I’m going to burn it all down and rebuild from scratch, now’s a pretty good time to do it.</p>
<p>Enter 11ty. 11ty is another Static Site Generator. Not as venerable as Hugo, but still very actively developed with a strong community of people working both in the tool making their own sites and also working on components for the project like plugins or themes, what 11ty calls starters. <a href="https://cassie.ink">Cassie</a> moved to 11ty not too long ago and seems to have enjoyed the move, though she is certainly more skilled than I am with the whole templating and coding business.</p>
<p>In the end I’m not 100% sure where I’ll land and it will take some experimenting, but my explicit goal is to have a very solid foundation that <em>works</em> from the jump. I can do all the tinkering I like after that is settled. So, expect this space to change. Nothing anyone else relies upon like links and the webring will break, but RSS feeds might surface a bit differently. In any case, I’ll be sharing more as it happens.</p>
]]></description>
      </item>
    
      <item>
        <title>Tools and Resources for PS Bazooka</title>
        <link>https://tk-web.quest/blog/tools-and-resources-for-ps-bazooka/</link>
        <guid>https://tk-web.quest/blog/tools-and-resources-for-ps-bazooka/</guid>
        <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>This is a multi-format puzzle game intended to be a springboard for ARG style puzzle solving. This document is a list of resources that can be used to solve each puzzle in the sequence. While I do not provide any solutions here, I do consider these spoilers. Please tread carefully and try to solve the game yourself first!</p>
<h1 id="to-complete-this-game-you-will-need" tabindex="-1">To complete this game, you will need: <a class="heading-anchor" href="#to-complete-this-game-you-will-need"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>
<p>A QR code scanner. These are built into most phone cameras now.</p>
</li>
<li>
<p>An email client. I do not collect any email addresses used with this game, and all mail sent as a part of the game is deleted immediately automatically by the system. You don't need to feel weird about sending mail for this, but if you do, I recommend making a new free mail account explicitly for this game.</p>
</li>
<li>
<p>A way to decrypt AES encryption. You can use the free and open source <a href="IT-Tools">https://it-tools.tech/encryption</a> for this.</p>
</li>
<li>
<p>A tool for retrieving steganographically hidden information in images. OpenStego is free, open source and multiplatform.</p>
</li>
<li>
<p>A tool to retrieve steganographically hidden information in audio. REAPER (free trial) and Audacity (free, open source) can both do this.</p>
</li>
<li>
<p>A means to play DOOM wads, but not a copy of any DOOM game. DoomRunner combined with UZDoom is the setup I tested for this game, and the one I recommend. Instructions and a free iWAD are provided to eliminate the need to buy DOOM.</p>
</li>
<li>
<p>7-Zip, which is required to open a multi-part archive that is encrypted.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Next Games Project Devlog: The Preparation</title>
        <link>https://tk-web.quest/blog/next-games-project-devlog-the-preparation/</link>
        <guid>https://tk-web.quest/blog/next-games-project-devlog-the-preparation/</guid>
        <pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Hello from the past! This is TK circa June 25th as I do the prep-work for my TWG Game Jam 5 entry. I'm writing the post early, but publishing it after the jam so that folks have a chance to play the game before reading the devlogs.</p>
<blockquote>
<p><strong>NOTICE</strong>: This post will <em>spoil</em> my entry to the game jam. PLEASE play it first. I'm not talking just mechanics or story, but the entire premise is important to go into blind. Even as the &quot;spoilers don't matter&quot; guy, I implore you. Please play the game first and come back. The blog post won't go anywhere.</p>
</blockquote>
<hr>
<h1 id="the-concept" tabindex="-1">The Concept: <a class="heading-anchor" href="#the-concept"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay, I hope there's been enough space for you to go play the game first. The game I want to make for this jam is an Alternate Reality Game, or ARG. The general idea of an ARG is to create a bunch of cross-media puzzles that require cryptographic know-how to solve. Clues are not provided in plain text and keys often need to be obtained or used in unique ways not typical to &quot;normal&quot; games. The narrative object is to create a world in which the events and puzzles included in the game are &quot;real&quot; to the alternate world the game takes place in. This is a sort of kayfabe, an agreement between the puzzle creator and the players to treat the puzzles and story elements as &quot;real&quot; within the bounds of the game. The fact that it is a game is often not mentioned at all and the developers do not acknowledge players' actions as if they are players, but rather as real people inside the fictional world of the game.</p>
<p>Due to the nature of this game being made for a game jam, I haven't and won't pre-write any of the story elements. I want to tailor these narrative elements to the prompt. I am, however, doing some prep work for the game by setting up the general architecture I'd like to follow and doing research on the kinds of puzzles I'd like to implement in the game. This doesn't represent a meaningful percentage of the work on the game, simply some small scale tests to make sure that the puzzles I want to create are in fact possible with the tools that I have.</p>
<p>The general shape of the game is a diamond style branching set of puzzles. The clue order is not completely linear, but it does give the player a few things to work on so that if they get stuck in one place, they can go somewhere else then come back later. See the diagram below:</p>
<pre><code>                         /=&gt; Branch A =&gt; Key 1 =\
Start =&gt; Intro Puzzles =|=&gt; Branch B ==&gt; Key 2 ==|=&gt; Finale Puzzles =&gt; End
                         \=&gt; Branch C =&gt; Key 3 =/
</code></pre>
<h1 id="the-puzzles" tabindex="-1">The Puzzles: <a class="heading-anchor" href="#the-puzzles"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I want to have 20 steps in total, so 4 steps for the intro, 4 steps per branch in the main game section, and 4 steps in the finale. Here's some of the puzzle ideas I'm thinking of.</p>
<ul>
<li>
<p>Steganography: the act of hiding text, images, or other information inside of another file type. Here I'd like to hide information inside the spectrogram of a piece of audio and as hidden information inside of an image using last-bit image steganography.</p>
</li>
<li>
<p>Hidden/misleading QR Code: I want to hide a QR code inside another game, or maybe use it as a launching point for the rest of the game. PICO-8 will probably work for this because it's web-embedable, multiplatform, and I already know some of how to make a game in the engine.</p>
</li>
<li>
<p>Web Server Exploration: I want to set up a raw directory of files with fun and interesting stuff for the player to look at. I don't want to make it a huge sifting puzzle, but some extra fluff would be cool to maybe hide the next steps.</p>
</li>
<li>
<p>Email Auto Response: Some of the most fun and interesting ARG mainstays are texting, emailing, or calling real life contacts. An auto-answer phone for text or calling sounds expensive, but I can roll new emails pretty easy...</p>
</li>
<li>
<p>Audio Editing Puzzle: Since Reaper and Audacity are free, I'd like to record and mess up some audio in some way, then have players &quot;fix&quot; it to uncover a clue. It might be reversing audio, rearranging clips, or adjusting pitch. Maybe even using a noise reduction effect to make something more audible.</p>
</li>
<li>
<p>Misdirected webpages: Now that TK's Web Quest is mostly written by hand, I'd like to send people to a page that <em>looks</em> like a normal page on the site, but has something wrong with it that turns out to be a clue.</p>
</li>
<li>
<p>Standard encryption: I don't want to make puzzles that are too hard to crack, but I do want to use the game as a slight teaching tool. Using some public-private key encryption might be a fun thing to add.</p>
</li>
<li>
<p>&quot;Prototype&quot; project: I'd like to hide more information inside a second game file. I've been meaning to learn how to make DOOM levels. This will be a good excuse and might offer some fun interactions.</p>
</li>
<li>
<p>Image location metadata: A classic of any ARG, using the EXIF data of an image to hide clues. Might be tough to signal to players, but hopefully I can find good ways to hint at it.</p>
</li>
<li>
<p>Book/Blog Cipher: Another classic obfuscation technique, a book cipher hides information based on a book or publication held in common between two ends of a secret conversation. In the modern age, this common document could be a blogpost, with page/line/word markers replaced by paragraph/word/letter ones.</p>
</li>
<li>
<p>Timestamps: A sort of book cipher for audio. A timestamp can have players looking at other audio that may not even be controlled by me for a clue. Maybe that clue could be used with one of the other puzzle methods to become something more.</p>
</li>
<li>
<p>Multi-part key: A key to a puzzle that requires multiple pieces in order to function.</p>
</li>
<li>
<p>Console Commands: A staple of gaming from a bygone age. It would be awesome to somehow set up a console to take a custom command in one of the video game portions of the ARG.</p>
</li>
<li>
<p>Konami Code: Maybe not the <em>actual</em> Konami Code, but a series of button inputs to unlock something somewhere would be awesome.</p>
</li>
</ul>
<h1 id="research-time" tabindex="-1">Research Time: <a class="heading-anchor" href="#research-time"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Alright, so I've done some research, time for findings so that I can plan this thing:</p>
<ul>
<li>
<p>Email auto replies are going to be easy. I can set up filter rules on new purelymail users that send one reply normally, and other different replies when a phrase is sent in the subject line.</p>
</li>
<li>
<p>There's an open source image steganography utility out there that is multiplatform. OpenStego. This will be perfect for the image steganography.</p>
</li>
<li>
<p>REAPER is free for the audio editing puzzles. I might need to include a short guide on using it in the game documentation</p>
</li>
<li>
<p>PICO-8 will let me encode a QR code in the sprite sheet pretty easy. Maybe set up a fake crash with the QR code displayed as a &quot;support&quot; link?</p>
</li>
<li>
<p>Ultimate DOOM Builder supposedly runs on linux. Might be worth a look.</p>
</li>
<li>
<p>The public IT-Tools instance has encryption utilities. Maybe doing a standard encryption with a key would be better than public/private key pairs.</p>
</li>
<li>
<p>DOOM had a console. I bet the doom level builder will let me utilize it.</p>
</li>
<li>
<p>I could probably set up the button combo code in PICO-8, but I wonder if I could do it on a webpage using javascript? Maybe there's a snippet out there already.</p>
</li>
<li>
<p>7-zip has an archive splitting capability. I bet I could put a text file into an archive and split it using that multi-archive option. Without all three archives present, the key would be unreadable.</p>
</li>
<li>
<p>I'd love to utilize a timestamp for the podcast episode that the jam is based on for at least one clue.</p>
</li>
<li>
<p>With TK-web's current setup, web server exploration and &quot;corrupt&quot; fake pages shouldn't be too bad to add.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>CrossCode Review</title>
        <link>https://tk-web.quest/blog/crosscode-review/</link>
        <guid>https://tk-web.quest/blog/crosscode-review/</guid>
        <pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>CrossCode is one of those perennial games. One where I've known for a very long time that I wanted to play. This, from what I can gather, is a pretty common sentiment. I wonder, then, why it has taken me eight years to get to it. And even more so, why it feels like people who recommend the game don't really do so with as much urgency as they might for other games. CrossCode is, for better and worse, a game that is somewhat over-developed for its scope. Something that I feel runs contrary to many other games that feel over-scoped for their development.</p>
<blockquote>
<p>This review comes after spending roughly 45 hours with the game and completing the main story. This review <strong>will spoil major events in the story</strong> and I believe those events are <strong>worth experiencing on your own</strong>.</p>
<p>The bottom line for this review is that the game is very good, <em>especially</em> in its story and characters. It does overstay its welcome in some of the other aspects, but is still very much worth experiencing and I do recommend it. If you decide to play it, make good use of the accessibility options to set puzzle speed to 50% and enemy damage to 50%.</p>
<p>While I don't overtly spoil major beats of the game, I won't be marking any spoilers ahead, so be warned.</p>
</blockquote>
<p>CrossCode is, at its heart, a lot of different things and it does many of them well. It's a single player action-RPG set inside a fictional full-dive VR MMO. The avatars, enemies, and challenges posed by the MMO design take place in the real world in the fiction of the game. All of those game elements are constructed from an extremely lightweight and fragile form of matter that can be programmed and controlled as if it were a computer program. You inhabit Lea, a player of this VR MMO called CrossWorlds. Unlike most players, however, Lea can only be conscious inside of the game world. She's aided by a team that exist outside of the game, as well as other players inside in order to recover her lost memory and complete the objectives of the game.</p>
<p>The game plays like a typical ActionRPG. You have dedicated melee and ranged attacks, as well as special moves that can be triggered for each. As you explore and level up, you get more options to deal with enemies. While I enjoyed the action all the way through, I did feel like the balance for the game was a little bit off. Enemies tended to feel pretty spongey and they tended to hit very hard. I consistently found myself trying to dodge away from attacks with a wide area of effect only to be hit by them anyway. Similarly, the guard didn't feel that useful because blocking attacks didn't block all damage. In order to alleviate my frustration, I ended up using the assist settings to set enemy attack damage to 50% and it felt much less punishing. It feels like the game was almost playtested too much by the same group of people and they got too good at the game, so the difficulty baseline was just too high. There's also an attack frequency slider that I didn't end up touching, but you may find it useful especially for some of the more difficult boss fights.</p>
<p>Another large part of the game is puzzles. In each of the game's dungeons, there are puzzles themed around unique gimmicks and the elemental abilities that are acquired in each one. These are the things that truly tested my patience. Each dungeon felt much longer than it needed to be and the puzzle design required execution of the solution each time, rather than being the kind of puzzle where the second the player understands the solution, it can be enacted simply. In an attempt to alleviate the execution difficulty, there's another assist setting to reduce puzzle speed. This reduces the speed of puzzle elements to give you additional time to position yourself and react. I found that this setting was essentially required. There was no way for me to complete the game without it. I also felt that the puzzles themselves often consisted of so many elements that they became too noisy for me and difficult to solve because there was just too many elements in play. The puzzles are also extremely prescriptively designed. While the solutions may be creative, there's really only ever one solution to each puzzle. It didn't feel like I was learning new and interesting applications of Lea's abilities. Rather, I felt like I was trying to read the game designer's intent. While I didn't love most of the standard puzzles, I truly hated the maze puzzles at the end of each dungeon. These consist of sending a projectile attack along a set trajectory while manipulating obstacles in the projectile's path so that the projectile bounces off of all of the prescribed walls and pillars before reaching a goal location. None of these were truly difficult, but they were time consuming and annoying. So much so that both Lea and her companion throughout the game, Sergey, show obvious disgust at the final one that is at the end of the final dungeon. If you as a developer make your characters show obvious disgust at this puzzle, it probably shouldn't be in the game.</p>
<p>That's where my negative criticism ends, however. The next few paragraphs are the gush zone for me. The cast of this game are wonderful. Lea, despite being a mute protagonist at the beginning of the game, immediately shows a lot of personality. She gains some vocabulary through the course of the game, but even including some gestures means she can only communicate about a dozen words or so by the ending. The other characters do a lot of conversational lifting, but there is never an assumption that Lea is communicating anything extra offscreen like you see with other silent protagonists. She is definitely an authored character, not a blank slate. The supporting cast is very well developed as well. Sergey, Lea's guide and advocate outside of the game world, is not the most exciting person, but that feels very real to his character. He's on the sidelines the whole time, managing your status and helping you navigate the game world. While he is your constant companion, I feel like the other players in the game, especially Emilie, are the true stars. I found the moments of conflict, reconciliation and revelation to be exceptional. I really love this cast more than I have a cast of... basically any other RPG? Like they all have their own &quot;deal&quot; without being overly archetypical. They all have personality without being dominated by one interest. I feel like the game wouldn't work even a little bit without them.</p>
<p>The narrative that these excellent characters support is one that I feel like ebbs and flows in a nice way. For much of the game, you are simply playing along, going through the MMO quests, interacting with other players, and slowly building back glimpses of Lea's memories. An uncharitable reading of this section would be that nothing is really happening. I like to think of it as letting you sink into the world and get to know the side characters so that when you reach the last third of the game everything hits so much harder. I want to note before I continue that this game's release in 2018 predates the rise of generative AI models. The game's view of artificial intelligence is a lot more positive and interesting than the current hellscape that we find ourselves in. The game's handling of these themes makes me much more interested in the game's DLC, which promises to answer a lot of my lingering questions about the plot and about this world. Who is the &quot;she&quot; that Gautham and Satoshi mention in the main game? What happens to Lea and the other AIs stuck in the Vermilion Wasteland? What happens when they meet their originals? Are there more AIs that we don't know about? If this were any other game with a more streamlined set of mechanics and fewer puzzles, I would dive into the DLC immediately and carry on playing the game to its final end. As it stands, I need a bit of a break, but I'm very much interested in coming back to this and completing it at some point in the future.</p>
<p>At the end of the day, I feel like CrossCode does a lot that I really love and hope carries forward into Radical Fish's next game, Alabaster Dawn. If they can tune it to be a little more forgiving and maybe drop the huge, tedious puzzles, I think they have a certified hit on their hands.</p>
]]></description>
      </item>
    
      <item>
        <title>Homepages on Hugo</title>
        <link>https://tk-web.quest/blog/homepages-on-hugo/</link>
        <guid>https://tk-web.quest/blog/homepages-on-hugo/</guid>
        <pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<blockquote>
<p>Note: This post used to contain some code examples, but they needed to be removed due to them not playing nice with nunjucks. I apologize for this.</p>
</blockquote>
<p>In keeping with the tradition of this blog being mostly written work about the blog itself by volume, I have a surprise for you today: More written work about the site! If you look at the main pages for the site, anything that doesn't have the <code>blog.</code> prefix in the URL, you won't notice any changes at all, but under the hood there's a fair bit that has been changed.</p>
<p>I started the main pages project as a way to learn to build a site on my own. Thus, I quickly ran into one of the very common web development problems: How do I stop myself from writing everything over and over again? I think my initial intention was good, but I didn't know what would drive me up the wall, so I dove in blind. I'm glad I did because it gave me an appreciation for the tools I use for the blog to such a degree that I wanted to learn more about how to use them.</p>
<p>Let me stop talking around the thing. I've built a new theme for <a href="https://gohugo.io/">Hugo</a>, the static site generator I use to build the blog. This theme, called WebQuest, is based on the layouts and CSS that I'd built for the main pages of this site. The ones that don't look like the blog. There's an idea of making a DRY project in computer science and web development. It stands for <strong>D</strong>on't <strong>R</strong>epeat <strong>Y</strong>ourself. By using a SSG, I can stop repeatedly typing in the same head section on every page. At the same time, I don't want to lose the handmade feel, so I am committing to writing all of the template files myself, with no pre-built theme.</p>
<p>The theme is not ready for public consumption as a hugo module yet, but at the end of it, I would like to have something I can give back to the indie web world. Right now, the theme is sanitized, but very simple and requires a fair bit of bespoke customization for my site. Since the site is pretty simple, the theme components are pretty simple too for now. Let's take a look at some examples.</p>
<p>This is the <code>baseof.html</code> file. This tells Hugo the general structure of a page. You'll see here a few selections inside curly braces. These allow for the dynamic insertion of code from other files. The partials take entire files, while the block takes portions of other templates. Let's look at one of the inserted partials.</p>
<p>Here's the HEAD partial. It mostly looks like the head section of any website. The unusual thing is the curly braced code. These codes tell Hugo to insert specific parameters into the HTML that surrounds it, like the page's <code>{{ .Title }}</code>. The dot in front of the Title keyword here tells Hugo to use the current context. Since we aren't inside any other sections marked by braces, this context is the current page. Other variables, like <code>{{ site.Title }}</code> tell Hugo that the context is different. In this case, it's the entire site's Title, as set in the <code>hugo.yaml</code> file. This <code>head.html</code> file can be used on every page, regardless of which page it is and the page title will update automatically, but it isn't the version I'm using. Let's take a look at that one to see why.</p>
<p>The key differences here between the slightly more public-ready version and mine are small but significant. First thing is you'll notice a <code>$codestyles</code> variable being set. That's for Highlight.js to know how to color code in the pages. The default template also uses Highlight.js, but it's hosted on a CDN. For my site, I want to host the script myself. You can see me call the script at the bottom of the head block. The other thing you'll notice is below the title. This bit of code checks to see if the page's permalink is the Webring permalink. If it is, it includes a separate HTML file that has the webring members array in it, as well as a link to the Webring script.</p>
<p>Now this one is short and sweet. This is <code>single.hmtl</code>, the file Hugo uses when it determines a page's type is that of a single page, rather than a section full of additional pages. Here, all we're doing is defining the &quot;main&quot; block. If you scroll up to the <code>baseof.html</code> file, you'll see where we're calling the main block. Here, we use the context of the current page again, grabbing the title and content. Then, we exit the main block. Nice and easy. With a few more partials here and there, and some overriden local layouts, I've got a feature comparable version of the site as it was last week and it only took me 35 commits.</p>
]]></description>
      </item>
    
      <item>
        <title>Summer Activities Challenge</title>
        <link>https://tk-web.quest/blog/summer-activities-challenge/</link>
        <guid>https://tk-web.quest/blog/summer-activities-challenge/</guid>
        <pubDate>Thu, 25 Jun 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>This is a &quot;touch grass&quot; counterpart to my post on the <a href="/posts/2026-05-12-summer-game-challenge/">Summer Games Challenge</a> that I put up earlier this year. Like that challenge, I want to make a specific effort to do a few things this summer. I am placing specific tasks in this list so that there are clear goalposts for me. Like the Games Challenge, I will put down more than I expect to be able to accomplish. Unlike the Games Challenge, though, my timeline is a little bit tighter because I go back to 5-day work weeks on the week of the end date.</p>
<h1 id="the-challenge" tabindex="-1">The Challenge: <a class="heading-anchor" href="#the-challenge"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>List 10 specific goals you'd like to accomplish before the end of summer break. You are successful in the challenge if you accomplish four of them. The summer break runs from May 29th through August 9th.</p>
<h1 id="my-list" tabindex="-1">My List: <a class="heading-anchor" href="#my-list"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>These are a mix of outdoor and online activities. I do admit I'm an online creature at heart, but I think this is a good set and I can probably reasonably complete most of the list. Especially since I kind of cheated and have a few that are basically gimmes here.</p>
<ul>
<li>
<p>Publish at least three blog posts focusing on photography: I love taking photos. Especially when I am manually controlling the shot. Like a lot of other interests, this feels like mastery of a skill to me, one that automatic metering takes away from. My vision is bad enough that I'll always need autofocus, but I enjoy the rest of the process, which I do fairly manually. That said, I haven't gone out for a photo walk in a very long time. I want to spend some time out taking photos again. As a means of proof that I've done it and I like the pictures I've taken, I am going to put together posts for at least three photo walks.</p>
</li>
<li>
<p>Pass the CompTIA Security+ Exam: Last year, I took and passed the A+ exam, which gave me the opportunity to get the job that I have now and love. More certifications are an easy way for me to punch up my resume in my new career and Security is the one that is most widely asked for in my field, so it's next on my list.</p>
</li>
<li>
<p>Complete a project for The Worst Game Jam 5 (Jul 24–Aug 2): I really enjoyed making <a href="https://tk-web.quest/games/lost-stars/">Lost Stars</a> for the last jam. I have an idea in mind for the next project. I'm sure I can make it fit the theme and it will let me flex my creative muscles without being as heavy code-wise. I've already started researching the tools I'll need to learn for it. I'm super excited!</p>
</li>
<li>
<p>Complete at least basic versions of all major pages on <a href="https://tk-web.quest">TK's Web Quest</a>. Selfishly, this one is basically done. I've been toying with the idea of a buttons page and going back and forth on whether I want to have that or not, but all of my other major pages have been added. They aren't super pretty, but the content is there and &quot;making them pretty&quot; is a fairly subjective thing, so I don't want to add it as a goal.</p>
</li>
<li>
<p>Score an average of 36 points across 3 sets of 12 arrows in archery practice: The scoring I'm using is typical of indoor targets, with half as many scoring zones as professional archery. I'm using this scale because that's what the targets at my local range are set up as and can be adapted to the more typical pro archery targets as well. I'm not 100% sure of the distance I'll be shooting from, but it will be appropriate for the weight of my bow and my vision.</p>
</li>
<li>
<p>Write at least 6 blog posts: This will be inclusive of the photo posts if they contain enough text in addition. I find often that I feel like I have nothing of import to write about, but I think the more I write, the more I'll find I want to say, so encouraging myself to write more is an important step.</p>
</li>
<li>
<p>Create my own Hugo theme for the blog: Probably the most pie-in-the-sky goal on the list so far. I like the theme I use on the blog. I just feel like I could stand to make the blog and the main site cohere a little more closely in style. It would be nice to be able to embed the Hugo bloc content into a wrapper that looked exactly like the main site, but I don't really know how possible that is. I suppose that's something I'll have to learn.</p>
</li>
<li>
<p>Make a cohesive graphical identity for TK's Web Quest: This kind of goes hand in hand with the last one, but this is more about the images on the site. I want to have at least an 88x31 button, a 99x56 stamp, banner image, and square icon that will work at favicon, large favicon, and app icon sizes. I already have a square icon, but since I've re-done the fonts on my site it doesn't really fit the vibe anymore. It's time to replace these with new ones.</p>
</li>
<li>
<p>Do not miss a single <a href="https://twcr-radio.online">TWCR</a> recording or episode all Summer: I like the podcast, but the spaced out recording schedule has me more committed to never missing a show if I can help it. This one should be a gimme. I'll give myself bonus points if I can figure out a special bonus episode to do during these warmer months.</p>
</li>
<li>
<p>Start and maintain the Multiplayer Games Club: Also a selfish goal because I've already begun. Our first session was Unreal Tournament 2004, but I really want to build some momentum with this and make it a real staple of The Worst Garbage Online. I would also like to write up or record after-action reports for TWCR or the blog. Hopefully more of the sessions work well for that.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Rambling</title>
        <link>https://tk-web.quest/blog/rambling/</link>
        <guid>https://tk-web.quest/blog/rambling/</guid>
        <pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I've got a few things I wanted to write about, but none of them really feel big enough to be a whole post, so we're making a smorgasbord today.</p>
<h1 id="the-new-tk-web-one-div-at-a-time" tabindex="-1">The New TK-Web, One Div at a Time <a class="heading-anchor" href="#the-new-tk-web-one-div-at-a-time"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>As you may have noticed, <a href="https://tk-web.quest">TK-Web</a> looks a bit different now. The blog will continue to be built via Hugo for the time being, and will be served on the <em>blog</em> subdomain. The rest of the site, however, has been moved to a new static, hand-written HTML format. I decided to make this change because it would give me more flexibility in the future to format the pages there however I want. It also provides me the benefit of a playground to learn HTML and CSS. You'll notice that all of the static pages that used to be in the menu above are gone, replaced with a single link to the homepage. I may look into re-adding links there in the future, but it won't be soon.</p>
<h1 id="the-worst-webring" tabindex="-1">The Worst Webring <a class="heading-anchor" href="#the-worst-webring"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Another new feature of TK-web is <a href="https://tk-web.quest/webring">The Worst Webring</a>. The webring is built with the intention of being an opt-in collective of websites made by the members of <a href="https://theworstgarbage.online">The Worst Garbage Online's</a> community. It's opt-in, so it's relatively empty for the time being. If you're a TWG member and are interested in joining the webring, please <a href="https://tk-web.quest/contact">let me know</a>!</p>
<h1 id="a-year-of-podcast" tabindex="-1">A Year of Podcast <a class="heading-anchor" href="#a-year-of-podcast"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p><a href="https://twcr-radio.online">The Worst Community Report</a> is a year old! A year ago, Jared, Bluzo and I decided that it would be a fun joke to release a podcast while Into the Aether was on hiatus. We had so much fun making the show that we made it a real thing. We recently made some changes to our lineup and our release schedule, but we have no intention on stopping anytime soon. There's a lot that I would still like to do with the show and I feel like the biweekly cadence is going to help a lot with it.</p>
<h1 id="new-event-in-twg" tabindex="-1">New Event in TWG <a class="heading-anchor" href="#new-event-in-twg"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>A thing I've wanted to do for quite a while but haven't had the bandwidth to do has been running multiplayer play sessions. It feels like something that a lot of communities have happen just through the culture that they have, but for TWG, outside of a few specific instances, folks don't do a bunch of multiplayer gaming. I believe that it will be easier to actually have things happen if we specifically set aside time to do it, so that's what we're doing. For the inaugural event, we're playing <a href="https://github.com/OldUnreal/FullGameInstallers">Unreal Tournament 2004</a>. I've already gotten some suggestions for other games to play, but the selection of future games will be formalized next week. It seems like we've got a fair amount of traction, so I'm hoping this will become a staple for the community.</p>
]]></description>
      </item>
    
      <item>
        <title>A Git Novice&#39;s Guide to Git</title>
        <link>https://tk-web.quest/blog/a-git-novices-guide-to-git/</link>
        <guid>https://tk-web.quest/blog/a-git-novices-guide-to-git/</guid>
        <pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Git is a big, intimidating piece of technology that provides a huge amount of the infrastructure for how projects of all kinds are created, maintained, updated, and worked on collaboratively. It's easy to understand why someone might be put off from learning Git. If you are working on a project solo, there's a fair chance that you don't bother using something like Git. However, I implore you to integrate Git or a similar versioning system into your projects. It's extremely useful to be able to revert changes if they break something, and being comfortable with the concepts in Git will help you work collaboratively with others in the future. In this post, we'll just barely scratch the surface, but I'm hopeful that what I describe here will be helpful to you as a starting point. We'll go through what Git is, why you might want to use it, how to set up your first repository, and how to link that up with a Git service for additional features.</p>
<h1 id="what-even-is-git-anyway" tabindex="-1">What Even is Git Anyway? <a class="heading-anchor" href="#what-even-is-git-anyway"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Before I tackle what Git is, specifically, let me tell you what it is <em>not</em>. GitHub, GitLab, Forgejo and Codeberg are all services that interface with Git, but they don't own it and you technically don't even need to use one to benefit from what Git offers you. Let's see what the people who made Git in the first place call it.</p>
<blockquote>
<p>Git is a free and open source distributed version control system designed to handle everything from small to
very large projects with speed and efficiency.</p>
</blockquote>
<p>Okay, so that's a lot of jargon. Let's break it down. First, Git is free and open source. If you've been reading the rest of my blog, you should have a decent idea of what this means. It means not only is the compiled, ready to run version of Git free, but the uncompiled source code is too and anyone can help the project by contributing to it and everyone using the project will benefit! Next, Git is distributed. That just means that it's built with an intention of allowing people to access and manage a Git repository from different locations. Finally, we get to the meat of it. Version control is the true power here. A version control system is a protocol or program designed to help make sure that the versions of files are in sync between different people working on the same project, but also allow project maintainers to roll back to an earlier version easily. If you've had a folder full of files with names like &quot;project v1, project v2, project final, project final final&quot; before, you've done some manual version control. Git is semi-automated and organized to make that process easier.</p>
<h1 id="why-would-i-want-version-control" tabindex="-1">Why Would I Want Version Control? <a class="heading-anchor" href="#why-would-i-want-version-control"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Version control is basically an undo button for an entire project that can target any specific release or change to that project all the way back to the very first initial commit. It's extremely powerful. Let's take a couple hypothetical scenarios to see what I mean.</p>
<p>Let's say you're working on a website. You rewrite your whole main page. You put in new art, new CSS, new HTML, even new content. You spend a long time working on this page, but when you upload it, it breaks. Something happened along the way that just destroyed your entire page. Nothing is working right and now, after a long day working on it, it's midnight. You need sleep. You can't re-do the whole thing, but you also don't want the page to be broken or completely blank until you can fix it. With version control, you can revert back to your last change, when everything was still working, and set that as the new current &quot;main&quot; version of the site, effectively undoing all of your changes. But your changes still exist! You can re-check out your changes and work on them until they work, then overwrite the &quot;main&quot; branch with your updates. Sure, you could just be really diligent with backups, but everyone knows that one tiny fix can snowball into a much bigger rewrite and you may not back up for a small fix. Version control gives you automatic backups forever because you can go back to any point in time you want to very easily.</p>
<p>Here's another situation. Let's say you want to make a project with a friend. They're really good at some things and you're really good at other things. It would be really nice if you could work on your own versions of the project and combine changes down the line, right? Well, with version control, you can do exactly that. You make a change and commit that change to the repo. Your friend makes a different change, pulls your changes from the repo, then merges their changes with yours and pushes that back up tot he repo. Now, both of you are making changes without interfering with each others' versions of the files.</p>
<h1 id="git-terminology" tabindex="-1">Git Terminology <a class="heading-anchor" href="#git-terminology"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I've used a few terms in this post already, but it's probably worthwhile to give us some working definitions so that we're all on the same page.</p>
<ul>
<li>
<p>Repository - A digital container for all of the files related to a project. You can think of this as a folder full of all the files used for a project.</p>
</li>
<li>
<p>Commit - Both a bundle of changes made to the repository and the state of the entire repository when that change was submitted.</p>
</li>
<li>
<p>Branch - A version of the project with a unique label. One branch will be the main branch for the project. Others will have diverged from that main branch at some point and may be merged back in later.</p>
</li>
<li>
<p>Merge - The act of combining the code from a commit or branch into another branch, usually the main branch.</p>
</li>
<li>
<p>Pull Request - A message and process for a contributor to request that changes they've made to the project be merged into the main branch.</p>
</li>
<li>
<p>Maintainer - The person or people currently acting as primary developers on a project. They are the ones who approve or deny pull requests from contributors.</p>
</li>
<li>
<p>Contributor - A person who has made changes to a repository.</p>
</li>
<li>
<p>Diff - A summary of changes between the current version of a file in the repository and a newly committed one.</p>
</li>
</ul>
<p>There will be a few more of these terms, but I'll explain them as we go.</p>
<h1 id="the-repository" tabindex="-1">The Repository <a class="heading-anchor" href="#the-repository"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>There's a couple of ways to think of a Git repository. On your computer, at any given time, the repository is just a folder full of files. Your repo is everything inside a project folder. From the Git perspective, though, your repository has so much more information. There is a hidden <code>.git</code> folder inside your repository that stores information about the repository, the remote repository you're attached to, and the files in your local copy. You don't need to and shouldn't interact with the <code>.git</code> folder directly at all. Git itself will handle everything for us once the configuration is set up.</p>
<p>Let's take a look at the repo for this blog.</p>
<pre><code>tk-web-quest/
├─ .forgejo/
├─ .git/
├─ archetypes/
├─ assets/
│  ├─ css/
│  ├─ images/
├─ content/
│  ├─ games/
│  |  ├─ ...
│  ├─ posts/
│  |  ├─ ...
│  ├─ search.md
├─ i18n/
├─ layouts/
│  ├─ partials/
|  ├──├─ ...
│  ├─ _default/
├─ static/
│  ├─ icons/
│  ├─ images/
├─ themes/
│  ├─ PaperMod/
├─ .gitmodules
├─ .hugo_build.lock
├─ hugo.yaml
├─ readme.md
</code></pre>
<p>As you can see, there's a few dotfiles and folders. Anything that starts with a dot is hidden by default and managed by either git or hugo, so we can safely ignore them. Everything else is how my blog project folder looks right now. Now let's look at the other side of the repo, all the changes and commits that have been made. This is the working tree. My working tree is really long and linear, but there is one interesting section, so let's look at that.</p>
<pre><code>*   fd4a494 Merge pull request 'fixing images' (#4) from testing into main
|\
| * 55c6bf8 fixing images
* | db6d18d another 's
* | 42e53b5 accidentally an 's
* | c8c8119 Merge pull request 'remove mana' (#3) from testing into main
|\|
| * 185cf59 remove mana
* | 93aae11 Merge pull request 'Merge PaperMod theme change, new post.' (#2) from testing into main
|\|
| * 6e957ed commit to this theme change, add post
| * 494bad6 switching themes
| * 07000ed revert regression with render hooks
| * ab6c6c8 testing image render hook
| * 5fb2f69 fix
| * 0d4e635 testing RenderHook
* | 8ad6114 merge
|\|
| * b141933 switch hugo.toml to yaml format
|/
* 8aa9f76 images?
</code></pre>
<p>Here you can see the commit ID and commit message for each commit. The lowest commit here is the oldest and the top one is the newest. You can see I had some trouble with images. Then, I made a branch where you see the <code>|/</code>. The left branch is the main branch and the right branch was made to test switching the site's main config file from TOML to YAML format. You can see that in the first commit above the branch. The next line, <code>|\|</code> is showing that I merged the changes from the branch, but I didn't terminate it. That merge comment is the next line up. The asterisk is on the main branch because that's where the commit was pushed to. A little further up, you can see another merge without termination, then a commit on each branch, then a few more commits to main, one last commit to the new branch, then another merge. This time the merge terminates the branch and we get a longer message. &quot;Merging pull request...&quot; I made a pull request on my own repo, then approved it and terminated the branch. This setup let me test a bunch of features and such without pushing my changes to the real site and finally pull everything into the main repository when the testing was successful.</p>
<p>The key thing about this history is that if I ever wanted to go back and see the site from any specific point in time, I could simply checkout the commit from that time period and see it exactly as it was. using <code>git checkout COMMIT-ID</code>. It's like a built in time machine that goes all the way back to the very first commit I have for the project where the code is currently hosted.</p>
<h1 id="putting-it-all-together" tabindex="-1">Putting it all together <a class="heading-anchor" href="#putting-it-all-together"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay, so now I hope you understand a little bit about why Git is useful and cool. Let's convert an existing website folder into a repository so we can start tracking it. We're going to start by creating a new repository on our code forge. I'm using Forgejo here, but the setup is very similar on GitHub and GitLab. Just click the + button next to your profile image on the site and select &quot;New Repository.&quot; Since we already have a folder full of files, I'm going to leave the &quot;initialize&quot; box unchecked. Like the text there says, that means Forgejo won't create any extra files like a <code>.gitignore</code> or <code>readme.md</code></p>
<p><img src="2026-06-09-16-47-46-image.png" alt=""></p>
<p>On the next page, you'll see a couple text boxes with instructions. We're going to follow the one for creating a new repository on the command line. Open a terminal in the root of your website project and run <code>git init</code>. This will create the <code>.git</code> directory we saw earlier and set it up with tracking. Next, run <code>git switch -c main</code>. This tells git to switch the active branch in the repository to be &quot;main&quot; which is generally accepted as the default branch for nearly any code forge. This command may or may not be necessary depending on your version of git. Next, we're going to add our files, but we aren't going to use the command Forgejo has laid out for us. Instead, we'll be using <code>git add -A</code>. This command tells git to <strong>add</strong> <strong>-A</strong>ll files to tracking on the current branch. Next, we're going to set up the commit with <code>git commit -m &quot;first commit&quot;</code>. The <strong>-m</strong> flag tells git that the next string in the command is the commit message. The quotation marks are important because it tells the command everything between these marks is one string. Next, we're going to add the remote. Run <code>git remote add origin https://YOUR-DOMAIN.com/USER/REPO.git</code>. Your command will be different here because you will need to put in your forge's URL and your username and repo name. Finally, you're going to want to <code>git push -u origin main</code>. This command tells git to <strong>push</strong> your changes to the server and <strong>-u</strong>pdate the remote associated with the repo to <strong>origin</strong> and the branch to <strong>main</strong>. In future pushes, you won't need the &quot;-u origin main&quot; part of the command.</p>
<blockquote>
<p><strong>Note</strong>: At this point, Git should give you some feedback on the authentication. If using Forgejo and Windows, it will open a browser and have your log into Forgejo and authorize Git to make the push. If the command fails, you probably need to change how you're pushing or make some changes so that your credentials can be included with the push. This specific issue is a big one and depends heavily on your OS, how you want to store or not store credentials, and what you're using for your remote git server, so I won't include troubleshooting steps here.</p>
</blockquote>
<p>Now got back to your code forge and refresh the page. You should see something like this:</p>
<p><img src="2026-06-10-11-05-28-image.png" alt=""></p>
<p>All your code is now on the forge! If you wanted to work on your site on another device, you could now use <code>git clone REPO-URL.git</code> to clone your repo, including the tracking. To push an update to your code forge, you just need three commands:</p>
<pre><code>git add -A
git commit -m &quot;commit message&quot;
git push
</code></pre>
<p>You should be off to the races now. There's a lot more that Git can do, but for maintaining your site on your own with no need for branches, this is all you really need.</p>
<h1 id="a-piece-of-the-actions" tabindex="-1">A Piece of the Actions <a class="heading-anchor" href="#a-piece-of-the-actions"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<blockquote>
<p><strong>Note:</strong> This is only relevant if your specific instance or code forge has an Actions ecosystem and runners you have access to. Github and Gitlab have Actions and freely available runners for small workloads, for example, but private instances may not. For example, 32bit.cafe's Forgejo instance doesn't have Actions or Runners available.</p>
</blockquote>
<p>One last part of Git that has become more important in recent years has been Continuous Integration and Continuous Deployment. Since a git commit is a specific action that can be used as a hook for other things, you can build off of it to automate some of how your repo works. For example, if your site uses a static site generator like Hugo, all the markdown you uploaded is well and good and maybe you even included the /public directory too, but what if you could have your code forge run your <code>hugo --minify</code> command for you? And what if it could then copy your site to your webserver? That's a Continuous Deployment workflow. Here's mine, for example. This file lives at <code>/.forgejo/publish-main.yaml</code>. My Forgejo instance has a Forgejo Runner attached to it. When a commit gets pushed to the main branch, Forgejo sends it to the runner. The runner then  runs the action outlined in my action file.</p>
<pre class="language-.forgejo"><code class="language-.forgejo"><span class="highlight-line">name: deploy</span>
<span class="highlight-line">on:</span>
<span class="highlight-line">  push:</span>
<span class="highlight-line">    branches: # This tells Forgejo when to run the action. Here, we're running it on push on the main branch</span>
<span class="highlight-line">      - main</span>
<span class="highlight-line">  workflow_dispatch: # This line lets me manually run the action if I need to.</span>
<span class="highlight-line"></span>
<span class="highlight-line">jobs:</span>
<span class="highlight-line">  deploy:</span>
<span class="highlight-line">    runs-on: hugo # This is a label for the runner. Only a runner with the "hugo" label will run this job. The runner knows that it should pull the latest Hugo container to run the job in.</span>
<span class="highlight-line">    steps:</span>
<span class="highlight-line">      - name: Pull repo # This name is displayed in the web ui</span>
<span class="highlight-line">        uses: actions/checkout@v4 # This is a reference to a built-in Forgejo action that copies the current state of the repo to a folder on the Runner so the runner can do its job using the files provided.</span>
<span class="highlight-line">        with:</span>
<span class="highlight-line">          submodules: true # Hugo themes are a submodule, so we need to make sure we include them</span>
<span class="highlight-line">          fetch-depth: 0 # Fetch-depth tells the checkout action how deep into the repo to look for submodules. Depth 0 is unlimited.</span>
<span class="highlight-line">      - name: build site</span>
<span class="highlight-line">        run: hugo --minify # Here, we give the exact hugo command we want to run. In this case, we set the "--minify" flag so that the code gets minified before output. It makes the site smaller and lighter.</span>
<span class="highlight-line">      - name: Deploy site with Rsync</span>
<span class="highlight-line">        uses: https://github.com/Burnett01/rsync-deployments@v8 # This is an action maintained by a github user to deploy files from an Action to a remote server using Rsync.</span>
<span class="highlight-line">        with:</span>
<span class="highlight-line">          switches: -vzr --delete # Here's the flags for Rsync. These tell Rsync to be verbose in the log, compress files during transit, recurse through directories, and if a file doesn't exist at the source, delete it from the destination.</span>
<span class="highlight-line">          path: "public/" # Hugo's output directory</span>
<span class="highlight-line">          remote_path: "/mnt/homeserver/applications/apache/blog/" # The directory to put the files on the remote server</span>
<span class="highlight-line">          remote_host: $ # These three lines are variables and secrets used by the action. I set them in the web UI for Forgejo and the action knows to replace the shortcodes here with the correct values.</span>
<span class="highlight-line">          remote_user: $</span>
<span class="highlight-line">          remote_key: $</span></code></pre>
<p>Once the action runs, you can see the results of the action on your code forge. You can see one of the more recent runs of my deploy action here.</p>
<p><img src="2026-06-10-11-34-01-image.png" alt=""></p>
<p>In-depth ins and outs of setting up and using actions is outside the scope of this guide. There's a lot of good information out there, though and the docs are generally pretty good.</p>
<h1 id="the-end-of-it" tabindex="-1">The End of It <a class="heading-anchor" href="#the-end-of-it"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I never really know how to end these kinds of guide posts. Anyway, if you have questions or want to know more about any aspect of this, please send me a message through <a href="https://tk-web.quest/contact">the contact page</a> and I'll update the guide and answer you directly!</p>
]]></description>
      </item>
    
      <item>
        <title>Indie Web Resources</title>
        <link>https://tk-web.quest/blog/indie-web-resources/</link>
        <guid>https://tk-web.quest/blog/indie-web-resources/</guid>
        <pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<blockquote>
<p>This post originally was a separate page. Due to some re-arranging of things, it no longer makes sense to have it as a separate page, so I converted it to a post.</p>
</blockquote>
<p>Whenever I mention to someone in my day-to-day life that I have a website of my own, I tend to see two reactions. One is people being generally supportive but uninterested in doing the same. The other reaction is to be supportive, but with a longing for that kind of space for themselves. Building your own website can be intimidating! And it can often feel like if you don't go all the way and host or write it yourself, you might as well not try. Folks, I am here telling you that <em>having a website of your own is easy and fun!</em> I recognize that my credentials kind of harm my credibility here. As a working IT professional and a hobbyist system administrator, it might feel like I'm about to throw you in the deep end. Dear reader, this could not be any further from the truth. So, take my hand and I'll explain what we're doing here and the idea behind it. If you're already sure of your footing with regards to the ideology and terminology, you can certainly skip down to the actual list of resources.</p>
<ul>
<li>
<p>A <strong>blog</strong> is a publication on the web. It could be a personal journal, notes on a project, or more thematic than that. It could be independent and self-hosted, or it could be on a larger platform. It could be updated occasionally, randomly, or on a set schedule. The key thing to note is that a blog is a <em>website with content that is added over time</em>.</p>
</li>
<li>
<p>A <strong>Digital Garden</strong> is a web-space built to house more evergreen content that is grown over time, rather than adhering to a faster schedule. These spaces are different from blogs in that the intent is to <em>cultivate them based on active additions <strong>and</strong> pruning.</em></p>
</li>
<li>
<p>The <strong>Small Web</strong> is a collection of personal websites and blogs. These are often, but not always, noncommercial. They also are sometimes hosted on larger corporate platforms like Blogger which is owned by Google. However, the guiding philosophy is towards human-made content and expression. It's more about <em>doing the thing</em> rather than <em>how it's done</em>.</p>
</li>
<li>
<p>The <strong>Indie Web</strong> is sometimes a contentious term, but in my own writing, I'll be referring to it as websites that are not hosted on existing corporate platforms. This means no Blogger, no Substack, no Medium. The indie web is significantly more concerned with who owns the content. If you post something to a major platform, the likelihood that you have exclusive ownership of that content is slim to none. By managing as many links in the chain yourself as possible, you ensure that <em>your information and content is yours and no one else's</em>. In the indie web, managing your own hosting, domain, etc is <em>encouraged, but not required</em>.</p>
</li>
<li>
<p>The <strong>Good Web</strong> is a category I really like that has been recently pushed by <a href="https://brennan.day/building-the-good-web/">Brennan</a>. This category is significantly more broad than the other two, but the idea is simple. The Good Web is built out of communities, websites, and technologies that maintain the idea that the person on the other end of the wire is a human being and deserves to be treated as such, without being turned into a commodity by the technology or tactics involved. The good web posits that <em>people are worthy of dignity and respect.</em></p>
</li>
</ul>
<h1 id="resources" tabindex="-1">Resources <a class="heading-anchor" href="#resources"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<h2 id="rss-readers" tabindex="-1">RSS Readers <a class="heading-anchor" href="#rss-readers"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://support.mozilla.org/en-US/kb/how-subscribe-news-feeds-and-blogs">Firefox</a> - Firefox has a built in RSS reader! No extension required.</p>
</li>
<li>
<p><a href="https://freshrss.org/index.html">FreshRSS</a> - A free self-hosted RSS reader and aggregator. Add all your feeds to FreshRSS and you can then use the Google Reader API to sync your read status and subscriptions to other applications.</p>
</li>
<li>
<p><a href="https://github.com/yang991178/fluent-reader">Fluent Reader</a> - A multiplatform RSS reader that supports the Google Reader and Fever APIs.</p>
</li>
<li>
<p><a href="https://netnewswire.com/">NetNewsWire</a> - A free and open source RSS reader for Mac and iOS. Follows the Mac/iOS design language closely.</p>
</li>
</ul>
<h2 id="domain-names" tabindex="-1">Domain Names <a class="heading-anchor" href="#domain-names"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://porkbun.com/">Porkbun</a> - A paid domain name registrar. This is where the Taming Knots domain and my other domains are registered. Overall a pretty great experience.</p>
</li>
<li>
<p><a href="https://open-domains.net/">Open Domains</a> - A free subdomain registrar. To get a domain, you fork their github repository and request it there. Once their DNS updates, the domain is live.</p>
</li>
<li>
<p><a href="https://www.duckdns.org/">DuckDNS</a> - Their regular service is built to dynamically update DNS records for a home IP, since internet service providers rotate user IPs every so often. A side-product of this is that you can get a (site).duckdns.org domain name for free.</p>
</li>
<li>
<p><a href="https://freedns.afraid.org/">Afraid.org's FreeDNS</a> - A registry of domain names where people have offered to allow others to forward a subdomain to their own site. For example since I own tk-web.top, I could (but do not currently) offer it so that someone else's site could be (site).tk-web.top.</p>
</li>
</ul>
<h2 id="blog-and-site-hosts" tabindex="-1">Blog and Site Hosts <a class="heading-anchor" href="#blog-and-site-hosts"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://bearblog.dev/">Bear Blog</a> - <strong>Free, $5/mo for custom domain</strong> - A dead-simple blog host with a focus on longevity. In the words of Herman, the founder and maintainer of the site, &quot;Bear won't shut down. Period.&quot; It's under active development, but has a big focus on simplicity and speed. No coding experience is required and posts are written in Markdown or HTML.</p>
</li>
<li>
<p><a href="https://pika.page/">Pika Page</a> - <strong>Free, $6/mo or $60/yr for more than 50 posts, custom domain</strong> - Another very simple blogging platform made by the folks at Good Enough. Reliable and fast, with no coding required. Posts are written in their own online editor.</p>
</li>
<li>
<p><a href="https://www.dreamwidth.org/">DreamWidth</a> - <strong>Free, $35/yr, $50/yr for additional resources/features</strong> - A spiritual successor to LiveJournal, Dreamwidth is a publishing platform with social integrations and a directory built in. The entire codebase is open source as well, continuing on from where LiveJournal left off.</p>
</li>
<li>
<p><a href="https://nekoweb.org/">Neko Web</a> <strong>Free, $3.50/mo, $7/mo for additional storage, Git/WebDAV/FTP access, and unlimited bandwidth</strong> - A free static web hosting service, good for learning to code with HTML, or using a Static Site Generator to generate a site.</p>
</li>
<li>
<p><a href="https://neocities.org/">Neocities</a> - <strong>Free, $5/mo for additional storage and features</strong> - A classic reinvention of the venerable Geocities. A static site building and hosting platform with built in tutorials for making your own website.</p>
</li>
<li>
<p><a href="https://smol.pub/">Smol Pub</a> - <strong>Free</strong> - A tiny blogging service, accessible via regular web and the Gemini protocol. Very feature light, but if all you want is a place to write, this is a good one.</p>
</li>
<li>
<p><a href="https://midnight.pub/">Midnight Pub</a> - <strong>Free</strong> - Another tiny blogging service, with a little more community. All users' posts show up in the recent posts section of the homepage.</p>
</li>
<li>
<p><a href="https://mataroa.blog/">Mataroa</a> - <strong>Free, $9/yr for custom domain, post by email</strong> - A minimal blogging service built to get you writing as quick as possible with no distractions. 5% of all revenue from premium users goes to CO2 removal.</p>
</li>
</ul>
<h2 id="static-site-generation" tabindex="-1">Static Site Generation <a class="heading-anchor" href="#static-site-generation"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://gohugo.io">Hugo</a> - It's what Taming Knots is built on! Written in Go, it takes a theme (HTML templates) and applies those to Markdown posts you write. Very easy to use, and it gives you a ready-built website you can upload to a static web host or host yourself with a basic webserver.</p>
</li>
<li>
<p><a href="https://www.11ty.dev/">11ty</a> - Eleventy is extremely popular in the SSG crowd. It's written in Javascript and benefits from very wide support. The selection of themes available is pretty great. <em>Note: 11ty has been renamed to Build Awesome, but it hasn't launched yet. When it does, there will be a paid pro version, but they have committed to continuing support for the open source free version as well.</em></p>
</li>
<li>
<p><a href="https://jekyllrb.com/">Jekyll</a> - The backend that powers Github Pages. Jekyll is also a well-loved SSG, built in Ruby and distributed as a Gem. You don't have to host via Github, but the close ties might give folks pause.</p>
</li>
<li>
<p><a href="https://github.com/capjamesg/aurora">Aurora</a> - Uses Python to generate a site. A little smaller with less support, but is focused on generating sites very fast so that you can do semi-live editing.</p>
</li>
</ul>
<h2 id="site-snippets-add-ons-etc" tabindex="-1">Site snippets, add-ons, etc <a class="heading-anchor" href="#site-snippets-add-ons-etc"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<h3 id="contact-forms-and-guest-books" tabindex="-1">Contact Forms &amp; Guest Books <a class="heading-anchor" href="#contact-forms-and-guest-books"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<ul>
<li>
<p><a href="https://letterbird.co/">Letterbird</a> - A contact form by Good Enough. It's actually the same one I use!</p>
</li>
<li>
<p><a href="https://atabook.org/">Atabook</a> - A basic Guest Book for your site, has manual approval and email alert options.</p>
</li>
</ul>
<h3 id="counters-and-analytics" tabindex="-1">Counters &amp; Analytics <a class="heading-anchor" href="#counters-and-analytics"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<ul>
<li>
<p><a href="https://counter.fc2.com/en/index.html">FC2 Counter</a> - A website access counter with a lot of styles to choose from</p>
</li>
<li>
<p><a href="https://www.goatcounter.com/">GoatCounter</a> - A basic analytics engine for small websites. Also available as a self-hosted app.</p>
</li>
<li>
<p><a href="https://github.com/HermanMartinus/bearlytics">Bearlytics</a> - Simple analytics engine built by the same person who builds and maintains Bear Blog.</p>
</li>
<li>
<p><a href="https://smallcounter.com/">Smallcounter</a> - A basic, small, embed-able visitor counter for your website.</p>
</li>
</ul>
<h2 id="communities" tabindex="-1">Communities <a class="heading-anchor" href="#communities"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://melonland.net/">MelonLand</a> - <strong>Free</strong> - A Web-Revival project and community built around artists and how the internet used to be. Has some neat features around websites that can be edited by anyone or select groups of users as well as an active forum, minecraft server, and wiki.</p>
</li>
<li>
<p><a href="https://32bit.cafe/">32-bit Cafe</a> <strong>Free</strong> - An extensive online community that maintains Fediverse instances for Pixelfed and Mastodon, a git server using Forgejo, a FreshRSS instance, free email hosting, online docs via Etherpad, a Discord server, a forum, a tilde server, a pubnix, and even a community recipe book.</p>
</li>
<li>
<p><a href="https://omg.lol/">omg.lol</a> - <strong>$20/yr</strong> - A community web services provider. The entry fee gets you a subdomain at (site).omg.lol with an email address, a basic website, a status log, a fediverse account on the omg.lol instance, a permanent url shortener, pastebin, access to the omg.lol Forgejo instance and some other goodies.</p>
</li>
</ul>
<h2 id="distribution" tabindex="-1">Distribution <a class="heading-anchor" href="#distribution"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li><a href="https://echofeed.app/">Echofeed</a> - A service that will keep an eye on your blog's RSS feed and automatically cross post your blog entries to social media for you. Supports Mastodon, Bluesky, Discord, and others.</li>
</ul>
<h2 id="discovery" tabindex="-1">Discovery <a class="heading-anchor" href="#discovery"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://ooh.directory/">Ooh Directory</a> - A manually curated blog directory separated by category.</p>
</li>
<li>
<p><a href="https://a-website-is-a-room.net/">A Website is a Room</a> - A directory of posts from user-submitted sites.</p>
</li>
<li>
<p><a href="https://arthive.marigold.town/directory/">Art Hive Studio Directory</a> - A directory of sites from visual artists, including tags and filters.</p>
</li>
<li>
<p><a href="http://biglist.terraaeon.com/">The Big List of Personal Websites</a> - A directory of user-submitted personal websites.</p>
</li>
<li>
<p><a href="https://blogroll.club/">Blogroll.club</a> - A curated directory of user-submitted blogs.</p>
</li>
<li>
<p><a href="https://blogscroll.com/">BlogScroll</a> - A collection of blogs, personal sites and digital gardens maintained via GitHub repository.</p>
</li>
<li>
<p><a href="https://brisray.com/web/indiedirs.htm">Indie Web Directories</a> - A directory of other indie web directories</p>
</li>
<li>
<p><a href="https://indieblog.page/">IndieBlog</a> - An indie blog aggregator that sends users to a random post from a random blog at the click of a button</p>
</li>
<li>
<p><a href="https://indieseek.xyz/">IndieSeek Directory</a> - A manually curated and edited directory of independent sites.</p>
</li>
<li>
<p><a href="https://list-me.com/">List-Me</a> - An independent site directory with manual curation.</p>
</li>
<li>
<p><a href="https://districts.nekoweb.org/">Nekoweb Districts</a> - Topic-based categorization of sites hosted on NekoWeb.</p>
</li>
<li>
<p><a href="https://neo-neighborhoods.neocities.org/">Neocities Neighborhoods</a> - A directory of sites hosted on Neocities based on a number of categories.</p>
</li>
<li>
<p><a href="https://blogroll.org/">Ye Olde Blogroll</a> - Over 1000 hand-picked and curated blogs that are actively updated.</p>
</li>
<li>
<p><a href="https://smoothsailing.asclaria.org/">Smooth Sailing Listings</a> - A human-curated category-based listing site for webrings, cliques, blogs, roleplaying forums, and many other types of independent web spaces.</p>
</li>
</ul>
<h2 id="social-media" tabindex="-1">Social Media <a class="heading-anchor" href="#social-media"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://joinmastodon.org/servers">Mastodon</a> - An open source, federated microblogging service. Think Twitter but not full of fascists or bots. And also built in a way that allows communities to own their data. Based on the ActivityPub protocol.</p>
</li>
<li>
<p><a href="https://pixelfed.org/">Pixelfed</a> - An ActivityPub compatible service that focuses on images and video instead of text posts.</p>
</li>
<li>
<p><a href="https://join-lemmy.org/">Lemmy</a> - A Reddit alternative based on ActivityPub.</p>
</li>
<li>
<p><a href="https://tildes.net/">Tildes</a> - Another Reddit alternative that is open source and not based on AtivityPub.</p>
</li>
</ul>
<h2 id="guides" tabindex="-1">Guides <a class="heading-anchor" href="#guides"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>
<p><a href="https://brennan.day/a-beginners-guide-to-the-indieweb-for-writers-who-dont-code-but-maybe-want-to-a-little/">A Beginner's Guide to the Indie Web for Writers who Don't Code (But Maybe Want to a Little)</a> - Brennan has a good tier-based setup for non-coders and little-coders.</p>
</li>
<li>
<p><a href="https://fedi.tips/">Fedi Tips</a> - A Non-technical guide to the Fediverse. Has clear and concise steps to take to start with platforms like Mastodon.</p>
</li>
<li>
<p><a href="https://htmlforpeople.com/">HTML for People</a> - A web-book by Blake Watson for getting you from absolute zero to hosting a static website. Also has a Spanish edition.</p>
</li>
<li>
<p><a href="https://sadgrl.online/guides/">Sadgirl's Guides</a> - A variety of guides for both experiencing the Indie Web developing stuff for it.</p>
</li>
<li>
<p><a href="https://www.dragonflycave.com/html-guide/">Cave of Dragonflies' HTML Guide</a> - A CSS/HTML guide written in various levels to make skipping ahead easier if you already have some experience.</p>
</li>
<li>
<p><a href="https://cssgridgarden.com/">Grid Garden</a> - A game built to help you learn CSS Grid.</p>
</li>
<li>
<p><a href="https://flexboxfroggy.com/">Flexbox Froggy</a> - A game built to help you learn how to make and utilize flexboxes in CSS.</p>
</li>
<li>
<p><a href="https://rai.so/vps101-renting-a-slice-of-a-computer-on-the-internet/">VPS 101</a> - A guide to renting a slice of compute and web storage on the internet to host your own site or other web services.</p>
</li>
<li>
<p><a href="https://knhash.in/gentle-guide-to-self-hosting/">A Gentle Guide to Self Hosting</a> - Also focuses on VPS usage as a nudge toward ownership of information and spaces on the internet without needing the hardware to do so.</p>
</li>
<li>
<p><a href="https://ophanimkei.com/you/selfhosting">Mala's Guide to Self Hosting</a> - Another flavor of VPS hosting guide. Goes more in depth with what to do once the server is up and running.</p>
</li>
<li>
<p><a href="https://blog.basementcommunity.com/everything-i-do-when-hosting-a-website/">Everything I Personally Do When Hosting a Website</a> - Not by me, but hosted on Basement Club. A nice step-by-step guide to setting up a web server on a VPS.</p>
</li>
<li>
<p><a href="https://www.htmldog.com/">HTML Dog</a> - A set of guides for HTML, CSS and Javascript to serve as a complete web development hobbyist course.</p>
</li>
<li>
<p><a href="https://thoughts.melonking.net/guides/introduction-to-the-web-revival-1-what-is-the-web-revival">Intro to the Web Revival</a> - From Melonking, a good primer on the small internet revival that has been happening in the last few years.</p>
</li>
<li>
<p><a href="https://web.pixelshannon.com/make/">Make Your Own Website</a> - Another CSS/HTML tutorial. Not quite as step-by-step but might be helpful as well.</p>
</li>
<li>
<p><a href="https://internetingishard.netlify.app/">Internetting is Hard</a> - A complete online CSS/HTML curriculum built in discrete lessons.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Quest Status</title>
        <link>https://tk-web.quest/blog/quest-status/</link>
        <guid>https://tk-web.quest/blog/quest-status/</guid>
        <pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>It feels like almost all of my writing on this site is <em>about</em> this site. I don't mean for it to be that way, really, but as my primary creative outlet beyond the (now every other week) podcast, it feels more and more like I want this site to be an ever-growing, ever-changing thing. Right now, it feels pretty static, which is by design. I wonder, now if it being static is a bug or feature. To be clear, I do like the site a lot, but I feel like I'm not working on it as much as I would like to. I like to tinker and break things and get in the weeds. I like being frustrated until everything works just right and I get that rush of accomplishment. With the site as it sits, I'm very stable, which is good for getting my words out there onto the net, but isn't giving me the feeling I want.</p>
<p>So, what do we do from here? I want the best of both worlds, ideally. A site that is both stable and unflappable and consistently works, but also a site that I can tinker with and break and learn from. The obvious solution would be to have two websites. One as a sandbox and another as a blog? Sure, that might sound reasonable, but I'd like everything to be under the same domain. So a nested site, then? The blog site exists as its unique, separate entity <em>inside</em> of the other, more breakable sandbox site? As long as a link always exists, or as long as the blog is always available under tk-web.quest/blog, then that should be fine, right? I'm not sure if Hugo would play nice with that, though. My permalinks would all change. There's a fair shot all my posts would re-deploy over RSS, clogging everyones' feeds <em>again</em>. Maybe a subdomain? blog.tk-web.quest? The permalinks would all change again, I think, and RSS would still be a problem, but at least hugo might play nicer living alongside a different site? At that point, would I be hosting two separate <code>httpd</code> containers? Then I'm back at two websites, but they'd still share a domain...</p>
<p>Another thing I need to contend with is that I consistently have &quot;the grass is greener&quot; syndrome when it comes to the SSG. I use Hugo and have liked it, but 11ty has a lot of traction and support. Until it fully re-launches as Build Awesome, I think I'll hold off, but if the re-launch goes smoothly and doesn't change too much about what makes 11ty good, then a switch in SSGs might be in the future. I don't really know <em>why</em> I would do that, but also switching sounds fun and interesting, doesn't it? If I do, I'll probably try my hand at making my own theme and template from scratch.</p>
<p>So, if I'm making a new site for the more &quot;site-ey&quot; bits, what should I put there, and how should it behave? I've got two different tracks I'm thinking down towards the answers. Let's start, as is ever my prerogative, with the practical side of things. What should be included?</p>
<ul>
<li>
<p>A home page - As with any good site, it all starts here. This would ideally be a light introduction to the site and the content on offer. Maybe even with some clever code to pull the latest headline from the blog?</p>
</li>
<li>
<p>An About page - I'm bad at talking about myself, but this is a good place to shout the projects I've done, my professional and personal background, and my general personality. I don't want to be vapid, but I do want to show why it might be worth checking the rest of the site.</p>
</li>
<li>
<p>A guide library - I love teaching things, and I know I'm not always the best at it, but I do feel like guide posts and tutorials are always evergreen and I'd love to maintain a dedicated space for them.</p>
</li>
<li>
<p>More and deeper IndieWeb connections. Again, a thing I'm bad at, but I would really like to find some more community and common cause within the IndieWeb scene. I know a lot of this requires me to reach out first to other creators, so I am going to be doing some extensive diving into the webrings, cliques, and directories out there to find my people. If you think you could be my people, shoot me an email!</p>
</li>
<li>
<p>A guestbook or other public communication method - I love the idea of a guestbook, but I really want to embed one into a page rather than link out to an external one, even if I can theme that with some CSS or whatever. I realize this would take my static site and make it dynamic to some degree, but I think as long as it's done in a reasonable sort of way, it can be good.</p>
</li>
</ul>
<p>Okay, so that's a start on what should be there, now let's focus on how I want it to <em>be</em>.</p>
<ul>
<li>
<p>Multiple themes - Not just talking dark and light here, but dark and light versions of themes that are inspired by other aspects of my life and interests.</p>
<ul>
<li>
<p>Black walnut, oak, poplar, and maple. A reflection of my enjoyment of woodturning. I don't want to use the textures, but rather the colors of these American tree species, spread with coatings of linseed oil, beeswax, and shellac.</p>
</li>
<li>
<p>Early 00s Blue Skybox blue, white and splashes of green or pink. A remembrance of video game and technology eras past. Windows XP, the Playstation 2, and the premise of a new digital age.</p>
</li>
<li>
<p>Deep blues, with streaks of cyan, gold, and orange. The colors of morning twilight, with a somber, but cozy mood. A reminder of nature and the quiet world that exists beyond our busy lives.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>
<p>A greater use of images than exists in my current site, but also more abstract. Maybe an excuse to take the camera out more often.</p>
</li>
<li>
<p>Sound - The internet, for all its noise, is often a quiet place. I'd like to add some audio texture to it. Perhaps not with sound effects, but rather opt-in background sound specifically. Rain patter, white noise, room tone from where I write, a keyboard, flipping pages and the warm closeness of a library.</p>
</li>
<li>
<p>Games, a scavenger hunt or ARG. Clues and ciphers hidden among the pages, but with the explicit instruction that page sources and hacking will never be necessary. An accessible quest to undertake within the site itself.</p>
</li>
</ul>
<p>Is all of this possible? I'm not sure, but I sure would be interested in trying to make it happen. I'm sure my attempts will be ugly and disastrous, but that's all part of the process. Trust the process. Learn something new every day.</p>
<p><img src="2026-05-18-22-22-35-img.png" alt=""></p>
]]></description>
      </item>
    
      <item>
        <title>Sharpening the Axe</title>
        <link>https://tk-web.quest/blog/sharpening-the-axe/</link>
        <guid>https://tk-web.quest/blog/sharpening-the-axe/</guid>
        <pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<h1 id="the-concept" tabindex="-1">The concept: <a class="heading-anchor" href="#the-concept"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>This is a post speedrunning how fast I can actually get a post up on the site from concept to execution. I am starting the post at 8:42 PM Mountain time on 5/15/2026</p>
<p>Something that I've thought about a lot lately has been Brendon's description of his process for <a href="https://wavelengths.online">Wavelengths</a>. He talks about wanting to have as little friction as possible with no barriers between his ideas and execution of those ideas. To that end, he does a lot of interesting things around his tooling and recording/editing process, primarily editing his videos based on the audio first using Ableton, which he has extensive experience in. My methodology is pretty similar, but I'm still in the building phase, rather than off and running. Right now, I feel like the best way to describe it is &quot;Sharpening the Axe.&quot; It comes from an old proverb, often attributed to Abraham Lincoln.</p>
<blockquote>
<p>Give me six hours to chop down a tree and I will spend the first four sharpening the axe.</p>
</blockquote>
<p>The idea here is that if you spend the extra effort on ensuring your tools are in the most pristine, ready-to-use condition possible, the highest amount of effort will actually reach the problem you're trying to solve.</p>
<h1 id="existing-setup" tabindex="-1">Existing setup: <a class="heading-anchor" href="#existing-setup"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>My previous setup already did a lot of this for me. My site is built using Hugo, so I can write entirely in markdown, which is pretty fast for me. It also means I don't have to faff about with stuff like image processing or resizing. All that is handled when the site is built.</p>
<p><img src="2026-05-15-20-49-37-image.png" alt=""></p>
<p>I use Forgejo for my code forge. It's hosted on my home server. I also host a Runner on that server. The Runner creates its own little sandbox to run the commands I have stored in an Action yaml file in my repository. The yaml tells the runner to pull the repo, run hugo on it, then push the updated site to my webserver, which actually hosts the site. This has been set up for a <em>while</em> now and works beautifully. Everything <em>after</em> saving the blogpost is extremely fast and easy.</p>
<p>To trigger all of this, I have a simple script that takes the multiple actions of adding changed files, setting a commit message and pushing the changes to my Forgejo instance into a single command. I simply <code>blogup</code> in a terminal and everything pushes.</p>
<h1 id="new-solutions" tabindex="-1">New Solutions: <a class="heading-anchor" href="#new-solutions"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The issue with the setup before now has been that in order to make a new post, I had to accomplish a few things.</p>
<ol>
<li>
<p>Make a new folder in my local copy of the tk-web-quest Repository with the current date and post title</p>
</li>
<li>
<p>Make a new <a href="http://index.md">index.md</a> inside that folder.</p>
</li>
<li>
<p>Put front matter into the <a href="http://index.md">index.md</a> so Hugo knew what the post date and title were.</p>
</li>
<li>
<p>Write the post</p>
</li>
<li>
<p>Every time I added an image, I needed to move it into an images folder next to the post.</p>
</li>
</ol>
<p>While this may not seem like a lot, it was a good couple minutes of setup before I could actually <em>write</em> anything. My new changes come as a pair.</p>
<h2 id="image-improvement" tabindex="-1">Image improvement: <a class="heading-anchor" href="#image-improvement"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This one is thanks to Tkaixiang, the person who has been dutifully maintaining a fantastic fork of Marktext for a while. I asked if there was any way to make the image handling of Marktext better, to allow images to be placed relative to the currently open folder or the currently open file depending on a preferences dropdown. As it turns out, this dev is very responsive and added that feature into a prerelease of their Marktext fork. Even more excitingly, though, Jocs, the original author of Marktext has returned to maintain the original and has merged all of Tkaixiang's work as a huge contribution. I'm really excited to see where Marktext goes from here</p>
<h2 id="new-post-workflow" tabindex="-1">New Post Workflow <a class="heading-anchor" href="#new-post-workflow"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This one is also a little helper script. It's a little more complex than the other one, but that makes it a little more functional. I've included it below as inspiration for others who might be interested in a similar workflow. The script accepts a single argument in quotations ie: <code>newpost &quot;Sharpening the Axe&quot;</code> and does all the prep work for me, setting up a new draft post in a flash rather than me having to mess with it. If I need to edit the title or something, I can do that after the fact, but this gets me writing as fast as possible.</p>
<pre class="language-sh"><code class="language-sh"><span class="token shebang important">#!/bin/bash</span>

<span class="token comment">## A script to start a new blog post with the front matter already applied and the folder format correct. The script accepts one argument, the post's name as a string.</span>

<span class="token comment">## Get the post date from current time</span>
<span class="token assign-left variable">post_date</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">date</span> <span class="token string">'+%Y-%m-%d'</span><span class="token variable">)</span></span>

<span class="token comment">## Get the post name without spaces, in lower case, and without problematic characters.</span>
<span class="token assign-left variable">pass1</span><span class="token operator">=</span><span class="token variable">${1<span class="token operator">/</span><span class="token operator">/</span> <span class="token operator">/</span>-}</span>
<span class="token assign-left variable">pass2</span><span class="token operator">=</span><span class="token variable">${pass1<span class="token operator">/</span><span class="token operator">/</span><span class="token operator">,</span><span class="token operator">/</span>}</span>
<span class="token assign-left variable">pass3</span><span class="token operator">=</span><span class="token variable">${pass2<span class="token operator">/</span><span class="token operator">/</span><span class="token operator">:</span><span class="token operator">/</span>}</span>
<span class="token assign-left variable">pass4</span><span class="token operator">=</span><span class="token variable">${pass3<span class="token operator">/</span><span class="token operator">/</span>;<span class="token operator">/</span>}</span>
<span class="token assign-left variable">folder_name</span><span class="token operator">=</span><span class="token variable">${pass4<span class="token operator">,,</span>}</span>

<span class="token builtin class-name">echo</span> <span class="token string">"Directory will be <span class="token variable">$post_date</span>-<span class="token variable">$folder_name</span>"</span>

<span class="token function">mkdir</span> <span class="token environment constant">$HOME</span>/Projects/tk-web-quest/content/posts/<span class="token variable">$post_date</span>-<span class="token variable">$folder_name</span>

<span class="token builtin class-name">echo</span> <span class="token string">"Directory made. Creating index.md with correct frontmatter"</span>

<span class="token comment">## Make sure the index.md exists, then inject front matter into the file using a heredoc and cat</span>
<span class="token function">touch</span> <span class="token environment constant">$HOME</span>/Projects/tk-web-quest/content/posts/<span class="token variable">$post_date</span>-<span class="token variable">$folder_name</span>/index.md

<span class="token function">cat</span> <span class="token operator">&lt;&lt;</span> <span class="token string">EOF<span class="token bash punctuation"> <span class="token operator">></span> <span class="token environment constant">$HOME</span>/Projects/tk-web-quest/content/posts/<span class="token variable">$post_date</span>-<span class="token variable">$folder_name</span>/index.md</span>
---
title: '<span class="token variable">$1</span>'
date: '<span class="token variable">$post_date</span>'
draft: true
---

EOF</span>

<span class="token comment">## Open the resulting file in Marktext</span>
marktext <span class="token environment constant">$HOME</span>/Projects/tk-web-quest/content/posts/<span class="token variable">$post_date</span>-<span class="token variable">$folder_name</span>/index.md</code></pre>
<h1 id="time" tabindex="-1">Time! <a class="heading-anchor" href="#time"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>It's now 9:02PM. Time to run the update script!</p>
]]></description>
      </item>
    
      <item>
        <title>Stop Telling me Stuff is Amazing</title>
        <link>https://tk-web.quest/blog/stop-telling-me-stuff-is-amazing/</link>
        <guid>https://tk-web.quest/blog/stop-telling-me-stuff-is-amazing/</guid>
        <pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>When I think of my favorite things in any medium, there is one major common factor. In every single case, I went into the experience not really expecting a whole lot. In movies, I went into 1985's <em>Clue</em> knowing almost nothing about it. The only thing I'd been told before going in was that Tim Curry was in it. My introduction to <em>Zelda</em> was actually a very scary one for six-year-old me. My friends had gotten to the second major section of <em>Ocarina of Time</em> where Hyrule Castle Town is overrun with Redeads. Fast forward several years and I picked it up for myself to give it another shot and loved it. I picked up <em>Majora's Mask</em> simply off of my enjoyment of the first game and playing the demo at a Target. <em>Dark Cloud 2</em> I discovered quite a while after playing <em>Dark Cloud</em> and went in expecting a similarly clumsy, stiff game and was really surprised and endeared to the sequel. Terry Pratchett's <em>Discworld</em> was simply something that came up in searches as I looked for &quot;books similar to <em>The Hitchhiker's Guide to the Galaxy</em> by Douglas Adams.&quot;</p>
<p>In none of these cases did the item in question come to me highly recommended. No one gushed to me about how <em>Ocarina of Time</em> was the greatest game ever made or how <em>Discworld</em> was both an extremely humorous take on our own world's history and a sprawling fantasy epic that somehow made you care about characters that, famously, could be described very succinctly on a single index card. Every single time, I stumbled into my own love for the thing with the surprise and delight of finding it. Maybe being less connected in that time, both as a function of my age and the time in which I grew up, made those experiences more likely to find me as unexpected delights.</p>
<p>As I have grown older, I have noticed that my affection for new things has waned more and more. Perhaps it's that I've been around the block and have seen it all before, but more often I think about various pieces of media and how I hear about them. I have deliberately architected my life online to see as little advertising as possible. I use adblockers, I don't watch live TV. Every streaming service I pay for is one where ads don't exist or can be sidestepped with the subscription or via adblocking. Instead, I hear about new media from podcasts or word of mouth. This is both a benefit and a curse. On the one hand, I can look at people I interact with or listen to and find commonalities between my taste and theirs. I can use that to make decisions about what to play or watch next with some measure of certainty that the experience won't be a huge waste of time. On the other hand, a lot of folks who don't have a ton of practice describing media with a critic's eye tend to just say the same thing over and over again. &quot;It's so good!&quot; &quot;It's the best!&quot; &quot;I cried so much!&quot;</p>
<blockquote>
<p>Before I continue, let me be clear. This is not simply a finger-pointing exercise. People do not need to be professional critics to talk about something. They don't need to be eloquent and verbose in their recommendations. I recognize that. I am simply describing my own fatigue with the problem, not suggesting a solution.</p>
</blockquote>
<p>Whether I consciously try to account for this or not, what inevitably happens as I listen to these descriptors of a piece of media is that it becomes built up over time into a tier of quality that there is no possible way for the actual thing to overcome. Some of it is down to taste. I am not often moved to tears by media. It's something I just don't experience very often. I don't often call something the best in its genre or medium either. Some of that is an attempt to account for taste, but also I don't ever think of a game, movie, or anything else as perfect. There's always something to change or improve, even if it's small or even if it's not a core part of the experience.</p>
<p>I feel like my problem is three-sided. On one side is the folks pushing so hard that their favorite thing is a masterpiece. They build an expectation that cannot ever be overcome. On the second side, there's the lack in specificity. While mechanics are easy to describe and everyone <em>kind of</em> knows what someone means when they say &quot;It's so pretty&quot; or &quot;The jump feels good,&quot; people generally have less vocabulary to describe the story or directing or writing style or what have you. While these first two sides are theoretically solvable by folks doing the recommending, or can be somewhat accounted for by the person being recommended the thing, this third side is where the biggest problems lie. It's the ruining of the surprise. By receiving a recommendation for a thing, you are being robbed of the surprise that the thing will be good. This is the one I really have no solution for. There's too many games, too many TV shows, too many movies, too many books to experience everything, so you have to filter somehow, and a better way to get more enjoyment out of a hobby than less is to follow recommendations, but then nothing is surprising. If someone says something is good and it <em>is</em>, then it's within expectations. Your brain files that away as &quot;business as usual.&quot; not &quot;A delightful surprise.&quot;</p>
<p>So in the end, my request is impossible. Tell me things are good. Try to describe <em>why</em> they're good. But also, maybe, sometimes say something amazing is just okay, or maybe interesting and I just might find it a delightful surprise and love it just as much as you.</p>
]]></description>
      </item>
    
      <item>
        <title>The Summer Game Challenge: 2026</title>
        <link>https://tk-web.quest/blog/the-summer-game-challenge-2026/</link>
        <guid>https://tk-web.quest/blog/the-summer-game-challenge-2026/</guid>
        <pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>The Summer Game Challenge runs every year from Memorial Day to Labor Day and is intended to give folks a little more structure to their game playing over the summer months. I feat heard about it from <a href="https://www.youtube.com/@flowstatecrit">Matt Horton</a> over on The Worst Garbage Discord server. Last year I didn't want to limit myself, but this year I'm looking for some structure, so I'm going to go for it.</p>
<h1 id="the-challenge" tabindex="-1">The Challenge: <a class="heading-anchor" href="#the-challenge"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Post a list of 10 games before May 23, 2026. These games can be new or old, previously started or completely fresh. To complete the challenge, complete 4 or more games from your own list by September 7, 2026. Other than that, there's no rules.</p>
<h1 id="my-list" tabindex="-1">My List: <a class="heading-anchor" href="#my-list"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I want my list to be a healthy mix of things. Some are games that I've wanted to get to for some time but never had the chance to. Some are games that I've started and dropped. Some are new and some are old.</p>
<ul>
<li>
<p>Last Gasp: A game by Discord member Ashley, Last Gasp is a JRPG Roguelike. I've been meaning to get to it and just never have.</p>
</li>
<li>
<p>Metaphor Re:Fantazio: A JRPG by Atlus and P-Studio. A game I enjoyed the start of, but didn't really get grabbed by. I want to go back to it and give it another real shot.</p>
</li>
<li>
<p>Fields of Mistria: Perhaps a hopeful pick. I am hopeful that the game's 1.0 update hits before Summer's end. There's enough there currently, though, that I may start the game before it fully releases.</p>
</li>
<li>
<p>Caves of Qud: My current game and one that I feel is very likely to land in the &quot;completed&quot; pile. I'd like to get through the story at least once.</p>
</li>
<li>
<p>Atelier Ayesha: A game I've gotten within spitting distance of the end with, but failed right at the finish line. Unfortunately, the structure of it requires replaying from the beginning to more properly manage time. I'd like to go back and finish it though.</p>
</li>
<li>
<p>Island off Outer Darkness: This sounds like an incredibly interesting game to me, but I haven't picked it up yet. I heard about it from <a href="https://sidestory.show/">Side Story</a>.</p>
</li>
<li>
<p>Yakuza Kiwami 2: Continuing my exploration of Yakuza with the next entry. It's been a little bit since I finished Kiwami 1, so it'll be nice to see the boys again.</p>
</li>
<li>
<p>Trails in the Sky 1st: The remake of Trails in the Sky FC. One of the games I'm most eager to pick up this summer, but I've heard mixed things about it on Linux. Hopefully I can get it to work.</p>
</li>
<li>
<p>CrossCode: Another game I've started, but not gotten very far in. I feel like I'd like it, but it just wasn't sticking early on. I'm hoping trying it again will help me attach.</p>
</li>
<li>
<p>Paranormasight: The Seven Mysteries of Honjo: I really enjoyed The Mermaid's Curse a whole bunch earlier this year. I'd love to go back and play the first game.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>A Case for Understanding how Tools Work</title>
        <link>https://tk-web.quest/blog/a-case-for-understanding-how-tools-work/</link>
        <guid>https://tk-web.quest/blog/a-case-for-understanding-how-tools-work/</guid>
        <pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I work in IT support. I answer requests and fix broken computers. I work with intelligent, capable people. I do work on problems I have never seen before on the regular. I am, also, babysitting a bunch of people who have no idea how the tools they use daily work.  They know how to <em>use</em> them, to some degree, but they don't <em>know</em> them. They don't understand the capabilities of the technology they have access to.</p>
<p>I don't mean to complain. I am simply in awe of a mode of thought that just doesn't occur in my own mind. I am a curious person by nature. I want to learn as much as I can about as many things as I can. To that end, I feel like the only means to get the most out of a tool is to understand, even on a basic level, <em>how the tool works</em>. By tools here, I not only mean in the computer sense, but also in the sense of any object a person interacts with in order to accomplish a task. Some tools are simple. A hammer is a hunk of mass intended to impart a heavy force into a surface, be that the head of a nail or a sheet of silver, being spun into the shape of a ring. This is not so hard to understand. The humble text editor is simple too, accepting a person's words, etching them into the silicon mind of the box that sits in front of them. Other tools, are significantly more complex. A behemoth of cast iron and polished carbide, lifting, sliding, and turning a table this way and that to allow the spinning head of a cutter to release the structure of a complex part from the metal brick that formed its source. &quot;Real&quot; tools can be complicated, just as the image editing software that has hundreds of options the layperson will never use, instead simply adjusting the brightness of a landscape or draining the color from a portrait.</p>
<p>Okay, now I sound pretentious as hell. I've gotta stop putting so many hours into Caves of Qud. <em>ahem</em></p>
<p>So often, we simply use tools in our lives, not thinking about what they're really doing, how or why, but learning those tools can make us much more effective with them. Think of your kitchen knife. A flat blade of steel with a molded handle. How do you hold that knife? How do you move it to slice through things? Do you chop down? Do you saw back and forth? Does that change depending on what you are cutting? If you only hold the handle, try something new for me next time you cook. Pinch the blade between your forefinger and your thumb close to the handle on the dull side of the blade, then let your fingers wrap gently around the handle. Now try cutting again. Smooth, even strokes. Let the weight of the knife and your arm provide the downward force, but pull and push smoothly as you slice. I bet that knife is going to cut much better for you. That improvement comes from understanding the tool. Understanding how your body interacts with it and how it interacts with the ingredients will make it work <em>better</em>.</p>
<p>I am advocating for the same care and attention to be paid to the tools that we use when we're working with technology. Do you know how the internet works? When you type something into that address bar, what happens? On your work computer, do you know how the filesystem is laid out? Do you know how things are organized? Do you know who else has access to your files? I'm not fear mongering here, truly. Sometimes another person having access is good! If you don't run your own backups, maybe someone else is helping you out. How does a computer understand sound? Images? How is a video different from a still image? How is it the same? All these questions are important to ask. Not just because the answers can be important, but because the answers can and will <em>make you better at using the tools</em>. If you know how things work, even a little bit, you'll be more given to understand the limitations and strengths of a given tool.</p>
<p>Asking questions is a skill that I feel we so often give up on and stop working to improve. We get our jobs, we get our expertise, and we stop poking at the edges of our knowledge. We stop learning. We just accept the solutions that are given to us. I don't want to encourage conspiracy or a disregard for expert perspective. I just want to bolster peoples' curiosity. I truly believe that asking questions <em>and being open to the answers</em> makes a person more compassionate, more capable, and more aware of the motives, tactics, and actions of others.  I feel like true earnestness is the next wave of culture on the internet and a core tenet of that is curiosity.</p>
<p>But now I think I'm rambling more than anything. I should leave it here. If you're curious about anything I've said here, please shoot me an email through the contact page!</p>
]]></description>
      </item>
    
      <item>
        <title>A Splash of Color and Git Branching</title>
        <link>https://tk-web.quest/blog/a-splash-of-color-and-git-branching/</link>
        <guid>https://tk-web.quest/blog/a-splash-of-color-and-git-branching/</guid>
        <pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>As I wrote about yesterday, TK-web has gone through a lot of changes this week. Thankfully, I believe I've landed on a good setup that I like, though it isn't perfect. Here's some highlights.</p>
<h1 id="rss" tabindex="-1">RSS <a class="heading-anchor" href="#rss"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The RSS link is no longer in the main menu. Instead, it will be at the top of each category page. The important one for most folks is going to be the All Posts page. Clicking the RSS icon will take you to the feed there.</p>
<h1 id="colors" tabindex="-1">Colors! <a class="heading-anchor" href="#colors"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The site's new color scheme is based on the <a href="https://github.com/rebelot/kanagawa.nvim">Kanagawa</a> colors that I've been using for Obsidian and in my code editor. The one place that this scheme doesn't reach is the code fences. Hugo uses Chroma for syntax highlighting, so code blocks like the one below have to use a Chroma style. That means I'm stuck with what <em>they</em> have implemented.</p>
<p>The colors are fine, but they aren't what I'd like. If anyone has any experience of forcing a hugo site to use colors that I want it to and has a good way to convert the kanagawa scheme to css for it, let me know.</p>
<p>I also haven't updated the theme for Letterbird yet, so the contact form clashes some. I'll get an update out to that soon-ish.</p>
<h1 id="legal" tabindex="-1">/Legal <a class="heading-anchor" href="#legal"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The <a href="https://tk-web.quest/legal">Legal</a> page is now hidden by default. I may eventually re-add it to the footer, but for now I'm not going to bother. The page itself still exists, of course, but I just don't have anything pointed to it.</p>
<h1 id="git-branches" tabindex="-1">Git Branches <a class="heading-anchor" href="#git-branches"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>While I was doing the big move, I forced myself to learn how Git Branches work and use them. I didn't learn everything, but it's fun to start to understand exactly how these things work. That said, it seems pretty easy for me to get my testing branch behind unless I delete and re-make it every time I merge a test commit, since some stuff, like new posts, are going to be pushed directly to the main branch. I guess I'll do more digging on it the next time I have a major update.</p>
]]></description>
      </item>
    
      <item>
        <title>Major Site Updates</title>
        <link>https://tk-web.quest/blog/major-site-updates/</link>
        <guid>https://tk-web.quest/blog/major-site-updates/</guid>
        <pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Okay, so a <em>lot</em> has happened to TK-web in the last like four hours. I'm going to go through them in order of importance:</p>
<h1 id="a-new-domain" tabindex="-1">A New Domain <a class="heading-anchor" href="#a-new-domain"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I was starting to get attached to tk-web.top, but I've started seeing some feedback saying that various adblockers or other website rating tools have been flagging the site as unsafe. The .top TLD has a pretty poor reputation, quite probably because they're so cheap to register and renew, so they're attractive to scammers. Even though I have the .top domain for another 4 years, I've decided to cut my losses... sort of. TK-web.top will continue to work basically as long as I own the domain. RSS will still work, etc. That timer is about four years long, so I'll be sure to post a reminder to use the new domain as we get closer. So, what <em>is</em> the new domain? well...</p>
<h2 id="tk-webquest" tabindex="-1">TK-web.quest <a class="heading-anchor" href="#tk-webquest"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>From here on, TK-web.quest will be the primary domain for this site. In the coming days I'll be moving the Letterbird conftact form to a new email address with the same domain. RSS also works on the new domain.</p>
<h1 id="a-new-name" tabindex="-1">A new name <a class="heading-anchor" href="#a-new-name"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>With the new TLD, I figured it was time to abandon the Taming Knots title I never truly loved. This one isn't a bulls-eye either, but it's closer to the mark. <strong>TK's Web Quest</strong> reflects my deepening love of the indie web and learning to do more with the internet in general. Self hosting, web hosting, and learning more in my new-ish professional field are big goals of mine, so it's only fitting that I go with this kind of name.</p>
<h1 id="a-new-look" tabindex="-1">A new look <a class="heading-anchor" href="#a-new-look"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>This one is more of a practical consideration. While I like the way my v2 theme looks quite a bit, that theme break Hugo's image processing functionality. I don't think my modifications would have broken it, but the fact remains. Images looked like ass on it.</p>
<p><img src="2026-04-29-13-01-27-image.png" alt=""></p>
<p>So, even though it looks super boring right now, I'm using the <a href="https://github.com/adityatelange/hugo-PaperMod/">PaperMod</a> theme. It's bland, it's boring, but it works and it's fast. I'm going to be fiddling with the theming over the coming days.</p>
]]></description>
      </item>
    
      <item>
        <title>Guidepost: A Self Hosting Introduction</title>
        <link>https://tk-web.quest/blog/guidepost-a-self-hosting-introduction/</link>
        <guid>https://tk-web.quest/blog/guidepost-a-self-hosting-introduction/</guid>
        <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>While I was compiling a <a href="https://tk-web.top/indieweb">list of resources</a> for getting into the indie web the other day, I noticed that every single guide I was finding on &quot;self hosting&quot; anything was pointing people towards a VPS. I realize that the context here is largely within the self hosting of <em>websites</em>, not other things, but I honestly feel like guiding someone through VPS setup when they've never hosted their own anything before is kind of a bad move? Like yes, you should <em>probably</em> host a website on a computer that either doesn't run anything else, or exists in a datacenter somewhere, but before going into that world, I feel like it's important to learn as much as you can about it so that you can make your mistakes <em>before</em> your webserver is in a datacenter, possibly hundreds of miles away rather than somewhere where it can be physically accessed. This guide is geared towards someone who can put together the minimum hardware required to self host in a way that fits within data protection standards. This is <strong>NOT</strong> the only way to do things. This is just the setup I have landed on after maintaining my own home server and self-hosting machine for about fifteen years.</p>
<h1 id="a-word-of-caution" tabindex="-1">A Word of Caution <a class="heading-anchor" href="#a-word-of-caution"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Hosting a public facing web service or website on your home internet connection and your home computer is <em>not always a great idea</em>. Especially if you start hosting a lot of services on the same computer and are mixing public and private services. From a security standpoint, you want to have important personal data and public facing data on different systems so that one is not accessible from the other or accidentally moved between them. For nearly everything we talk about here today, my recommendation, especially for beginners, is to focus on the services more aimed at content consumption rather than public facing stuff. I will also say that while I provide instructions here to make a private facing service available over the wider internet, my recommendation is to keep your services locked down and to only access them from outside your home network via a VPN like Tailscale.</p>
<p>Another note: The configuration I currently use <em>does rely on Cloudflare services</em> for out-of-home access so that a VPN isn't required. This is something I am not happy with and would like to avoid in the future, but I have had problems with the reliability of doing more of this work on my end of the hosting environment, so until I <em>can</em> move off of Cloudflare, I'm stuck. Again, for most people, a VPN like Tailscale is going to be the best move forward. I, unfortunately, cannot take advantage of that kind of option for reasons I won't get into here.</p>
<h1 id="hardware-laying-the-groundwork" tabindex="-1">Hardware: Laying the Groundwork <a class="heading-anchor" href="#hardware-laying-the-groundwork"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>A home server can really by anything you want or need it to be. Use an old laptop, a recovered enterprise workstation that's a decade old, a raspberry pi or build it yourself. The setup that I'm going to describe here does have ideal hardware requirements, so I'm going to specify those, but really you can make almost anything work with alternative operating systems. There's a couple reasons why I went the way I did and I'll enumerate those in the next section. For now, this is what I'm working with.</p>
<ul>
<li>
<p>CPU: Ryzen 5 1600</p>
</li>
<li>
<p>RAM: 16GB of DDR4 (2x8GB)</p>
</li>
<li>
<p>GPU: The cheapest shittiest discrete GPU I could find that was still compatible (required for the computer to boot at all)</p>
</li>
<li>
<p>Storage:</p>
<ul>
<li>3x SeaGate BarraCuda hard drives, 4TB each</li>
<li>1x PNY SATA 3 SSD, 256GB</li>
<li>1x Kioxia NVME SSD, 256gb <em>(Optional)</em></li>
</ul>
</li>
<li>
<p>Case: a $20 Rosewill number. Terrible to build in, not attractive, but cheap and came with fans.</p>
</li>
<li>
<p>PSU: Silverstone Focus series PSU, 550W</p>
</li>
</ul>
<p>You'll note that this build is all consumer desktop parts. Nothing is special. A server is just a computer. If you want to follow my path as close as possible, you don't need to get the exact same parts as me. In fact, there's some significant upgrades you could make for not much money. The CPU in particular is pretty aged by this point. The important thing here is to get three storage drives that are all the <em>same model and capacity as each other</em> and a <em>separate</em> drive for the operating system. For the fourth drive, an SSD will make the system start up faster. It's important for the three bulk storage drives to all be identical. The filesystem we're going to be using, ZFS, works best on drives of the same size and model. It's just more reliable and if you're going to be self hosting anything, reliability is going to be the biggest difference between enjoying your services and abandoning them. The case and GPU I got specifically because they were <em>dirt</em> cheap. I didn't care about quality or ease of use here. They exist solely to make the computer run and not be a bunch of loose components in a pile on the floor. In terms of RAM, I do feel that limitation sometimes, but for most people, 16GB is enough. More is always better, but with the RAM shortage, steer clear of huge kits. The CPU in mine is a hand-me-down from my main desktop PC. The power supply is the only thing I actually splurged on. Having a dead silent PSU is super nice. It's less important now that the server isn't in the same room as me, but I'm still glad I got it. A higher tier PSU that is more power than you need is often able to be more efficient with that power, so it's a good long-term investment.</p>
<h1 id="truenas-community-edition-the-second-layer" tabindex="-1">TrueNAS Community Edition: The Second Layer <a class="heading-anchor" href="#truenas-community-edition-the-second-layer"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I have run my home server on Windows Server, <a href="https://ubuntu.com/download/server">Ubuntu Server</a>, and <a href="https://unraid.net/">Unraid</a> in the past, but for a long time now, I've been running <a href="https://www.truenas.com/truenas-community-edition/">TrueNAS Community Edition</a> very happily. While Unraid might allow for hard drives of varied size, I found TrueNAS to be significantly more reliable. A word of caution: We <em>are</em> bringing a sledgehammer to a nail with this one. Most people don't need something this powerful. However, I like that it gives you a lot of room to grow and the flexibility of a custom config, even though the system does a lot to hold your hand through setting up many services. Another popular option for a home server is <a href="https://www.proxmox.com/en/">ProxMox</a>. ProxMox is more flexible, but is also very complicated to set up, so I'd still recommend TrueNAS Community Edition.</p>
<p>TrueNAS installs like a regular OS, then hosts a webserver available on ports 80 and 443 of the host machine. You should be able to connect by simply typing in your machine's hostname or iP into a web browser anywhere on your home network, so you can run it headless (with no mouse, keyboard, or monitor) after the first boot. I won't go into the full setup here. The documentation and guides widely available on the internet are good resources. I unfortunately don't have the ability to start over from scratch to properly describe the process, but I will hit a few things that aren't automatically set up by default that are really useful to have.</p>
<p><img src="truenas-ui.png" alt="" title="The TrueNAS Dashboard"></p>
<h2 id="data-protection-and-redundancy" tabindex="-1">Data Protection and Redundancy <a class="heading-anchor" href="#data-protection-and-redundancy"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>The whole reason we used three hard drives in the hardware section comes up here. TrueNAS uses a file system called ZFS. ZFS has built in software RAID capabilities. RAID stands for <strong>R</strong>edundant <strong>A</strong>rray of <strong>I</strong>ndependent <strong>D</strong>isks. The entire description of RAID is out of the scope of this post, but what we are setting up is called RAID Z1. This is a way of combining your three hard drives into one big storage pool. The filesystem sees three separate drives that it balances and duplicates the data on such that any one hard drive can fail and you won't lose any data. Get a new drive and replace your dead one, let the filesystem rebuild the pool (called resilvering) and you are back to having redundancy again. If a second drive fails, though, you're up the creek. Still, when you compare to getting a single big drive, it's a nice security blanket. On the operating system and application side of the equation, you'll get a single big pool of storage.</p>
<p>To make your data even more resilient, you'll want to set up backups in the <strong>Data Protection</strong> tab. <em>RAID is not a backup system</em>. it's a redundancy system. ZFS can snapshot datasets as long as they don't have any child datasets inside them. This will make more sense later, but for now, just know that for datasets that you can create snapshots of, it's worth doing because it will make your backup tasks faster and use less storage and bandwidth. For a backup provider, I went with <a href="https://www.storj.io/">Storj</a>. It's cheaper than basically any cloud storage provider, Backblaze, or AWS. Performance has been fine as a backup-only system, and it integrates well with the TrueNAS UI. There are self hosted options for this as well, but they're a bit complicated and require setting up multiple machines, so I'm not going to go into those. Basically any S3 style storage provider is a good endpoint for your backups. This storage is slow, but cheap which fits the backup use case perfectly.</p>
<p>While you're here, set up a Scrub Task for once a week on your pool(s) and Periodic S.M.A.R.T. Tests on all of the disks. I do a long test twice a month and a short test once a week. The scrub task is a maintenance task for the ZFS filesystem. It keeps things running smoothly. The <strong>S</strong>elf-<strong>M</strong>onitoring, <strong>A</strong>nalysis, and <strong>R</strong>eporting <strong>T</strong>echnology tests use information the hard drives in your system gather and report themselves in order to find bad sectors or other problems before the drives fail. They aren't foolproof, but should give you an early warning that a drive is about to die with enough time for you to get a replacement ready.</p>
<p><img src="data-protection.png" alt="" title="TrueNAS backup"></p>
<p>Finally, you'll want to stop by the <strong>System &gt; General Settings</strong> section to set up email. You can do this with a free gmail account or many other email providers. Set it up and the server can send mail as the account you set. Then, go to <strong>Settings &gt; Alert Settings</strong> and set up a new Alert service. If you pick e-mail, then put your email in the box, the server will send you an email from yourself anytime an alert on the server requires attention. You can set SMART test failures to be alerts so that you can stay on top of your drives and make sure you get replacements in the case of imminent failures. You can set various actions to be different alert levels, then choose the appropriate level for the notifications you want. I use mostly defaults and have the server send me a notification on any Warning level alert or greater.</p>
<h2 id="files-datasets-and-shares" tabindex="-1">Files, Datasets, and Shares <a class="heading-anchor" href="#files-datasets-and-shares"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Okay, so now you've got a server running... itself and that's about it. What can we do with it? Well, quite a lot, actually, but we have to wade in slowly and build on early concepts to make our lives easier later. We'll start with</p>
<h3 id="datasets" tabindex="-1">Datasets <a class="heading-anchor" href="#datasets"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>You can think of a dataset as a folder. It's more complicated than that, but generally, the basic thing a dataset does is organize your files. Datasets can have any number of child datasets inside them, and are displayed as a tree in the Dataset view. They walk like folders, they talk like folders. It's okay to think of them generally as folders. Go ahead and make a top level dataset in the <strong>Datasets</strong> menu. Keep in mind, though, that this is a Linux system, so files and folders are case sensitive! Datasets are no exception. <code>Home</code> and <code>home</code> are different things. So, for my example, I'm only ever going to use lower case for my names and if something is multiple words, I'll separate them with a hyphen. So for my top level dataset, I'll call it <code>homeserver</code>. When you make a dataset, you can specify what kind of usage you expect it to see. These options <em>only</em> change the <strong>A</strong>ccess <strong>C</strong>ontrol <strong>L</strong>ist or ACL for the dataset. Basically, what users can and cannot access the files and folders within the dataset. For your top level, set it to <strong>Generic</strong>. This means only the root user can access anything inside by default. Inside my main dataset, I have a few others. The main tree looks like this</p>
<pre><code>homeserver/
  applications/
  backups/
  cloud-data/
  homes/
  ix-applications/
  media/
</code></pre>
<p><code>applications</code> is where our apps live. Not all apps have a built in version, so I'm going to recommend manually making datasets for each app's storage needs as we go, just to keep everything consistent between the automatic apps and the manual ones.</p>
<p><code>backups</code> is where I host a SMB share for my desktop PC to back up to. You don't need this if you don't want it. I personally prefer this setup. Another option is to make user home directories inside the <code>home</code> dataset and put their backups in their home folder. Since I only support two users, myself included, this is not necessary.</p>
<p><code>cloud-data</code> is called such because it started life as a dumping ground and backup for our Google Drive storage. Eventually it took over that same function, so cloud data it stays.</p>
<p><code>homes</code> is where users' home directories will live. You don't need home directories, but sometimes it's useful for SSH (as an example) or other services.</p>
<p>The <code>ix-applications</code> dataset is going to be required by TrueNAS. It may have even already made it when you first set up the storage pool. I don't remember. It's where the system will store docker images for applications you install later.</p>
<p><code>media</code> is where I store all my media. It's separate to make backing it up separately easier and also because several applications use it. If I were starting over, I might combine it with <code>cloud-storage</code> and  call it <code>bulk-storage</code> or something.</p>
<p><img src="truenas-datasets.png" alt="" title="TrueNAS storage layout"></p>
<h3 id="shares" tabindex="-1">Shares <a class="heading-anchor" href="#shares"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>A space for files is all well and good, but without a way to manage files on the server, you're going to have a bad time. TrueNAS supports a few methods of access by default.</p>
<h4 id="samba" tabindex="-1">Samba <a class="heading-anchor" href="#samba"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h4>
<p><strong>S</strong>erver <strong>M</strong>essage <strong>B</strong>lock, or SMB is the standard that Windows devices use to share files and printers over a network. On Linux and MacOS, the program that interfaces with these kinds of shares is called Samba, so Samba has become synonymous with SMB. TrueNAS supports SMB shares natively. Let's head over to the <strong>Shares</strong> screen and add a new one.</p>
<p>The Add SMB Share pane will give you some basic options. I would recommend setting your ACL up via the <strong>Dataset</strong> section and include permissions for SMB users there before making the share. If you need to make a new user, you can do so under <strong>Credentials &gt; Users</strong>. Just make sure you have the SMB User checkbox checked. This will ensure a SMB password is set for the user account.</p>
<h4 id="nfs" tabindex="-1">NFS <a class="heading-anchor" href="#nfs"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h4>
<p><strong>N</strong>etwork <strong>F</strong>ile <strong>S</strong>ystem shares are the default sharing paradigm for Unix operating systems (Linux and Mac OS, mostly) and work a little differently. Since both ends are expected to use regular users on the system, permissions and sharing are handled the same way permissions would be on the host system. I personally haven't had as muhc luck with these, but you might have more experience with them.</p>
<h4 id="others" tabindex="-1">Others <a class="heading-anchor" href="#others"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h4>
<p>I do have a preferred way to handle shared files in my server and that's through <a href="https://github.com/9001/copyparty">Copyparty</a>. Copyparty hosts a WebDAV server and a web UI for that server. I use Copyparty for a lot more than file shares, but file shares are one thing it's pretty good at! You can install Copyparty in the <strong>Apps</strong> page of your TrueNAS server.</p>
<p><img src="copyparty.png" alt="" title="CopyParty"></p>
<h2 id="applications" tabindex="-1">Applications <a class="heading-anchor" href="#applications"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>TrueNAS has three ways of running applications. One is to use their built in <strong>Apps</strong> catalog and install them there. Another is to use the <strong>Virtual Machines</strong> section to run another OS inside your NAS server. The third is their new <strong>Containers</strong> section. I haven't used that section at all since it showed up, but it's the biggest contender for a thing that will make this guide obsolete. It might be a competitor to Podman or other Docker GUIs. I just haven't touched it at all. For the sake of this guide, we're going to stick to <strong>Apps</strong></p>
<p>From here, you can browse the catalog and install anything you like. Some things to keep in mind, though.</p>
<ul>
<li>When possible, always make the datasets for your application data yourself by switching all data options away from <strong>ix volume</strong> to <strong>path on the host system</strong> and create a new dataset under <code>homeserver/applications</code>.</li>
<li>Pay attention to the ACLs on your new datasets. If the user that the app runs as can't read or write to the dataset you make, you won't be able to run it. Thankfully most apps allow you to check a box to ensure the ACL is correct. Most apps run as an <code>apps</code> user, ID <code>568</code> by default.</li>
<li>You can also add extra storage to a given app. For example, I might have Jellyfin store its application data in a new dataset in <code>homeserver/applications/jellyfin/data</code> but I'll click the &quot;Add additional storage&quot; button at the bottom of the install screen to add media storage to the app, setting the host path <code>/homeserver/media/video</code> to mount as <code>/hs-media</code> inside the container. Now, inside Jellyfin, I can add <code>/hs-media/tv</code> and <code>/hs-media/movies</code> as media libraries without forcing all of my media to exist in <code>/homeserver/applications/jellyfin/data/media/tv</code> etc. This makes using the same files in multiple apps <em>WAY</em> easier.</li>
<li>You can manually install any docker app that uses docker compose. From <strong>Applications</strong>, click <strong>Discover Apps</strong>, then the <strong>3-dot menu at the top right</strong> then <strong>Install via YAML</strong>. This will open a little text window where you can dump a Docker Compose file to create an app. Note that the default locations and ports are <em>probably</em> not going to work with your TrueNAS installation of the same app, so definitely read the documentation on the app specifically, as well as familiarize yourself with <a href="https://docs.docker.com/compose/">docker compose's documentation</a>.</li>
</ul>
<p>Each app is going to have slightly different options and needs, so pay attention as you make them. The differences are big enough that I can't really go over all of them here, but I will be going over an example of my complete setup for this site down below. Once you finish setting up the application, you'll see it show up in your Apps list. If it's something offered by default by TrueNAS, then there will be a WebUI button in the app details pane with the app selected. You can click that to finish any in-app setup needed or access your applications from inside your home network.</p>
<p>Since each app has its own specific config, I think I'll leave this part of the guide as it is. If you want help setting up any specific application that is in my list here, please shoot me an email <a href="https://tk-web.top/contact">via the contact form</a>. Before I leave you, though, let's go through a complete example: This website!</p>
<h1 id="hosting-a-blog-on-truenas-scale" tabindex="-1">Hosting a Blog on TrueNAS Scale <a class="heading-anchor" href="#hosting-a-blog-on-truenas-scale"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<h2 id="prerequisites" tabindex="-1">Prerequisites <a class="heading-anchor" href="#prerequisites"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This setup assumes that you have or are willing to get a few things...</p>
<ul>
<li>A <a href="https://www.cloudflare.com/">Cloudflare</a> account (necessary for the tunnel)</li>
<li>A website you want to publish (my example will be a blog made with <a href="https://gohugo.io">Hugo</a></li>
<li>Some knowledge of how Git works (I'll do some light explaining of the commands we use)</li>
<li>A working TrueNAS server</li>
<li>A Domain Name that you own (so that you can manually set up the DNS.)</li>
</ul>
<h2 id="name-server-i-hardly-knew-her" tabindex="-1">Name Server? I Hardly Knew Her <a class="heading-anchor" href="#name-server-i-hardly-knew-her"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>The very first thing you're going to want to do is set up your domain in Cloudflare. They make it pretty simple. You'll just need to enter the Cloudflare name servers in your domain registrar's setup. Once you have Cloudflare set up as your DNS provider, we can dig the tunnel.</p>
<h2 id="diggy-diggy-hole" tabindex="-1">Diggy Diggy Hole <a class="heading-anchor" href="#diggy-diggy-hole"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Cloudflare Tunnels are a means to bypass your own firewall and NAT by hosting a client application in your home infrastructure and telling Cloudflare where traffic should go based on the domain or subdomain entered. As can be assumed, this is quite powerful and useful, but keep in mind that HTTPS, the default encryption on the internet, is administered by Cloudflare in this case. Basically, they are the ones holding your encryption keys here, so they can log all of the traffic that goes through the tunnel. Like I said up top, I don't <em>like</em> using them, but they are a necessary evil in my setup, and thus in my example.</p>
<p>First, set up a new tunnel in the Cloudflare UI. It'll be in <strong>Protect &amp; Connect &gt; Networking &gt; Tunnels</strong>. As a part of the process, it will ask you to start the other end of the tunnel. To do so, click the <strong>Docker</strong> Operating System option and copy the command. Paste it into a text editor. It should look something like this:</p>
<pre class="language-sh"><code class="language-sh"><span class="token function">docker</span> run cloudflare/cloudflared:latest tunnel --no-autoupdate run <span class="token parameter variable">--token</span> eyJhIjoiOWY2YTIzZTFlZWYyMGJjZTk5ODNhZmUwMTJlNTM0OWQiLCJ0IjoiZWVhMjI5OTEtNGU3Zi00ZDg2LWI4NDYtNjc3N2I5ZTJkMjQ1IiwicyI6Ik1qVTJaVFopT0RZdE9UZ3hNQzAIImpkbExXSTNaRGN0WWpabU5UUTNaREJtTnpsaiJ9</code></pre>
<p>We don't need anything except the actual token, so delete everything up to and including the <code>--token</code> text, then re-copy the token and go back to your TrueNAS server's <strong>Apps</strong> page. Click <strong>Discover Apps</strong> then search for <code>cloudflared</code> and click <strong>Install</strong>. Paste your token into the <strong>Tunnel Token</strong> box, then scroll down and click <strong>Install</strong>. The default settings for everything else are fine. Once the app shows a green <strong>Running</strong> status, flip back over to your Cloudflare Tunnel setup tab and finish the basic setup. We'll come back to this, so for now just leave it be.</p>
<h2 id="build-a-nest" tabindex="-1">Build a Nest <a class="heading-anchor" href="#build-a-nest"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Let's build the environment so that the webserver will work. Go to your TrueNAS server's <strong>Credentials &gt; Users</strong> page and make a new user. You can call it whatever you want. Then, generate a new RSA encryption keypair. We'll need this for deploying the site. RSA encryption keys are pretty standard, so creating a keypair is well documented on all platforms. Open the settings for your new user and paste the Public key into the &quot;Authorized Keys&quot; section. Make sure it starts with <code>ssh-rsa</code>. You'll also want to set the user's shell to something reasonable. I use <code>zsh</code>.</p>
<p>Now that we have a user, go over to the <strong>Datasets</strong> page and make a new Dataset in the <code>applications/</code> one. We'll call this one <code>apache</code>. Open the <strong>ACL Editor</strong> and add your new user to the access list with &quot;Full Control&quot; access. Also make sure you add the Apps user with full control.</p>
<p>Finally, let's install httpd, which is an apache webserver in a docker container. Go to <strong>Apps &gt; Discover New Apps</strong> again, but this time, click the <strong>3 dot menu</strong> then <strong>Install via YAML</strong>. Set a name for your new app, then in the custom config, we're going to tell it to install httpd.</p>
<pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">services</span><span class="token punctuation">:</span>
  <span class="token key atrule">apache</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> tk<span class="token punctuation">-</span>web
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
<span class="token comment">## Sets the user ID and group ID. Feel free to set these to the UID/GID of your new user account</span>
      <span class="token punctuation">-</span> PUID=568 
      <span class="token punctuation">-</span> GUID=568
<span class="token comment">## Set this to your timezone</span>
      <span class="token punctuation">-</span> TZ=America/Denver
<span class="token comment">## This tells Docker what image to use. It'll automatically pull from docker hub</span>
    <span class="token key atrule">image</span><span class="token punctuation">:</span> httpd<span class="token punctuation">:</span>latest
<span class="token comment">## The first port is the port that you'll give Cloudflare for the service. Port 80 is what http traffic uses.</span>
    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token string">'10000:80'</span>
<span class="token comment">## This sets up the persistent storage. Apache serves the website via the htdocs folder, so we're making a link between that and the dataset we just set up.</span>
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> /mnt/homeserver/applications/apache/public/<span class="token punctuation">:</span>/usr/local/apache2/htdocs</code></pre>
<p>Once everything is set to your liking, save it and TrueNAS will start building the app.</p>
<h2 id="deploy-the-site" tabindex="-1">Deploy the Site! <a class="heading-anchor" href="#deploy-the-site"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Go to Cloudflare's tunnels UI and make a new Published Application Route. Set it to be your domain/subdomain of choice and tell Cloudflare to send traffic to <code>http://&lt;TrueNAS server IP&gt;:10000</code>. Now, you have a couple options for actually getting your site uploaded to the server.</p>
<h3 id="sharing-is-caring" tabindex="-1">Sharing is Caring <a class="heading-anchor" href="#sharing-is-caring"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>You can make the <code>applications/apache</code> dataset a share via SMB or NFS. Just make a new folder in there called <code>public</code> and dump your site there. If you're using Hugo, the <code>public</code> directory is made and updated whenever you run the <code>hugo</code> command. It'll be in the root of your Hugo project directory.</p>
<h3 id="sshe-sells-sea-sshells" tabindex="-1">SSHe Sells Sea SSHells <a class="heading-anchor" href="#sshe-sells-sea-sshells"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>You have an authorized SSH user already. You can transfer files to the server using <code>scp</code> or <code>sftp</code>. Just remember that those protocols don't delete old files. They only copy new files and overwrite old ones of the same name. You can build a little script to run Hugo, then deploy the site immediately after, like this:</p>
<pre class="language-sh"><code class="language-sh"><span class="token shebang important">#!/bin/bash</span>
<span class="token assign-left variable">CWD</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">pwd</span><span class="token variable">)</span></span>
<span class="token builtin class-name">cd</span> /home/<span class="token environment constant">USER</span>/Projects/hugoblog
hugo
<span class="token function">scp</span> <span class="token parameter variable">-r</span> public Remote-User@Server-IP:/mnt/homeserver/applications/apache
<span class="token builtin class-name">cd</span> <span class="token variable">$CWD</span></code></pre>
<p>This script can be run from anywhere in the system. It saves your current working directory to a variable, goes to the project directory, runs  <code>hugo</code>, then copies the files to the server. If you add the SSH key to your user account, TrueNAS won't ask for your user's password.</p>
<h3 id="sync-the-battleship" tabindex="-1">Sync the Battleship <a class="heading-anchor" href="#sync-the-battleship"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>You can also use Rsync to copy stuff over. The command will look mostly the same as above, but you'll want to use some options. <code>-vzr --delete</code> specifically. These will copy all files, even in subdirectories while maintaining the structure and compress the files in transit. It will also delete files that aren't in the source directory. Your script will look something like this now.</p>
<pre class="language-sh"><code class="language-sh"><span class="token shebang important">#!/bin/bash</span>
<span class="token assign-left variable">CWD</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">pwd</span><span class="token variable">)</span></span>
<span class="token builtin class-name">cd</span> /home/<span class="token environment constant">USER</span>/Projects/hugoblog
hugo
<span class="token function">rsync</span> <span class="token parameter variable">-zr</span> <span class="token parameter variable">--delete</span> public Remote-User@Server-IP:/mnt/homeserver/applications/apache
<span class="token builtin class-name">cd</span> <span class="token variable">$CWD</span></code></pre>
<h3 id="go-on-git" tabindex="-1">Go on, Git <a class="heading-anchor" href="#go-on-git"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>This is a more advanced option, but does allow you to push updates to your blog from anywhere. It'll require a code forge that supports Actions, like Forgejo, Gitea, GitLab, or GitHub. I use a self-hosted Forgejo server. I'll skip describing that setup, since it's a little bit more involved. I highly recommend it, though! It was a fun and rewarding experience. Here's the general setup for the repository:</p>
<ul>
<li>Make a new, empty repository then, in a new empty folder on your computer, <code>git pull</code> it so that you can initialize it on your system.</li>
<li>Copy your Hugo project directory into the git repo, so that the root of the git repo is your hugo project's root directory.</li>
<li>Use <code>git commit -A</code> to add all files to a new commit, then <code>git commit -m &quot;initial commit&quot;</code> to set the commit message and finally <code>git push</code> to push your changes to the repo. This gives you a baseline in case something goes wrong.</li>
<li>In the root of your git repo, add the correct folders for an Action, as well as an empty action file. In my case, it's <code>.forgejo/workflows/action.yaml</code>.</li>
<li>In the repository settings, enable Actions and make sure a Runner is available. We'll be using Docker for this one.</li>
<li>Add Variables for <code>USER</code> (your SSH user on TrueNAS), <code>IP</code> (The IP of your server) and a Secret, <code>SSHKEY</code> (that holds the private key of the RSA key pair you made earlier)</li>
</ul>
<p>Then, open the yaml file you made earlier in a text editor and put in our Action</p>
<pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">name</span><span class="token punctuation">:</span> deploy
<span class="token comment">## This allows the action to run whenever a new commit is pushed to the main branch</span>
<span class="token key atrule">on</span><span class="token punctuation">:</span>
  <span class="token key atrule">push</span><span class="token punctuation">:</span>
    <span class="token key atrule">branches</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> main
<span class="token comment">## And when you manually or automatically call the workflow to run</span>
  <span class="token key atrule">workflow_dispatch</span><span class="token punctuation">:</span>

<span class="token key atrule">jobs</span><span class="token punctuation">:</span>
  <span class="token key atrule">deploy</span><span class="token punctuation">:</span>
    <span class="token key atrule">runs-on</span><span class="token punctuation">:</span> docker
    <span class="token key atrule">container</span><span class="token punctuation">:</span>
<span class="token comment">## This is the official Hugo image for deploying sites made using it.</span>
      <span class="token key atrule">image</span><span class="token punctuation">:</span> ghcr.io/gohugoio/hugo<span class="token punctuation">:</span>latest
    <span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token comment">## This step makes a working copy of the repository that the runner can work on.</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Pull repo
        <span class="token key atrule">uses</span><span class="token punctuation">:</span> actions/checkout@v4
        <span class="token key atrule">with</span><span class="token punctuation">:</span>
<span class="token comment">## This is required for hugo themes to work properly</span>
          <span class="token key atrule">submodules</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
          <span class="token key atrule">fetch-depth</span><span class="token punctuation">:</span> <span class="token number">0</span>
<span class="token comment">## This runs the Hugo command with --minify to make the code smaller and lighter</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> build site
        <span class="token key atrule">run</span><span class="token punctuation">:</span> hugo <span class="token punctuation">-</span><span class="token punctuation">-</span>minify
<span class="token comment">## This calls an additional action that will copy our site to the server</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Deploy site with Rsync
        <span class="token key atrule">uses</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//github.com/Burnett01/rsync<span class="token punctuation">-</span>deployments@v8
        <span class="token key atrule">with</span><span class="token punctuation">:</span>
<span class="token comment">## These options tell Rsync to be Verbose, Compress during transit, copy recursively, and delete files that don't exist in the source.</span>
          <span class="token key atrule">switches</span><span class="token punctuation">:</span> <span class="token punctuation">-</span>vzr <span class="token punctuation">-</span><span class="token punctuation">-</span>delete
          <span class="token key atrule">path</span><span class="token punctuation">:</span> <span class="token string">"public/"</span>
          <span class="token key atrule">remote_path</span><span class="token punctuation">:</span> <span class="token string">"/mnt/homeserver/applications/apache/public/"</span>
          <span class="token key atrule">remote_host</span><span class="token punctuation">:</span> $<span class="token punctuation">{</span><span class="token punctuation">{</span> vars.IP <span class="token punctuation">}</span><span class="token punctuation">}</span>
          <span class="token key atrule">remote_user</span><span class="token punctuation">:</span> $<span class="token punctuation">{</span><span class="token punctuation">{</span> vars.USER <span class="token punctuation">}</span><span class="token punctuation">}</span>
          <span class="token key atrule">remote_key</span><span class="token punctuation">:</span> $<span class="token punctuation">{</span><span class="token punctuation">{</span> secrets.SSHKEY <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre>
<p>Now, make a new commit with your action.yaml and make sure the action ran successfully! You can now push an update to your blog anytime anywhere just by writing a new markdown file and adding it to the repo. Since you already have your httpd container and Cloudflare tunnel up, you should be able to go to your domain and see the site live as long as the action completes successfully.</p>
<p><img src="copyparty.png" alt="" title="Forgejo Success"></p>
]]></description>
      </item>
    
      <item>
        <title>Emdash: Don&#39;t use This Thing</title>
        <link>https://tk-web.quest/blog/emdash-dont-use-this-thing/</link>
        <guid>https://tk-web.quest/blog/emdash-dont-use-this-thing/</guid>
        <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><strong>A Note:</strong> <em>I currently use Cloudflare for my security and CDN. I'm looking at options to replace it, but I don't have a great idea of what I want to use instead yet. I still think that Cloudflare should not have as big of a footprint on the web as it does, but it does make it very easy to get started.</em></p>
<p>Cloudflare officially unveiled a new, self-hostable, open source content management system last week. <a href="https://github.com/emdash-cms/emdash">Emdash</a> is their attempt to take on Wordpress, but there's a lot to unpack here and it's <em>not good</em>. Emdash intends for itself to be a complete frontend to work exclusively with Astro, one of the newer static site generators out there. The exclusivity is the first red flag. Tools should be about making your life easier, but not at the expense of your freedom. Your data and your site should be as portable as possible, but emdash is built to lock you in. But first, how did Emdash come about? Why, with the power of AI of course!</p>
<blockquote>
<p>The cost of building software has drastically decreased. We recently using AI coding agents. But for the past two months our agents have been working on an even more ambitious project: rebuilding the WordPress open source project from the ground up.</p>
</blockquote>
<p><em>From Cloudflare's <a href="https://blog.cloudflare.com/emdash-wordpress/">announcement post</a></em></p>
<p>That's right. They are openly lauding the idea that they told AI agents to rebuild WordPress from the ground up using Astro as the static site framework. Why would they go to such lengths?</p>
<blockquote>
<p>WordPress’ plugin architecture is fundamentally insecure. 96% of security issues for WordPress sites originate in plugins.</p>
</blockquote>
<p>Ah yes, Security. Using notoriously insecure development practices to ensure a more secure ecosystem. Great. Well, at least you can run it on your own hardware! Finally, an open source SSG that you can run on your own hardware or any platform you like that has security as a major priori– what? Oh, silly you. Even if you deploy on Netlify, your home server, Nekoweb, or whatever else, you're gonna need a subscription to Cloudflare. You didn't think security was <em>free</em> did you?</p>
<blockquote>
<p>EmDash depends on Dynamic Workers to run secure sandboxed plugins. Dynamic Workers are currently only available on paid accounts. Upgrade your account (starting at $5/mo) or comment out the worker_loaders block of your wrangler.jsonc configuration file to disable plugins.</p>
</blockquote>
<p><em>From Emdash's GitHub page</em></p>
<p>So security is the number one point, but you're generating the code with AI and also charging people for the privilege to run plugins <em>at all</em>? Woof. Great job. Just stellar work. If you're interested in writing a blog and using a static site generator, you <em>do not need</em> a CMS. It helps, but there's great ways to build and deploy a site without it and you may just learn something!</p>
]]></description>
      </item>
    
      <item>
        <title>Forejo Deploy Activate!</title>
        <link>https://tk-web.quest/blog/forejo-deploy-activate/</link>
        <guid>https://tk-web.quest/blog/forejo-deploy-activate/</guid>
        <pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>One of the things I lamented as I moved my site <a href="https://tk-web.top/posts/2026-02-22-selfhosted/">away from cloudflare pages</a> was that there wasn't a good way for me to run site updates like I had been doing through Github Actions when TK-web first moved <a href="https://tk-web.top/posts/2025-05-16-newsite/">off of Pika</a> nearly a year ago. One of the things Brendon over at <a href="https://wavelengths.online/">Wavelengths</a> has said a few times is that the process of making stuff for Wavelengths is reducing friction as much as humanly possible. Being able to take an idea from concept to published as fast as possible is a very important thing for him. My changes away from Pika and away from Github have both increased my friction. Instead of just going to a website and writing, I was suddenly spending more time with a draft &quot;ready&quot; before I could post it. This change is the first step back towards a smooth posting experience.</p>
<p>As of this morning, I now have a Forgejo Action that publishes my site anytime there's an update, just like how Github Actions worked before. Here's the workflow step-by-step.</p>
<ul>
<li>I write a post in MarkText, my current markdown editor of choice (I use the <a href="https://github.com/Tkaixiang/marktext">Tkaixiang</a> fork.)</li>
<li>I run the commands to push a commit to my TK-web repo on my self-hosted <a href="https://forgejo.org">Forgejo</a> instance.
<ul>
<li>Forgejo sees the <code>publish.yaml</code> in the <code>.forgejo/workflows</code> folder on commit and sends the action to Frank, my self-hosted Forgejo Runner.
<ul>
<li>Frank spins up the official <a href="https://github.com/gohugoio/hugo/pkgs/container/hugo">Hugo Docker image</a> and copies the repo to a working directory</li>
<li>Frank runs <code>hugo -minify</code> to generate a minified version of the site and stores the current date and time into a variable.</li>
<li>Frank sets up ssh for itself, importing SSH keys from Actions Secrets I have set up ahead of time.</li>
<li>Frank copies the <code>../public/</code> directory to my webserver over an ssh connection, setting the output name to the date and time variable it set earlier.</li>
<li>Finally, frank updates a symlink on the webserver to point at the newly copied directory.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>The setup, as you can see, still requires the friction of sending a github commit, but, critically, my forgejo instance is available outside of my home network, so I can commit from anywhere! Let's look at the action:</p>
<pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">name</span><span class="token punctuation">:</span> deploy
<span class="token key atrule">on</span><span class="token punctuation">:</span>
  <span class="token key atrule">push</span><span class="token punctuation">:</span>
    <span class="token key atrule">branches</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> main
  <span class="token key atrule">workflow_dispatch</span><span class="token punctuation">:</span>

<span class="token key atrule">jobs</span><span class="token punctuation">:</span>
  <span class="token key atrule">deploy</span><span class="token punctuation">:</span>
    <span class="token key atrule">runs-on</span><span class="token punctuation">:</span> docker
    <span class="token key atrule">container</span><span class="token punctuation">:</span>
      <span class="token key atrule">image</span><span class="token punctuation">:</span> ghcr.io/gohugoio/hugo<span class="token punctuation">:</span>latest
    <span class="token key atrule">steps</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">uses</span><span class="token punctuation">:</span> actions/checkout@v4
        <span class="token key atrule">with</span><span class="token punctuation">:</span>
          <span class="token key atrule">submodules</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
          <span class="token key atrule">fetch-depth</span><span class="token punctuation">:</span> <span class="token number">0</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> get date
        <span class="token key atrule">id</span><span class="token punctuation">:</span> date
        <span class="token key atrule">run</span><span class="token punctuation">:</span> echo "<span class="token punctuation">:</span><span class="token punctuation">:</span>set<span class="token punctuation">-</span>output name=date<span class="token punctuation">:</span><span class="token punctuation">:</span>$(date +'%Y%m%d%H%M%S')"
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> build site
        <span class="token key atrule">run</span><span class="token punctuation">:</span> hugo <span class="token punctuation">-</span><span class="token punctuation">-</span>minify
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> setup ssh
        <span class="token key atrule">run</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
          mkdir -p ~/.ssh
          chmod 0700 ~/.ssh
          echo "${{ secrets.SSHKEY }}" >~/.ssh/id_rsa
          chmod 0600 ~/.ssh/id_rsa
          echo "{{ secrets.HOSTS }}" >> ~/.ssh/known_hosts
          chmod 0600 ~/.ssh/known_hosts</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> deploy site
        <span class="token key atrule">run</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
          scp -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i ~/.ssh/id_rsa -r public ${{ vars.USER }}@${{ vars.IP }}:/mnt/homeserver/applications/apache/${{ steps.date.outputs.date }}</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> update symlink
        <span class="token key atrule">run</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
          ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i ~/.ssh/id_rsa ${{ vars.USER }}@${{ vars.IP }} "ln -sfn /mnt/homeserver/applications/apache/${{ steps.date.outputs.date }} /mnt/homeserver/applications/apache/public"</span></code></pre>
<p>Not too complicated, once I got the SSH keys working. Setting up a limited user for the web server was a little tricky thanks to TrueNAS's gui-forward approach. Tim Howard's <a href="https://home.futuretim.io/posts/hugo_build_and_post/">post</a> was very helpful for me in getting this set up.</p>
<p>The next hole I'd like to fill in this setup is finding a good CMS or something that can handle the git commit for me. Especially if it's local only or self-hosted. If anyone has recommendations, <a href="https://tk-web.top/contact">please let me know</a>!</p>
]]></description>
      </item>
    
      <item>
        <title>The holes in my Self-Hosting setup</title>
        <link>https://tk-web.quest/blog/the-holes-in-my-self-hosting-setup/</link>
        <guid>https://tk-web.quest/blog/the-holes-in-my-self-hosting-setup/</guid>
        <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>For a few years now, I've been self-hosting a number of applications. This accelerated a lot in recent years as the quality of the corporate-owned and operated alternatives to self hosted services became more and more enshittified. Now, it feels like some self-hosted applications are best-in-class solutions as alternatives become more riddled with ads, are constantly spying on you, and are voluntarily bloating themselves with the toxin known as &quot;Generative AI.&quot; My set of self-hosted services is fairly comprehensive, but there's still problems, gaps, and things I would love to add that either already exist and I just haven't added them yet, or exist in a flawed way that prevents me from adding them. Here's a comparison between the stuff I use and like and the gaps that I would like to fill in the future.</p>
<h1 id="files-storage-and-basic-computing" tabindex="-1">Files, Storage, and Basic Computing <a class="heading-anchor" href="#files-storage-and-basic-computing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I use a number of things that used to be the realm of corporate interest in my life. Every corporate OS producer in the consumer space has a cloud storage solution that they are pushing <em>hard</em> on their users. OneDrive is installed by default on Windows and will constantly try to turn itself on. iCloud storage is baked into iOS/iPadOS and macOS devices and Apple actively encourages users to bundle all their apple subscriptions including storage they may not need. Google Drive is bundled with Android and ChromeOS and is basically the default way to interact with files on those operating systems at this point. The cloud storage from Microsoft and Google also comes with ways to interact with those files easily. Office suites are built into the web now and the default file types for these web versions of office programs are natively online. Not only do users end up filling up storage they don't need to be filling up, but they need to use these online editors to access everything. Files, documents, and spreadsheets are the bedrock of computing and they now live online so that companies can lease them back to you in exchange for as much data as possible. Here's what I've done so far to alleviate this issue.</p>
<ul>
<li>Use local office programs wherever possible. LibreOffice is open source and free. Other good alternatives also exist.</li>
<li>Host my cloud storage myself via CopyParty. With the correct setup, it is secure and available anywhere I have internet, but is not the default file management interface anywhere, even though the WebDAV server is easily integrated into other file management systems to show as a networked drive or local filesystem.</li>
<li>Use local-first file management wherever possible. My choice for this is Mixplorer on Android and Dolphin on my Linux desktop.
There are still gaps in the setup though. I'm hopeful they can be closed. This is one I think is certainly possible with some work in my current setup. These just aren't 100% perfect solutions.</li>
<li>Integrated web-based editing of files is nice. It's really convenient to not have to download a file to edit, then re-upload it after.
<ul>
<li>Nextcloud solves this by integrating everything, but it runs <em>SO SLOW</em> on my setup. It feels like throwing more hardware at it might help, but have you <em>seen</em> those RAM prices?</li>
<li>There's also Etherpad and Collabora, but I don't think they'll integrate very well into my existing file storage solution. They're not a part of the TrueNAS apps catalogue, which is fine. It just means deploying them takes about three times the amount of time.</li>
</ul>
</li>
<li>Automatic sync between local storage and &quot;the cloud&quot; isn't really a thing. It's not a big deal most of the time because as long as the server is available I have direct access, and in my home I don't even need internet to access the server files, but having some sort of offline caching would be nice.
<ul>
<li>This may be possible using some sort of WebDAV client, but it sounds complex and prone to failure.</li>
</ul>
</li>
</ul>
<h1 id="media-storage-distribution-and-playback" tabindex="-1">Media Storage, Distribution, and Playback <a class="heading-anchor" href="#media-storage-distribution-and-playback"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The classic number-one reason for a home server and the thing that got me interested in building mine in the first place. Before my homeserver, I needed to leave my desktop on at all times just to make Plex available. Beyond movies and TV, though, it's nice to support musical artists directly and not have to deal with ads, availability issues, or mixing of online and offline libraries. Similarly, not having to deal with Amazon's holding of ebooks or audiobooks hostage within their services is a godsend. Here's what I've got running right now.</p>
<ul>
<li>Plex is no doubt one of the most mature and feature rich media library experiences. I don't like their direction especially in the last few years, but I do have a lifetime Plex Pass and my wife is used to their UI and uses it more than I do, so I'm probably going to run it a while longer.</li>
<li>Jellyfin is what I'd like to move toward eventually for movies and TV. Its support for downloading subtitles is kind of rough at best, but if you don't need that functionality, it's a very solid and good experience, even if the UI is a little rough.</li>
<li>Navidrome is an OpenSubsonic-compatible music streaming service that runs on my home server. It can stream media to various endpoints and works off of a local library of files. As endpoints for Navidrome, I use Symfonium on Android which is a <em>very premium</em> feeling music app. On desktop, I use Psysonic which uses the OpenSusbsonic protocol, but connects to Navidrome just fine and looks good doing it.</li>
</ul>
<p>Even with these, I do have a couple major holes in my media library setup. There's ways around it, but it's not really cut and dry.</p>
<ul>
<li>I don't have a solution I love for ebooks or audiobooks. AudioBookShelf is the obvious choice here, but it has been relatively buggy for me. For eBooks, specifically, Calibre and Calibre-web leave a lot to be desired in the interface and Calibre-web Automated only minorly improves it, but it broke on my system too. This might just be something I have to do some troubleshooting on when I have time.</li>
<li>Plex is not noncommercial and there's some serious anti-features in it, but Jellyfin just isn't quite ready to fully take the reins yet and I don't know if or when it will be because its development is relatively slow.</li>
<li>Youtube/social video is something I still value, but don't have a good solution for. Ideally, this would be a server app and client that would offer ad-free video playback without needing to pay Google's blood price for Youtube Premium or subscribe to a large service to get content from only one or two people I like to watch while being unable to get content from anyone else. I also don't want to use a solution that would deprive the creators I like of support. With the additional limitation that I cannot subscribe to <em>every</em> patreon out there. Right now I just don't use YouTube at all on my phone, and only use the website with DeArrow, SponsorBlock, and a paid YouTube Premium subscritption. There are alternative self-hosted youtube frontends, which I may look into, but so far there's not a fantastic way to get around Google's subscription fee here yet.</li>
</ul>
<h1 id="written-content-on-the-web" tabindex="-1">Written Content on the Web <a class="heading-anchor" href="#written-content-on-the-web"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The reason for the season, baby. You're reading an indie web site here. Thanks, by the way. I love reading indie/small web stuff a lot. Here's my current setup.</p>
<ul>
<li>FreshRSS is my feed aggregator and synchronization server. I add my subscriptions to it directly, then use its GReader API to send those posts to my reading app of choice.</li>
<li>I use FluentRSS on both Android and Linux for reading posts via RSS. It's a dead simple interface, but I like the way it looks a lot, plus if I feel something is missing, I can easily flip over to the web view to get the full experience.</li>
</ul>
<p>This setup is solid, but there's a few things I'm looking to change or fix about it.</p>
<ul>
<li>I don't currently have a &quot;read later&quot; solution I like. I have Wallabag on the to-deploy list, but it isn't in the TrueNAS app catalogue, so I'll have to use Docker Compose to roll it myself.</li>
<li>If a site's RSS feed is hidden, or nonexistent, I don't currently have a way to get to it. I used to have RSSHub self-hosted, and might do so again, but I've been seeing bits and pieces about additional similar solutions, so I'm excited to look more into it.</li>
<li>I'm currently on the hunt for a good Search option. I currently use Startpage and Google (since Startpage doesn't work on my workplace's wifi.) I have looked at Kagi a bit, but I feel like $5/mo is <em>pretty</em> steep for just Search. Plus they are using AI too. I would like to roll my own Search, but SearXNG doesn't support locking up the site behind a login, so my instance would be just <em>available</em> to the whole web. It also doesn't perform super well on my gear. Maybe it's something I can look at again if I ever get the chance to upgrade my home server.</li>
</ul>
<h1 id="email-and-communication" tabindex="-1">Email and Communication <a class="heading-anchor" href="#email-and-communication"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Maybe a little out of the scope of the article, but communication is definitely one of the things that I feel is <em>most important</em> to fully own yourself. The issue so often lies in only being able to move to open standards or self host these services if others use the same services. This is also the only part of my setup I fully do not host myself at all.</p>
<ul>
<li>For email, I use PurelyMail. This is a very cheap service that <em>only</em> provides mail. Nothing else. The downside is no extra features like file storage or whatnot that you'd get with ProtonMail or FastMail, but as stated before, I do not want or need cloud storage or document editing or anything else that these companies stuff into e-mail to try to pump the value of the service.</li>
</ul>
<p>Communication is absolutely a swamp. There's a lot of movement in the area, but getting people over to a new service is nigh impossible. The solution here from a technical, and somewhat heatless, perspective is to say goodbye to the communities I like to be in and only maintain membership if a community is willing to adhere to my specific criteria for platform and protocol. Naturally, I don't really see this as a viable option. Some things I <em>am</em> interested in considering, though.</p>
<ul>
<li>LoRa communication is a thing that has been gaining steam as civil unrest and natural disasters loom large in society. I am absolutely interested in messing with the technology and integrating it somehow. It would be an absolute boon should Colorado's seasonal wildfires take out power and communications again, which seems very likely this summer.</li>
<li>Discord is not a friendly place to be from a corporate standpoint. In their move towards IPO, the service has been making moves for profitability, not community health. I would be interested in jumping ship, if a comparable service feature-wise, with significantly more community control was adopted by the communities I'm a part of. However, this is the one area where the community move is most important and moving people to a new platform is just asking for a fractured space. I don't want that, so I'm stuck.</li>
<li>I currently don't visit forums or maintain ties with other like-minded communities outside of consumption and writing these posts into the void, so to speak, so I'm interested in perhaps looking at 32-bit cafe or other indie web communities to maintain friendly relationships with and maybe even expand the reach of my own humble site. I haven't made such moves yet, though. Joining a new community with its own norms is kind of scary.</li>
</ul>
<h1 id="wrapping-up" tabindex="-1">Wrapping Up <a class="heading-anchor" href="#wrapping-up"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I feel pretty knowledgeable about the space and I genuinely like exploring and building out more services. It's easy to make it sound like this life is significantly better than existing on the corporate net in every way, but in truth it's not easy and it's not perfect. It's a lot of long troubleshooting sessions and maintenance. Sometimes things break pretty severely. Like Immich did recently when they deprecated the Postgres 15 database option without a way for existing installs on the latest version to upgrade the DB without changing some files via the shell in TrueNAS. Still, I built this setup brick by brick and I wouldn't get rid of it for the world.</p>
]]></description>
      </item>
    
      <item>
        <title>Trust, Disclosure, and Human.json</title>
        <link>https://tk-web.quest/blog/trust-disclosure-and-humanjson/</link>
        <guid>https://tk-web.quest/blog/trust-disclosure-and-humanjson/</guid>
        <pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I was reading the <a href="https://shellsharks.com/scrolls/scroll/2026-03-24">Scrolls</a> newsletter the other day and one of the links was to the <a href="https://codeberg.org/robida/human.json">human.json</a> protocol. Around the same time, I read a post by Brennan about <a href="https://brennan.day/trust-and-faith-in-our-web/">Trust and Faith on the Indie Web</a>. This, plus the other devastation wrought by AI got me thinking about my own thoughts about generative AI, disclosure, and trust. I'm not sure I came down on a good, solid answer that I would defend tooth and nail, but I'm hoping that writing about it can help me solidify my thoughts.</p>
<p>First, let's take a look at how platforms are <em>currently</em> handling AI.</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Yeah. You see it too, right? Almost no one is doing anything about it. Disclosure is often voluntary and even if it was mandatory, it's hard to perfectly spot generative AI in every scenario. Stuff is making it through anyway. Even I was taken in by a youtube channel that was using AI to generate music. I liked the music! I listened to it a lot! But I don't have an ear for AI sound. I didn't even notice this music wasn't human made until it was pointed out to me. Now I can't unhear some of the small tells. It's difficult to prove without a doubt that something is made by a computer or by a human. Even if there were laws regulating AI use or disclosure, they would be hilariously difficult to enforce. So, that leads me to the natural place that a lot of independent creators have landed. As humans, we should declare our humanity by badging everything we make as &quot;Made by Humans&quot; or &quot;No AI.&quot; But... Is that really what we should do?</p>
<p>Brennan's stance, <a href="https://brennan.day/building-the-good-web/">further elaborated</a>, is that the badging of human made content declares generative AI as the victor. If we declare ourselves to be human, we are discarding the territory we have held for so long. The default becomes &quot;everything was made with AI unless a human put their sticker on it.&quot; It also speaks to a large usage of energy fighting fair when the enemy fights dirty, something that <a href="https://brennan.day/apathetic-intentionally-why-i-dont-block-ai-scrapers-on-my-website/">Brennan wrote about previously</a>. If your enemy starts their fight at &quot;We will steal every written word on the internet, regardless of who wrote it,&quot; then why should we ever expect them to follow the rules? The internet is built on a series of norms and accepted practices. Standards only exist because people agree they should exist and that they will all interact with the information in accordance to the best practices agreed upon. If the enemy fights dirty, why should we waste effort defending in ways that only work if they play fair?</p>
<p>I absolutely see where Brennan is coming from here. It's genuinely difficult to argue against such an attitude other than by generalizing it. Still, not doing <em>anything</em> rubs me the wrong way. So I looked again at the Human.json protocol. I wanted to understand what it's really doing under the hood and see how hard it would actually be to add it to a site. As it turns out, this is an easy, low effort way to quietly say &quot;I'm human&quot; specifically to <em>people who are looking for it</em> but in a way that is otherwise invisible. It's not a perfect compromise, but I like the direction it takes. I won't repeat the documentation here. It's well written and well reasoned. Here's just a small summary of how it works.</p>
<p>Website creators store a human.json file somewhere. It could be on their website itself. It could be somewhere else. It doesn't matter as long as the file is available over HTTP/S. In that file, they declare their own site's domain and the domains of other sites that they trust are being maintained by humans. Then, in the head tag of their website, they add a link to the file. Not with any text attached, just a reference in a specific format. On the user side, they can use an extension or other program to look for those human.json tags. If one is found, it alerts the user that a human.json exists. The user then gets to decide if they trust the declaration. If they do, then the extension caches the human.json that is linked and any sites that person vouches for will now notify the user too. The interesting thing to me here isn't necessarily just the claims to be human, but that the verification program or extension can use the human.json file itself to follow links deep into the indie web because if site A vouches for site B and Site B <em>also</em> has a human.json, the verifier can look at that file to find more sites that people vouch for and categorize them in terms of how many hops it takes to go from a trusted site to any other given site. The other upshot is that the verifier can show all of the vouched-for sites to the user which basically makes an automated discovery engine and blogroll of human-made sites. The user confirmation is also important. Anyone can add a human.json, so like with disclosures, it's completely voluntary and could be a lie.</p>
<p>Still, though, I like seeing the extension light up when I visit a site that has one. It's a little light kept burning by people who are making the good indie web I love.</p>
]]></description>
      </item>
    
      <item>
        <title>Jack of All Trades, Shitty at All of Them</title>
        <link>https://tk-web.quest/blog/jack-of-all-trades-shitty-at-all-of-them/</link>
        <guid>https://tk-web.quest/blog/jack-of-all-trades-shitty-at-all-of-them/</guid>
        <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Something I said on this week's Worst Community Report surprised me. I needed to come up with a recommendation and I realized just how much I was enjoying using my phone less and handwriting things more. So in the flow of my recommendation to get and use a cheap pocket notebook, I said that in recent memory, as a smartphone has become a very wide tool that can do almost anything, it has become pretty awful at doing many of those tasks. It takes me more time to get my phone out and start a new note than it does for me to reach into a pocket where a notebook and a pen are waiting, ready to go. Even if I don't have a pocket sized notebook with me, I have found myself digging a reporter style notebook out of my bag rather than take notes on my phone or laptop at work.</p>
<p>The natural followup to that sentiment is to point out people enjoying Digital Audio Players lately. Bluzo, one of my cohosts has an Innioasis Y1, a player that basically looks like a modern iPod Classic. I know a few others who have similar devices and love them. It's the one step I don't think I'll take anytime soon, but would love to. Right now, most of my audio consumption is relegated to my phone simply because I like podcasts so much. Automatically downloading and adding new episodes to a queue is something that a smartphone still does better than most of these DAPs that don't have a wifi connection. The ones that do are basically big Android devices which means it'd be more like carrying two phones than a phone and an audio player.</p>
<p>The place where I <em>have</em> decoupled my phone has been books. In my younger years I was a voracious reader, but I haven't kept up with it as much as I would like. However, for the few books I have been reading in recent weeks, I've been doing so on my brother's old Kindle Keyboard from 2010. He was getting rid of it because the battery was dead. $20, a 1-minute repair, and about fifteen minutes of tinkering, rebooting, and moving files later and I've got a great reading device with KoReader on it so I can read without dealing with Amazon basically at all. I'm hoping this much improved reading experience will have me more hungrily consuming books. Right now, the study guide I'm reading for the CompTIA Security+ exam is a great experience there. I did also put Yokohama Kaidashi Kikkou on it, because the e-ink screen looks fantastic for manga, and that's a series I will always love to have with me. The other manga I'm currently going through, One Piece, is one I am going through colored volumes with, so I kind of have to use a good color screen rather than the black and white Kindle. Still, I'm excited to read through more manga on the kindle. I'd forgotten how much of a delight e-ink displays are.</p>
<p>I don't really have much else that I'm deliberately splitting from my phone because there wasn't much there to begin with. I'm trying to put some space between myself and Youtube, but that expands to much more than just the phone. Instead, I've started reading blogs more again, after some time away. I do think I need to find some more people to read, so if you have recommendations, please shoot them to me via the contact page here on the site! I also count myself lucky because my only other social media interaction is via Discord. I only have a couple of servers I frequent and do a pretty good job of limiting myself to channels I actually enjoy, so it doesn't often become a hole for me like other platforms might.</p>
<p>It's hard to believe now that the iPhone originally launched with no app store at all. It's even harder to believe that I'm basically working my way back to that original set of the most basic applications. Web browser, email client, texting, phone, photo gallery, a camera, and a media player.</p>
<p>I don't think I've ever get all the way back, but it's nice to dream.</p>
]]></description>
      </item>
    
      <item>
        <title>Paranormasight - The Mermaid&#39;s Curse Review</title>
        <link>https://tk-web.quest/blog/paranormasight-the-mermaids-curse-review/</link>
        <guid>https://tk-web.quest/blog/paranormasight-the-mermaids-curse-review/</guid>
        <pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<h1 id="an-introduction" tabindex="-1">An Introduction <a class="heading-anchor" href="#an-introduction"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I am not a massive lover of visual novels. I tend to enjoy them when I play them, but I don't usually go out of my way to experience the form. When <em>Paranormasight: The Seven Mysteries of Honjo</em> came out, I was intrigued by it, but I never did end up picking it up. I may, though, at this point because I greatly enjoyed the sequel in this mystery anthology series: <em>Paranormasight: The Mermaid's Curse</em>. I picked up <em>The Mermaid's Curse</em> primarily because I wanted to surprise my friend and cohost on <a href="https://twcr-radio.online">The Worst Community Report</a>, Bluzo. She was putting together a spoilercast for the game and I wanted to drop in having secretly completed the whole thing. I'm happy I did pick it up, though. I had a great time with it!</p>
<h1 id="an-overview" tabindex="-1">An Overview <a class="heading-anchor" href="#an-overview"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I found my time with the game to be remarkably smooth. I am not always the best puzzle solver out there, and we will return to that point in a moment, but I found my progress through the game remarkably unimpeded. The answers to puzzles were always available and easily retrievable from the files and profiles that the game provides. A lot of the information therein is duplicated from what characters have said, but a fair amount is new context and further reading that is interesting to go through even if it doesn't directly tie into the story. Many of the game's features are very user-friendly in this way. The dialogue system provides feedback when all conversation of a given topic or internal monologue about the scenery or characters has been seen. There is also generally clear feedback when you have seen everything that a chapter has had to offer. You can also resume basically any scene from key decision points if the path branches there, and each individual section of each chapter has that same checkmark if you have seen everything important from each section.</p>
<p>The visual and audio presentation of the game is also excellent. The musical variety and character posing may not be extravagant, but the developers truly make great use out of all of it. I normally do not like chromatic aberration or other effects meant to evoke the presentation of older technology, but I feel that it fits very well here considering the 1980s setting. I also feel the effects gel well with the extremely striking character portraits and unique background art style. I genuinely can't tell if the backgrounds are heavily edited panorama photographs or if they are excessively detailed illustrations. In my mind, both are likely and both are impressive. They are also a wonderful contrast from the character portraits, which sport bold, heavy outlines and extremely expressive body language and facial expressions. They aren't completely in an anime-style, nor are they completely realistic. Instead, they are an in-between style, similar to how the backgrounds are in between photo-realism and illustration. This is an extremely strong art style and I'm looking forward to seeing how it evolves in future entries.</p>
<h1 id="a-warning" tabindex="-1">A Warning <a class="heading-anchor" href="#a-warning"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Here, we get to the true meat of the review. As a game primarily focused on story, this review would be woefully incomplete if I didn't address the twists and turns of the tale it is weaving. However! If you, dear reader, have any inkling that you will want to play <em>The Mermaid's Curse</em>, then stop reading here and go play it. I can easily provide a recommendation to play the game, even though it would not net a perfect score if such a numerical value was attached to the review you are reading. The game is complex enough that I have no hope of properly critiquing it without revealing major mechanical and narrative beats. If you do not care about these details being revealed, I shall remind you that this is a <strong>mystery game</strong> and a large part of what I think works and doesn't work about the game is tied up in the <strong>way that mystery is handled</strong>. I urge you to experience the mystery yourself rather than read my discussion of it.</p>
<p>Now, I trust that anyone left still reading either has no intention to play <em>The Mermaid's Curse</em> or has already done so, let us continue on into the depths.</p>
<h1 id="a-complex-web" tabindex="-1">A Complex Web <a class="heading-anchor" href="#a-complex-web"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>As I have said before, the biggest part of this game from a critical standpoint is the narrative. For the most part, I think it works right up until the moment it doesn't. I was deeply invested for 90% of the runtime of the game. I felt like I was picking up the hints that the game was laying out for me as I went along, and discovering information at the same time as the characters. There are many pleasant spots where I could feel the game saying &quot;This will be important later&quot; and it was. It felt like basically no detail was truly unimportant and everything had a reason to be there. Even something as seemingly unimportant as feeling like Shotaro was probably going to be a villain at some point came back in fun and interesting ways later. So much of the game is about the <strong>process</strong> of the mystery. The second a skuzzball like Ikoma shows up on screen, you can tell he's going to be a villain at some point. The key is <strong>how we get there</strong> and how the characters figure that out through evidence gathering and good old fashioned detective work. This feeling is one I love to have in a mystery. It's the cathartic release of a detective <strong>knowing</strong> that the person sitting across from them is a criminal and slowly tightening a net around them until they slip up and can be properly caught. The mystery aspects of this game, especially those around the Curse of the Raging Waves and The Slashing Curse are handled <strong>very</strong> well and I got a lot of enjoyment out of them.</p>
<p>The game uses several narrative devices to make its story effective and also make the player's choices consistently in-universe. While some of them, like the branching path and spiritual identity of the player separate from any of the characters they are inhabiting work well, there is one that I feel falls completely flat and doesn't make any sense within the narrative as presented. Let's start with the positive here.</p>
<p>I love when a game interacts with the player directly separate from the characters they may be inhabiting. The way this game sets that up is by separating Yuza's head from his shoulders. Since Yuza is immortal, the consciousness that resided in that head remains left behind, as a disembodied spirit. This is a clever way to implant the Player in the story and offers a good reason for the linearity toward the first ending. Yuza's spirit gets a second chance to go back in time and start changing the future. This breaking of the fourth wall is extremely cool to me and I love it as a storytelling device. The problems begin to arise when this mechanic and story beat begin to interact with the rest of the game's secrets.</p>
<h1 id="a-sputtering-conclusion" tabindex="-1">A Sputtering Conclusion <a class="heading-anchor" href="#a-sputtering-conclusion"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Ultimately, the late-game story fumbles mirror the methods used to unlock those fumbles. I greatly enjoy the unusual mechanics used in the final puzzles of the game. Using the save system and the title screen in the way they do is extremely fun and I love the creativity. I just wish there was a little bit more pointing the player in the direction of the solutions. The Final Plan puzzle was very vague and offered a lot of options, more than basically any other puzzle in the game and expected you to only use two of the nine characters and pick specific abilities, of which we only see one in action during the events of the game. Similarly, the Mermaid puzzle right near the end relies on mechanics that were only vaguely hinted at in a way that was not obvious to me and I would not expect to be obvious to others. These pieces blindsiding the player right at the end only serve as resolution to the threads of the story I like the least by the end.</p>
<p>An unreliable narrator is often an interesting technique when used well. It can be used to keep the audience on their toes and encourage re-visitation of the work. I usually enjoy an unreliable narrator quite a bit, but I feel like it just doesn't work in this case. As we inhabit the thoughts and minds of several characters, we see the events unfold from multiple perspectives. However, both Yuza and Sato keep their true motivations quiet until the eleventh hour. They don't just hide this from the rest of the cast, but also from the player. It frankly just doesn't make sense for the secret information to remain secret for the amount of time it does in the game. Maybe the reason I balk at this aspect of the game is simply because so many other parts of the story are hinted at so effectively, where the secrets revealed late-game about Yuza and Sato feel like they come out of left field entirely.</p>
<p>The entire game sets up Yuza and Azami as being very close. I don't feel like I am alone in reading them as possibly having a relationship in their future. Or at least it felt several times like Yuza has romantic feelings for Azami. The sudden swerve to set up Yuza with Sato comes out of nowhere and feels like a very late addition to the story. While the pair do work together well eventually, it does feel like early playtests had people thinking Yuza and Azami were being paired up and there's no way Square Enix could possibly allow that. The heterosexuality is mandatory, here. The only possible relief we have when it comes to queer representation is the declaration that comes from Sobae the mermaid near the end that her and Mare Minakuchi were &quot;more than friends.&quot; Their relationship, however, is never explored beyond that.</p>
<h1 id="a-look-ahead" tabindex="-1">A Look Ahead <a class="heading-anchor" href="#a-look-ahead"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Overall, even with my misgivings, I really enjoyed my time with <em>The Mermaid's Curse</em>. I'm very excited to go back to <em>The Seven Mysteries of Honjo</em> and am looking forward to whatever this team comes up with next. It feels like a rich world that could support a much larger anthology of games. Maybe I'm echoing peoples' thoughts about the first <em>Paranormasight</em>, but I'm very excited to see this series grow.</p>
]]></description>
      </item>
    
      <item>
        <title>A List of Tools and Services to Regain Control</title>
        <link>https://tk-web.quest/blog/a-list-of-tools-and-services-to-regain-control/</link>
        <guid>https://tk-web.quest/blog/a-list-of-tools-and-services-to-regain-control/</guid>
        <pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>This started as a simple list of stuff I've used or heard of to take back control of one's digital life, but it kind of got out of hand. Items that are <strong>bolded</strong> are ones that I use in my own setup. This isn't necessarily a value judgement or anything. This is just what I use.</p>
<h1 id="email" tabindex="-1">Email <a class="heading-anchor" href="#email"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>ProtonMail - has spreadsheets, cloud storage, vpn, and password manager if you pay extra, but all that exists to hold you in their ecosystem. Not a fan.</li>
<li>FastMail - See above (minus vpn and password manager)</li>
<li><strong>PurelyMail</strong> - $10/yr for unlimited email. As many addresses, inboxes, or custom domains as you could want. No extra frills. Webmail is not great. Use a local mail client like Thunderbird.</li>
</ul>
<h1 id="cloud-storage" tabindex="-1">&quot;Cloud&quot; Storage <a class="heading-anchor" href="#cloud-storage"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>NextCloud - Self-hosted, has a <em>LOT</em> of features. Very powerful, but also <em>very</em> bloated. Runs slow for me.</li>
<li><strong>CopyParty</strong> - Self-hosted. Works as a WebDAV server and is accessible over http/s. If you set up your config file right you can do share links or public upload hoppers. VERY fast and light. Has a basic text editor and directory management built in, but no other major frills.</li>
</ul>
<h1 id="password-manager" tabindex="-1">Password Manager <a class="heading-anchor" href="#password-manager"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p><em>DO NOT USE THE PASSWORD MANAGER BUILT INTO YOUR BROWSER FOR THE LOVE OF GOD</em>. Use one of these instead</p>
<ul>
<li>ProtonPass - A part of ProtonMail. Probably pretty secure. See concerns about ecosystem above.</li>
<li><strong>BitWarden</strong> - Very security focused. Regularly audited, premium offering is inexpensive (used to be even better, I'm grandfathered in at a frankly silly rate)</li>
<li>VaultWarden - Literally &quot;BitWarden but hosted yourself&quot; Same codebase and everything. I don't host it myself because I trust them and the web availability is important.</li>
</ul>
<h1 id="media-hostingstreaming" tabindex="-1">Media Hosting/Streaming <a class="heading-anchor" href="#media-hostingstreaming"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Plex - Less good than it once was. They try to put their own streaming service into your personal media collection. I don't like it. Much more commercial than I'd normally like, but it is <em>very</em> user-friendly.</li>
<li><strong>Jellyfin</strong> - I use this for video, but it also handles music well. Serves libraries of media from your hard drives over the network to client devices. Out of network access is not as plug-and-play as Plex, but is not difficult either.</li>
<li><strong>Navidrome</strong> - An OpenSubsonic derivative for hosting a music library and accessing it from client devices. I use it with Symfonium as my music player of choice on Android. Seamlessly integrates with MusicAssistant</li>
<li><strong>MusicAssistant</strong> - HomeAssistant for smart speakers. Can connect libraries from a wide variety of music applications to a wide variety of smart speaker types.</li>
<li><strong>Immich</strong> - A self-hosted Google Photos analogue. Has a <em>VERY</em> similar UI and UX, but all your photos are <em>yours</em></li>
<li>Photoprism - another well-regarded &quot;cloud&quot; image service that you host yourself. I haven't tried it.</li>
<li><strong>Calibre Web Automated</strong> - An ebook manager and server. Allows you to hook up an e-reader to download local copies of your books, plus all the usual metadata management and file management of traditional Caibre.</li>
</ul>
<h1 id="utilities" tabindex="-1">Utilities <a class="heading-anchor" href="#utilities"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li><strong>httpd</strong> - a docker image that contains an apache server ready to go for hosting static websites. Alternative images are available that include PHP if you need that.</li>
<li><strong>Forgejo</strong> - A self-hosted git server/code forge. Has pretty robust feature parity with Github and runs fast.</li>
<li><strong>Forgejo Runners</strong> - Self-contained Docker host for images for use in Actions, similar to Github Actions.</li>
<li>Gitea - Another self hosted Github analogue. I've found it to run a little slower than Forgejo, but it's still very well regarded.</li>
<li><strong>FreshRSS</strong> - an RSS feed management platform. Allows you to have a centrally managed host for all your feeds, plus includes neat things like read status synchronization if you use more than one device.</li>
<li><strong>Actual Budget</strong> - an Envelopes-method financial tracker. Can import accounts from most financial institutions via SimpleFIN bridge. Includes options for automatic categorization and budget-setting. strongly encrypted by default and all of the math happens on the client device, so it's lightweight and fast.</li>
<li>SearXNG - A self-hosted search engine. It can aggregate search results from a bunch of places and put it all in one spot. A bit slow unless you have the hardware and RAM for it, but useful nonetheless.</li>
<li><strong>HomeAssistant</strong> - A tool to combine all of the internet of shit stuff into one control panel. Extra useful for custom built or fully offline &quot;smart' things that only need to talk within your local network.</li>
<li>Storj - One of the cheaper S3 storage providers. Integrates well into TrueNAS for backing up your server. <em>Update 2026-06-15: Storj has changed their pricing structure and now has a $50/month minimum cost. That isn't &quot;we charge you when you rack up $50 in charges over however many months it takes&quot; That's &quot;even if you use 1TB which we would charge you $7 for, you have to pay $50 instead&quot;</em></li>
<li><strong>Backblaze B2</strong> - An S3 storage provider for backups. B2 is more geared at advanced users and businesses. They have a cheaper offering for personal device backup, but that doesn't support Linux. <em>Update 2026-06-15: I'm using Backblaze now. The integration in TrueNAS isn't as nice as Storj, but you can use a Restic backup setup like Backrest to get a lot of that functionality back. I don't know if the price changed or something, but Backblaze is now at a decently competitive price and doesn't have a minimum, so if you store 500GB, you pay half of their 1TB rate etc.</em></li>
<li><strong>Borg</strong> - A backup solution that creates an encrypted archive at a target location. Extremely tuneable to back up exactly what you want and nothing you don't. The target destination can be a network share or file server. Use borg on individual computers to back up to the NAS, then the NAS's backup solution to back up to S3 storage.</li>
</ul>
<h1 id="networkingvpn" tabindex="-1">Networking/VPN <a class="heading-anchor" href="#networkingvpn"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li><strong>ProtonVPN</strong> - My favorite commercial VPN. Good apps across operating systems. Your ISP is probably tracking your usage habits etc. This cuts that out. A VPN is protection against <em>SOME</em> types of nefarious internet activity. It is not a silver bullet and whoever you are reaching on the other end is still harvesting your data. This applies to Commercial vpns.</li>
<li><strong>Tailscale</strong> - A personal device network. Connect your home server and phone to the tailnet and they can talk to each other as if you were on the same LAN  even when on different internet connections (home internet vs cellular for example) Set an exit node and all the local Wifi will see is traffic between your device and your home network, not where that traffic goes after it reaches your home network.</li>
<li><strong>Cloudflare Tunnels</strong> - Allows you to bypass your own firewall and network security by creating a dedicated tunnel between a published service and the wider internet managed by Cloudflare without opening ports to all traffic.</li>
<li>Nginx Proxy Manager - Allows you to map routes for specific urls or subdomains to specific devices and ports on your internal network. ie: <a href="http://movienight.domain.com">movienight.domain.com</a> goes to the jellyfin container, <a href="http://versioncontrol.domain.com">versioncontrol.domain.com</a> goes to the forgejo container.</li>
<li><strong>PiHole</strong> - DNS based ad, malware, etc blocking. Set up the container or raspberry pi and use it as your router's DNS to provide good ad-blocking to every device, even if it doesn't support an ad-blocker natively.</li>
</ul>
<h1 id="operating-systeminfrastructure" tabindex="-1">Operating System/Infrastructure <a class="heading-anchor" href="#operating-systeminfrastructure"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Ubuntu Server LTS - The very stable version of Linux. You get no handholds and no desktop by default, but it being a very open server means you can create the structure however you like.</li>
<li><strong>Docker</strong> - Runs applications in individual containers instead of on the host machine. Safer and more reliable.</li>
<li><strong>TrueNAS</strong> - a network attached storage and application focused OS. Built for rolling your own everything.</li>
<li>ProxMox - A server OS that is built nearly exclusively on containers and virtual machines. Extremely powerful, but less user friendly.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Now fully self-hosted!</title>
        <link>https://tk-web.quest/blog/now-fully-self-hosted/</link>
        <guid>https://tk-web.quest/blog/now-fully-self-hosted/</guid>
        <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Last time on TK-web.top, I switched away from github for the site. Instead, I'm using my own Forgejo instance for version control. I was still at that time using Cloudflare's CLI tool, Wrangler to deploy the site.</p>
<p>Today, however, I'm proud to announce that I'm no longer hosting TK-web.top on Cloudflare pages! I'm still using them for DNS and tunneling, but those are more in line with who Cloudflare is as a company right now. They are a security provider first and foremost and I'd like to keep my relationship with them in that realm if I can. Instead, TK-web.top is now hosted in an httpd container on my own personal server!</p>
<p>With this update comes a couple of changes. First, I can't deploy the site from anywhere like I could when it was hosted on Github for version control. There may be a way to eventually add an actions workflow to Forgejo to re-enable this functionality, but my home server isn't really powerful enough to run everything all the time. It just doesn't have the RAM to keep everything ready to go and I don't know if you've heard, but <a href="https://arstechnica.com/gadgets/2026/02/valves-steam-deck-intermittently-out-of-stock-as-ram-shortage-drags-on/">RAM is pretty damn scarce these days</a>. Even the DDR4 that I'd put in the Home Server is <em>pricey</em>.  So. For now, this is how it is. My workflow is still pretty similar. I write a post, run a blog update script, and the site updates.</p>
<p>The one major downside is that if the homeserver is down for any reason, like <a href="https://www.cpr.org/2025/12/16/xcel-likely-to-shut-off-power-to-many-front-range-communities-at-noon-wednesday-due-to-dry-conditions-and-high-winds/">high winds and wildfire risk</a>, the site will also be unavailable. I would like to eventually get a VPS or other hosting option and host my site in a more resilient spot, specifically in case something happens to the actual hardware. Maybe some sort of small CDN to keep both in sync would be cool.</p>
<p>I also took this moment to re-do some of the rest of the site and I <em>PROMISE</em> it isn't because I fucking broke everything. Anyway, you may have noticed a cool new theme! It's a <em>heavily</em> modified version of the Mana theme by Livour. You can find it over on (ugh) <a href="https://github.com/Livour/hugo-mana-theme">Github</a>. You can expect some changes over the next little while as I dial in the colors to be more in line with the vibe I want the site's new look to have.</p>
<p>Anyway, that's all I have for you right now.</p>
<p>Build websites, host websites, do cool shit.</p>
]]></description>
      </item>
    
      <item>
        <title>Reducing My Reliance on Big Tech: Switching Git and Email Providers</title>
        <link>https://tk-web.quest/blog/reducing-my-reliance-on-big-tech-switching-git-and-email-providers/</link>
        <guid>https://tk-web.quest/blog/reducing-my-reliance-on-big-tech-switching-git-and-email-providers/</guid>
        <pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I have long lamented that I feel the need to rely on various huge corporations in order to exist at all from a technology perspective. I hosted the version control for this website on GitHub, owned by Microsoft. I used Gmail for email. I host this site using Cloudflare Pages, even. There are countless ways that, even though I <a href="https://tk-web.top/posts/2026-01-23-linuxstepbystep/">evangelize open source</a>, I too rely on the false benevolence of the large, wealthy, powerful technology corporations. Over time, I have endeavored to move towards a life where I am not as reliant on these corps. I don't feel that I will ever be truly free of them, but I do like that I can, in some small way, take back some ground from them from time to time. Today I want to talk about email and github.</p>
<h1 id="no-frills" tabindex="-1">No Frills <a class="heading-anchor" href="#no-frills"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The thing that I have quickly found in my search for an email provider that isn't gmail is that the email-only service doesn't exist in the same way it used to. A service that is just email isn't really valuable enough to people, so the major players offer mail for free. It's also tough for companies to make enough money if they don't charge a lot for mail, so they often feel the need to develop and include other features into their services to make the cost worth it. These often take the form of cloud storage or office applications. I don't really need those, though, so the higher price for <em>just email</em> never made a lot of sense to me financially.</p>
<p>Then, along came <a href="https://cassie.ink">Cassie</a> who told me about <a href="https://purelymail.com">Purelymail</a> which is a service that does one thing and one thing only: email. The extremely stripped down offering means they can provide it at an extremely competitive $10 per year for unlimited users, unlimited custom domains, and unlimited mail within reason. If you're only doing your own personal email and are a light user, it's probably even cheaper than that if you use their advanced pricing scheme to pre-load your account with credit. They also have a free trial which gives you enough usage for about a month if you aren't a heavy user.</p>
<p>There are some real downsides to it. I won't sugar coat it. The webmail experience is <em>not good</em>. They are working on a new custom webmail app, but it isn't ready yet and their off the shelf option is not great. Thankfully, a desktop email client sidesteps this. I'm currently using Thunderbird for that, but I might change to something else soon. It's also <em>JUST</em> email. No calendars, no cloud storage, no documents or spreadsheets. It's also very explicitly not for business use. It's intended for regular people to get regular email. That's it. The stripped down offering is very much up my alley.</p>
<p>I've made about five or six email accounts on Purelymail across my various domains. I have one for tk-web.top, another less public one for important accounts, and a few for my various self-hosted services to use to send me alerts about errors and the like. Being able to spin up a new mail account for temporary use will also surely be helpful for other things in the future. It's a really killer feature that makes Purelymail the cheapest option for me <em>by far</em>.</p>
<h1 id="git-moving" tabindex="-1">Git moving <a class="heading-anchor" href="#git-moving"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Github may be the standard for code forges and version control on the web right now, but it being Microsoft and heavily encouraging AI use means I want to get away from it as much as I can. The problem with leaving Github is twofold for me. First is Actions. I don't use them much, but in the few cases I do, I haven't found a forge yet that has a reliable Actions runner aside from Github and GitLab, which has similar issues to Github for me. AI bullshit and it's a big company. I want to stay away from that if I can. The second issue is that Cloudflare Pages <em>which I also want to be rid of eventually</em> works really well with Github. The Cloudflare continuous integration is really fast and deploys my posts extremely rapidly.</p>
<p>I haven't found a solution for Actions, yet, so I'm going to still keep the one repository that needs an Action on Github. That repo builds the firmware for my <a href="https://tk-web.top/posts/2025-07-01-kboard/">Lily58 keyboard</a>, so I really don't use it often at all. I have, however, found a solution for Taming Knots. I am now hosting the version control for the blog on <a href="https://forgejo.org">Forgejo</a>, which is running on my home server.</p>
<p><img src="2026-01-25-18-33-02-image.png" alt=""></p>
<p>Forgejo is a fork of Gitea. Both are open source, self hostable Git servers. <a href="https://codeberg.org">Codeberg</a> and <a href="https://disroot.org">Disroot</a> both use Forgejo as their code forge. Once it's set up, using it is extremely familiar to Github and other code forges. Make an account, set up SSH if you want to, and start making and pushing repositories. It's kind of boring in how easily this went up. In my anecdotal experience so far, it does run a little bit smoother than Gitea did in my home server setup. Now, when I push an update to my blog, my script runs <a href="https://gohugo.io">Hugo</a> to generate the html webpages, then commits the changes to Forgejo for version control. The script ends by calling <a href="https://developers.cloudflare.com/workers/wrangler/">Wrangler</a>, which is Cloudflare's deployment helper, to push the live site to Cloudflare Pages. I'm not completely happy with this setup, but it means I am finally no longer reliant on Github for any part of the hosting process for Taming Knots!</p>
]]></description>
      </item>
    
      <item>
        <title>Switching to Linux Step By Step</title>
        <link>https://tk-web.quest/blog/switching-to-linux-step-by-step/</link>
        <guid>https://tk-web.quest/blog/switching-to-linux-step-by-step/</guid>
        <pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>There are a few things that I am an outspoken evangelist about. Of those, the one that I feel is <em>actually</em> a good idea for a lot of folks is switching to Linux full-time, or mostly full time. Many, however, have expressed their nervousness at making the switch. Would they be able to find applications that do what they need? Will they understand the interface? What distribution should they pick? Will any of their existing hardware work?</p>
<p>I've answered a few of these in the past in my <a href="https://tk-web.top/posts/2025-04-30-eos1/">Embracing OSS</a> series and my more recent <a href="https://tk-web.top/posts/2025-12-10-moving-to-linux-guide/">Ditching Windows Primer</a>. The thing I haven't really jumped into is the actual <em>process</em> of switching. What to look out for, how to back things up, if dual-booting is feasible or recommended, etc. This post is everything I knew or wished I knew before taking the plunge myself. We'll start with the big stuff and drill down into specifics. I'm trying to make this as practical as possible without feeling like a tutorial or specific to one distribution.</p>
<h1 id="mental-preparation" tabindex="-1">Mental Preparation <a class="heading-anchor" href="#mental-preparation"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I know this might sound hokey, but as you consider moving to Linux, you should ask yourself a few questions first. These will not only help you make decisions as you transition, but also confirm that you are actually interested in making the switch. If you come away from these feeling like you should stick with Windows or MacOS, that's totally fine! Linux is not a one-size-fits-all OS and there are specific considerations to keep in mind.</p>
<h2 id="are-you-interested-in-learning-new-things" tabindex="-1">Are you interested in learning new things? <a class="heading-anchor" href="#are-you-interested-in-learning-new-things"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>It is okay to not have the time or energy to learn new things, especially with a computer. If you just want to sit down and do the things you want to do and not have a learning period, then that's okay and you can continue using what you currently are. My approach is a &quot;learn-as-you-go&quot; one. As you do new things with your computer on the new OS, you will learn valuable skills that can be used elsewhere. If you take these instances as learning opportunities, you won't need to sit down and &quot;figure out&quot; the OS in long sessions. You just learn new things as you need them. If this sounds interesting, then carry on!</p>
<h2 id="are-you-tied-to-very-specific-programs-or-hardware" tabindex="-1">Are you tied to very specific programs or hardware? <a class="heading-anchor" href="#are-you-tied-to-very-specific-programs-or-hardware"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This isn't an automatic pass/fail, but it is worth asking if you utilize specific software or hardware that may not work with Linux. If you use fancy control surfaces for image, video, or audio editing shortcuts and hotkeys, there may not be a driver or software available. If you absolutely <em>must</em> use full Photoshop or other Adobe suite programs, you should probably hold off. If you don't mind missing out on some games that use Windows-specific anti-cheat and are fine with using alternative creative programs, then keep going!</p>
<h2 id="how-much-will-you-use-the-pc-how-opposed-are-you-to-maintenance-tasks" tabindex="-1">How much will you use the PC? How opposed are you to maintenance tasks? <a class="heading-anchor" href="#how-much-will-you-use-the-pc-how-opposed-are-you-to-maintenance-tasks"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This is more of an informative decision.  In my previously mentioned Ditching Windows primer, I go over the various distribution types and what kind of person each might be good for. This boils down to how much you enjoy tinkering, how much you are okay with using text configuration files and the terminal, and how interested you are in <em>how</em> the system works, rather than just <em>if</em> the system works. Even if your answers are &quot;not a lot&quot; and &quot;I want it to be automatic,&quot; there are definitely distros for you out there! That said, this guide is mostly aimed at the middle-of-the-road person who wants to use Linux, is okay with some tinkering, but prefers to stay out of the terminal and text configuration files when they can.</p>
<h1 id="hitting-the-books" tabindex="-1">Hitting the Books <a class="heading-anchor" href="#hitting-the-books"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Most of the common Linux alternatives to commercial software are already available on other operating systems. You may even already be using some of it. LibreOffice, Gimp, Krita, REAPER, VLC, OBS, and Sunshine are all tools that are cross-platform. Start using some of these programs before you switch to make that transition earlier. If you have other specific needs, like video or audio editing software, look into cross platform alternatives to use as a bridge between your operating systems as you move over. This stage in the journey is specifically about making sure you have some familiarity with programs that you will probably interface with often so that the burden of learning new things all at once is lessened.</p>
<p>This is a good time to look into the general philosophy of Linux and familiarize yourself with some of the concepts that may be foreign to you if you've never used it extensively before. Here's a few of them:</p>
<ul>
<li>Least Privilege: Users are, by default, not able to access or make changes to important system functionality. They must authenticate again when they want to elevate to Administrator level to make changes.</li>
<li>Everything is a File: The base unit of the Linux system is the File. This includes things you'd expect to be files, like documents or pictures, but it also includes <em>everything else</em> like hardware devices, the RAM, drivers, and programs.</li>
<li>The output of a program is expected to be usable as input for another program: This matters more in the Terminal, but is still useful to know. If you run a program or command and it has an output, that output should be orderly and parsable so that another program could use it. For example, if you use <code>ps</code> to look at running processes on your system, the output should be able to be sent to <code>grep</code> to be searched. A composite command made of multiple sub-commands.</li>
</ul>
<p>Additionally, this is a good time to pick your starter distribution. I say &quot;starter&quot; mostly because you should expect to want to change at some point after you make the switch. There's a few good chances to switch as you move forward. Don't expect to get it perfectly right on the first try. Some things you don't think are important now may end up feeling crucial later. It's important to be okay with trying a few times to get it right. For more on distributions, check out the Ditching Windows primer mentioned above.</p>
<h2 id="know-where-your-data-is" tabindex="-1">Know Where Your Data Is. <a class="heading-anchor" href="#know-where-your-data-is"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>A smooth transition is an organized transition. Use this as a chance to clean up your digital room. It sounds like a chore, but it is incredibly important. Windows and Windows programs love to store things all over the damn place. Now is also a good point to make a backup of your PC if you haven't already. There are two types of people in the world. People who back up their data regularly, and people who haven't lost everything yet. Here's some places to look for data</p>
<ul>
<li><code>C:/Users/&lt;USERNAME&gt;/AppData/</code> - The AppData directory. A hidden folder inside your user folder. Applications sometimes store configuration files or other data here, rather than make it easily accessible. Some applications fully install themselves here, since installing in the Program Files directory requires administrator privileges. Notably a lot of games have started storing save data here.</li>
<li><code>C:/Users/&lt;USERNAME&gt;/</code> - Your User folder. Everyone with an account on your PC has one. Inside are the usual Documents, Downloads, Desktop, Photos, Music, Videos, etc folders where most users will store their stuff. I recommend looking through this one separately from AppData because if you just back up the entire User folder it will take forever (a bajillion tiny files takes a long time to copy, more time than fewer larger files)</li>
<li><code>C:/Program Files/</code> and <code>C:/Program Files(x86)</code> - Where Windows likes to install applications to be used by multiple people. Some programs like to store configurations in their own folders, so it may be worth looking at to pull those out.</li>
<li>Hidden files and folders - Some programs will utilize hidden files or folders to store stuff. You can turn on hidden item visibility in the File Explorer options. If you use SSH for Git, for example, your keys are probably in your User folder in a directory called .ssh which will be hidden.
One last tip for the Gamers: Many games store their saves in your User folder or in AppData, but others have unusual hiding places. Not every game uses Steam's cloud save system, so using a tool like GameSave Manager to back them up is useful. Restoring them is going to be a little complicated, but certainly possible. More on that later, though.</li>
</ul>
<h1 id="the-half-step-four-ways" tabindex="-1">The Half-Step Four Ways <a class="heading-anchor" href="#the-half-step-four-ways"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay, so you've done your research. You have picked a distribution to try. You've even organized and backed up your files. Time to install, right? While this is generally my recommended method, since it removes your old OS as a crutch to go back to and will force you to learn your new environment more quickly, there are a couple ways to make the adoption more gradual, and let you try to find issues before you're stuck on Linux fixing them. There's four ways of doing this. I'll introduce them in order of commitment.</p>
<h2 id="were-doing-it-live" tabindex="-1">We're Doing it Live <a class="heading-anchor" href="#were-doing-it-live"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Nearly all Linux distributions can be tested running live from a USB drive before doing a full install. By default this is a sandbox, a demo that you cannot make modifications to. You'll need to use the provided browser and packaged software, but it will let you test the distribution with your hardware. Make sure Bluetooth and WiFi work. It will also let you build a to-do list of the changes you want to make to the system after install, what software you need to install, that sort of thing.</p>
<h2 id="from-the-machine" tabindex="-1">From the Machine <a class="heading-anchor" href="#from-the-machine"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Another option is to simply try the Linux experience inside a virtual machine, run via any number of virtualization solutions. Keep in mind, though, that performance is likely going to be significantly worse on the Linux VM than if it was running on your hardware directly. You can't easily split your GPU between the VM and the host operating system, so the VM is going to be rendering everything in software.</p>
<h2 id="persistent-isnt-it" tabindex="-1">Persistent, isn't it? <a class="heading-anchor" href="#persistent-isnt-it"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Some distributions allow for a Persistence file to be added tot their Live USB environment. Setting this up is more difficult, varies from distribution to distribution and may not even be possible, depending on what you want to try. My pick for this one is <a href="https://www.ventoy.net/en/index.html">Ventoy</a>. It's a piece of software you install to your external drive that lets you boot disc images by simply dragging and dropping them onto the drive, then selecting Ventoy as the boot device upon startup. You can boot Windows installer images, but also Linux live images and Virtual Hard Disk images. This means you can install whatever OS you want to a virtual machine using freely available virtualization software like VirtualBox and drop the .VHD file from that machine onto your Ventoy USB drive and run that OS as if it was installed locally. Ventoy also supports Persistence files for some Linux distributions, though they haven't been tested very recently. These are chunks of space on the USB drive that the Linux distro live environment can use as if it were the root filesystem, so you can install updates or new programs even on the live USB environment. Ventoy is the option I choose for work when I need to boot over to a recovery image on a computer that is so borked that I can't recover it any other way.</p>
<h2 id="the-double-up" tabindex="-1">The Double Up <a class="heading-anchor" href="#the-double-up"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Finally, the one everyone jumps to right away: Run both operating systems on one (or more) hard drives at the same time, shutting down to switch between them. This is generally easy to set up, allows you to fully utilize your hardware without running off of a potentially slower USB drive, and allows for trying both operating systems in tandem, right next to each other. The basic setup of this is to install Windows, but give it a partition the size of half the drive, then install Linux in the other half afterwards. This is possible, but I don't recommend it. You should probably put each OS on its own drive instead. Windows has a nasty habit of taking over the bootloader sometimes, so putting your Linux install on another drive can prevent that from happening.</p>
<h1 id="doing-it-by-doing-it" tabindex="-1">Doing it by Doing it <a class="heading-anchor" href="#doing-it-by-doing-it"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay so you've decided you want to fully make the jump. Whether this is after testing out a distribution or simply deciding to jump in with both feet, this is where the rubber truly meets the road. Below is a checklist of everything you might need to ensure a successful transition.</p>
<ul>
<li>Back up your data in a readable format - While Linux can often read NTFS drives and even write to them sometimes, I highly recommend converting your external storage to Linux-friendly formats like ext4, exfat, and btrfs. You will lose all of the data on the drive in the format change, so make sure you copy the data off the drive before changing it!</li>
<li>Make a list of all of the programs you will want to use daily. Especially if you are installing on a laptop where you may not always have internet.</li>
<li>learn where the community for your distro hangs out. Many distro communities are very supportive. Knowing where to go for advice is powerful!</li>
<li>Set up a way to document your process. What you install, why you're installing it, what commands you run in the terminal, what guides you follow, etc. The more you can pull offline and back up yourself, the better.</li>
<li>Create a backup of a known-working OS.</li>
<li>Keep an installer USB for your distribution made <em>even after completing the install</em>. Even if you don't need it to completely reinstall the OS, the live environment can be used to fix a broken system. IT's recommended to update your USB at least once a year.</li>
<li>Once you finish the initial setup of your system, make a full backup.</li>
<li>Set up routine off-machine backups. I use Vorta for this, which is a frontend for Borg backup</li>
</ul>
<h1 id="ch-ch-ch-changes" tabindex="-1">Ch-Ch-Ch-Changes <a class="heading-anchor" href="#ch-ch-ch-changes"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Now that you're on Linux, you need to contend with the fact that <em>everything</em> is changeable. If you don't like a part of your experience, it's likely someone else has had the same complaint and you can change it. This is a major boon of Linux, but it comes at a cost: complexity. Under Windows, this isn't so bad because you can't really change anything that is fundamental to the OS. In Linux, though, you can pick and choose very low level components. It is therefore important to consider the kind of philosophy that will keep your system usable as much as possible long term and make it easy for your to understand over time and perform maintenance on. My philosophy on this topic can be boiled down into a few points:</p>
<ul>
<li>Do not use scripts from the internet to make changes unless you know exactly what they do. Same for running random terminal commands.</li>
<li>A useful system is an operational system. Try to maintain system stability above all else.</li>
<li>The system should always trend towards simplicity. Complexity increases the chances of something going wrong.</li>
<li>Good backups allow for experimentation.
These points are not prescriptive. They are merely suggestions, from one user of technology to others. It's very easy to accidentally go overboard with changes on a Linux system. There's always some new shiny thing, whether it's a desktop environment, or program, or whatever. Many of the common pieces of software have been around for a long time for a reason. They don't chase fads, but incorporate features and technologies when they are robust and ready for integration.</li>
</ul>
<p>I of course have not always heeded this advice. I have absolutely annihilated my system before. It's one of the reasons I also tend to recommend not getting super attached to your first ever Linux install. You'll probably make mistakes and that is okay. You'll probably also find a different distro that you like better eventually anyway and want to shop around. That is also perfectly good.</p>
]]></description>
      </item>
    
      <item>
        <title>The Worst Game Jam 4: Devlog</title>
        <link>https://tk-web.quest/blog/the-worst-game-jam-4-devlog/</link>
        <guid>https://tk-web.quest/blog/the-worst-game-jam-4-devlog/</guid>
        <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>This is my first game, so it's natural that this is my first devlog. I've done some game development in the past; but I've never put anything together to a point where I felt comfortable releasing it.</p>
<h1 id="the-history" tabindex="-1">The History: <a class="heading-anchor" href="#the-history"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The projects I've done have always, in one way or another, extended beyond my capability as a programmer or attention span in general. I always hit a block with what I wanted to do, which ended up causing me to give up on a project. While I may sometimes blame the tools I was using, I think more often the issue lies in the mismatch between what I am wanting from the engine and what the engine is supposedly giving me.</p>
<p>My first game development attempt was in Game Maker Studio, I wanted to try to make a sort of demake-slash-spiritual successor to Dark Cloud 2. At the time I was naieve and thought that, yeah it would take a long time, but I could do it. The order in which I was going about adding features was all wrong. Instead of using each feature to learn new concepts, I found myself stumbling about in the dark, unable to figure out why my code wouldn't run. I had a few small successes, but mostly I was trying to build one of the worst possible genres of game as my first ever project. Later, I also tried to start projects in GB-Studio, Inform 7 and Godot, but none of these really worked for me. In a way, the engines were all too robust for the types of things I needed to start out making and not really compatible with what I desired at the time.</p>
<h1 id="the-perfect-tool" tabindex="-1">The Perfect Tool <a class="heading-anchor" href="#the-perfect-tool"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The perfect engine, coding language, or tooling doesn't exist for game development, but there's a lot to be said with finding a tool that meets you exactly where you need to be met in order to achieve success. I used to think that as many handholds as could be provided were what I needed. Pre-made actions for movement, game logic, or even &quot;natural language&quot; coding. What I discovered, though, is that a limited scope, an engine that <em>doesn't</em> do everything for you, and a limited possibility space were the conditions under which I thrived. PICO-8 was an absolute joy to work with. Getting the little fantasy console to do anything felt <em>amazing</em> and the small scope encouraged me to have negative scope creep. The final game ended up being half the planned length and squeaked in just under the token limit. There may be just enough space left in the game for me to go back and add a leaderboard, but I doubt it.</p>
<h1 id="the-token-limit-and-gamifying-development" tabindex="-1">The Token Limit and Gamifying Development <a class="heading-anchor" href="#the-token-limit-and-gamifying-development"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I mentioned the Token Limit before. PICO-8 is a &quot;fantasy console,&quot; with all the limitations that implies. It's intended to be somewhere between a GameBoy and GameBoy Color in terms of capability. Cartridges tend to be 64kb or less, the screen has a resolution of 128x128, the console is able to express 32 colors (though 16 of those are hidden) and the console has a limited built-in sound effects engine and music sequencer. The sprite, map, sound effect, and music storage are very limited unless you start programming &quot;closer to the metal&quot; by interacting more directly with memory. The way PICO-8 surfaces the computational limitations it has is almost entirely through the Token Limit. Everything you do in code uses a certain amount of tokens. Set a variable? That's a token. Create a function? That's going to be more depending on what it does.</p>
<p>At first glance, the token limit is simply a way to keep developers set in their scope. Don't go too big. Don't do too much. Over time, however, I found that the token limit was an excellent teacher. You can see the inefficiencies in your code as you write it because the token counter will suddenly jump up. It encourages you to go back to old code and rewrite it, optimizing it so that it can use as few tokens as possible and ensure you have more space to add features. This constant tug of war with the limitations may sound exhausting, but I found it to be exhilarating. A little game inside the development package for the game I was making. It also gave me hints toward good programming habits generally.</p>
<h1 id="an-all-in-one-development-suite-for-1989" tabindex="-1">An all-in-one development suite for 1989 <a class="heading-anchor" href="#an-all-in-one-development-suite-for-1989"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The other thing that I found extremely charming about PICO-8 is that it is all integrated. The code editor, sound editor, music editor, sprite editor, and map editor are all right there in the UI. Since games are so small and the entire program is so light, it is incredibly snappy. It had modern niceties like copy and paste, syntax highlighting, and helper functions for some common tasks that may not have been available for other consoles of the era PICO-8 is trying to emulate. It loads changes to a game instantly and has great error handling for basic problems. For more difficult to track down bugs, community folks have built upon the built in function to print to an external terminal to make it even more useful. This all-in approach wouldn't work for most game engines, and it isn't perfect here (I mostly used an external editor for my coding) but the built in tools are genuinely very good. The tools being what they are makes me even more excited to get working with Picotron, the fantasy workstation made by Lexaloffle, the developers of PICO-8. It's got the same sensibilities, but with an expanded set of capabilities.</p>
<h1 id="working-under-pressure" tabindex="-1">Working Under Pressure <a class="heading-anchor" href="#working-under-pressure"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>While I felt like the pressure of the jam was useful for me creatively, I think overall a longer, less pressured development period is also good. I did luck out and basically had four days devoid of any distractions to work on it this time. I don't think that will be possible next time. That said, I also now know how to do some basic things in code, so it might be easier to get up and running right away. I think two or three weeks might be my normal sweet spot, but I'll just have to burn that bridge when I get to it. I do also think that it might be nice to do more than two projects in a year, so I'll probably either join a different jam, or start developing projects between TWG jams.</p>
<h1 id="developing-past-challenges" tabindex="-1">Developing Past Challenges <a class="heading-anchor" href="#developing-past-challenges"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>My biggest challenge this jam almost certainly was developing the enemy patterns. I found that I loved working on game feel, but with the way I handled enemy spawning and progression, developing the enemy waves was a slog for me. A good worker never blames their tools, but I think that in this case, I wasn't really using my tools to their fullest. I ended up spawning enemies via huge blocks of function calls, inserting starting positions and speed values into them. It made making changes to them extremely fiddly and boring. Lots of changing a tiny value here and there to hopefully make an encounter more fun. Maybe in the future, I can find a way to develop a tool to make the annoying parts of development less tedious.</p>
<p>I also didn't love the sound effect creation. I felt like I was mostly throwing pasta at the wall until I had something I didn't really hate. I didn't even want to touch the music at all, so I was very relieved when I found the free-use music that I did specifically for PICO-8. It isn't perfect for the project, but it's way better than I would have been able to do, so it's well worth it and I'm endlessly grateful to the folks who made that music free to use.</p>
<h1 id="lets-see-some-fundamentals-out-there" tabindex="-1">Let's See Some Fundamentals Out There <a class="heading-anchor" href="#lets-see-some-fundamentals-out-there"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The part where I think my game shines is absolutely in the game feel department. The basics that make a shmup feel good were important to get right for me, so I put the lion's share of my time into that. Programmatic explosions, tuning the ship movement and collisions, figuring out the perfect fire rates and enemy health values took time, but it was the part of the game I loved most. I feel like I also got the difficulty curve right where I wanted it, although the first and second bosses could have probably been swapped.</p>
<p>I also enjoyed making sprites for the game. I don't think they're particularly amazing by any stretch, but it was still really fun and interesting to do. I'm particularly proud of the boss enemies, who look significantly more polished than the player and smaller enemies. Working within the 16-color limitations and small sprite sizes was really fun, too. Like a smaller, slightly less impactful version of the token limit for code.</p>
<h1 id="cut-it-print-it-put-it-on-a-floppy" tabindex="-1">Cut It, Print It, Put It On a Floppy <a class="heading-anchor" href="#cut-it-print-it-put-it-on-a-floppy"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>That's the end of it, I think. Overall, I really enjoyed my experience and I am already thinking of new challenges to tackle in my game dev future. Look for more TK games coming down the line!</p>
]]></description>
      </item>
    
      <item>
        <title>Wake Up Dead Man: Smarmy Title Goes Here - A Review</title>
        <link>https://tk-web.quest/blog/wake-up-dead-man-smarmy-title-goes-here-a-review/</link>
        <guid>https://tk-web.quest/blog/wake-up-dead-man-smarmy-title-goes-here-a-review/</guid>
        <pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I have never been much of a movie buff. I don't tend to read reviews or go see new films often. My medium of choice is definiely video games, but every once in awhile, I end up watching a movie with my wife or something comes along that I am truly interested in. Of all movie genres, detective mysteries and heists are my favorites. I find the two to have interesting parallels and enjoy the tension between what is shown to the viewer obviously, what is shown subtly, and what is hidden altogether. It is in this aspect that I particularly love <em>Wake Up Dead Man</em>, the third movie in Rian Johnson's <em>Knives Out</em> series.</p>
<p>While we all love Benoit Blanc, the heart and soul of the first <em>Knives Out</em> is Marta. The magic trick in <em>Knives Out</em> is moving the focus from the Detective to the Sidekick, a lesson that Sir Arthur Conan Doyle displayed very well in his Sherlock Holmes stories and a lesson that almost all adaptations of those characters forget. Perhaps a larger focus on Blanc is why I found <em>Glass Onion</em>, the second film to work so much less for me. While Helen is there, and does add an interesting wrinkle to the mystery, the focus is much more squarely on Blanc. The heart of the movie is a mystery that is wrapped up in layers of intrigue to make it seem more interesting than it is, but really it's a stupid premise that should never have taken a famous detective to figure out in the first place, something that the movie itself calls out.</p>
<p>Thankfully, Johnson has come back with a heater. Blanc is here and I appreciate him greatly, but Father Jud is absolutely where the movie shines, often literally. The mystery is a fun &quot;impossible&quot; murder, but the true soul of the movie is absolutely in the tension between Father Jud and the rest of the cast. His faith and his decisions to put the mystery aside in favor of the things he feels he must do to try to break down the conservative fortifications surrounding the church and meet people where they are is, in some strange way, a double negative of playing the priest character against the type commonly seen in media which itself is a response to how a priest <em>should</em> act. It would have been so easy for this movie to fall off of the knife's edge and come down on the side of ebing either overly cynical or not cynical enough when it comes to faith and religion, but I ended up very happy with where the movie landed, with an indictment of the conservative isolating philosophy of right-wing and facist politics backed by religion while still holding space for religious people to practice their religion productively, peasefully, and without disruption. For some, this may come off as a prescriptive way to look at religion; &quot;This is the only correct way to do it&quot; etc. I see it as more of a display of the consequences of trying to bring people together through hate.</p>
<p>Beyond the story as told directly to us, I greatly appreciated all of the small details on display here. It truly felt like a return to form as the mystery began clicking into place. I feel like, while there were twists and turns, this absolutely did not feel like a mystery with a sudden &quot;gotcha&quot; at any point. While I won't go into much detail here as to avoid ruining the surprise, I will say I loved all of the various setups and payoffs as the story wound towards its conclusion. It truly felt like there were no dead ends, even with the mystery being a variant of the &quot;locked room&quot; style. Like with the first Knives Out, I feel like I will enjoy it even more the second time.</p>
]]></description>
      </item>
    
      <item>
        <title>Ditching Windows: SteamOS, Bazzite, and Linux</title>
        <link>https://tk-web.quest/blog/ditching-windows-steamos-bazzite-and-linux/</link>
        <guid>https://tk-web.quest/blog/ditching-windows-steamos-bazzite-and-linux/</guid>
        <pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>As Windows 11 updates have continued to have increasingly damaging bugs, I have started to see more and more people interested in taking the plunge into Linux and having a fair amount of confusion about what they need. On the one hand, I love to yap and will happily repeat my takes as often as needed as a Linux supporter and enabler, but on the other, it would be nice to have a central place to put those thoughts in case I can't type it all out right away. Then, if someone has questions after, I'd be happy to answer them. So, without further ado, let's get into it.</p>
<h1 id="the-background" tabindex="-1">The Background <a class="heading-anchor" href="#the-background"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<h2 id="bazzite-steamos-mint-cachy-what-even-are-these" tabindex="-1">Bazzite? SteamOS? Mint? Cachy? What even are these? <a class="heading-anchor" href="#bazzite-steamos-mint-cachy-what-even-are-these"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>You just named four <strong>Distributions</strong>. GNU/Linux itself is just the kernel, the very basic chunk at the center of the operating system that performs the most basic functions of the OS that the rest of the software builds on top of. A distribution is the bundle of other software that makes up the operating system. It will include low-level stuff, like video drivers, but also the desktop environment and basic applications, like a file explorer, web browser, or office software. Any piece of software in Linux is called a <strong>Package</strong> and distributions include different packages based on what their goals are as an operating system. An OS aimed at penetration testing (Think hacking but for good) is going to need different tools than an OS aimed at daily use or one aimed at gaming.</p>
<h2 id="okay-so-whats-the-difference" tabindex="-1">Okay, so what's the difference? <a class="heading-anchor" href="#okay-so-whats-the-difference"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Distributions will generally take one of a few different positions when it comes to package releases. Thankfully, we have a nice variety of common examples up above, so let's go through them one at a time.</p>
<h3 id="rolling-release" tabindex="-1">Rolling Release <a class="heading-anchor" href="#rolling-release"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>A <strong>Rolling Release</strong> distribution like EndeavourOS, Arch, or Cachy OS, tends to use the most up-to-date versions of packages. The idea is that an up to date system is going to be more stable, secure, and feature rich than an out of date system. Therefore, Arch and other rolling release distributions will test and ship the latest versions of packages as they come out, with no holding of anything back to be grouped together in a larger periodic release. For these distributions, there is no version number. I run EndeavourOS, not EndeavourOS 25.10 or what have you. The downside to this approach is that a system that isn't being actively used and maintained will go out of date and then break. Updates to packages are meant to be applied one after another. Skipping versions can be damaging to the system and cause the system to stop functioning as expected. If you aren't comfortable with turning on the computer once every couple weeks to make sure you're applying all the latest updates, then skip this release style.</p>
<h3 id="periodic-release" tabindex="-1">Periodic Release <a class="heading-anchor" href="#periodic-release"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>Mint, Ubuntu, Debian, Fedora, and many other distributions use a <strong>Periodic Release</strong>. Every six months or so, a new version will come out with major changes to many packages all at once. Packages can be updated between major release versions, but anything that makes major fundamental changes to the system will often be held back to be applied all at once during a version upgrade. These distributions tend to focus on very long term support and ensuring an out-of-date system will still function. Major upgrades can break things, but packages tend to undergo more significant testing to make sure everything will work on the other side of the upgrade. The downside here is that, due to the longer testing period and the general attitude towards updates, packages are more likely to be out of date even after running a package manager upgrade command.</p>
<h3 id="atomic-distribution" tabindex="-1">Atomic Distribution <a class="heading-anchor" href="#atomic-distribution"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h3>
<p>SteamOS, Fedora Silverblue, and Bazzite all take the periodic release schedule one step further and are released as <strong>Atomic Distributions</strong> Atomic distributions are built such that everyone who is running a particular OS version is running the exact same set of packages. Not just the packages themselves, but the same <em>versions</em> of them. An atomic distro uses layers of access to ensure that the system remains unchangeable to the user. These distributions make great use of <strong>Containerized Applications</strong>, which are a format for applications where all of the applications' dependencies, the packages that application needs to run, are packed into a little sandbox with the application itself. Common formats for this are <strong>AppImage</strong> and <strong>Flatpak</strong>. These systems are very resilient to breakage, but the isolated system environment means the distribution must include drivers by default because the user can't install them. If your hardware isn't supported, then you'll have to hope they add that support in the next release. You can't add the package yourself. They are also very easy to support, though, since every computer running the distro will be running the exact same set of packages.</p>
<h1 id="the-advice" tabindex="-1">The Advice <a class="heading-anchor" href="#the-advice"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>This advice might be a little bit underwhelming, because unlike Windows and MacOS, there's so much variety to be had. No shoe fits every foot, and no Linux distribution is good for everyone. Differences may be slight, but I feel like I've landed on a pretty good breakdown here.</p>
<h2 id="i-want-as-console-like-of-an-experience-as-i-can-no-tinkering" tabindex="-1">I want as console-like of an experience as I can. No tinkering. <a class="heading-anchor" href="#i-want-as-console-like-of-an-experience-as-i-can-no-tinkering"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>No solution will be completely tinker-free, but the closest you can get is an Atomic Distribution. <strong>Bazzite</strong> is my pick here. SteamOS may come along and be better <em>eventually</em> but currently, SteamOS's support is very limited to Valve's own hardware, with a few very minor exceptions. If you don't use your gaming PC super regularly, then this is a great option. Updates still come somewhat regularly, but are inclusive of the entire OS, so an update is very unlikely to break your PC. There will be fewer applications available to you, but Flatpak and AppImage are both very well supported, so all the basics are there.</p>
<h2 id="okay-i-can-tinker-a-little-bit-but-i-still-want-something-easy" tabindex="-1">Okay, I can tinker a little bit, but I still want something easy. <a class="heading-anchor" href="#okay-i-can-tinker-a-little-bit-but-i-still-want-something-easy"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Have no fear. <strong>Linux Mint</strong> is here for you. It's based on Ubuntu (unless you get the Debian Edition) which is based on Debian. It uses a Periodic Release schedule. Since it's a couple steps removed from the original distribution, packages tend to be out of date, but the system is very stable and the community is world-class. It will be very easy to get help with a Mint system if anything goes wrong and even if you can't find help in the Mint community, you have the underlying Ubuntu community to help as well. The support structure is excellent.</p>
<h2 id="but-i-hear-cachy-is-good-how-much-tinkering-is-there-really" tabindex="-1">But I hear Cachy is good? How much tinkering is there, really? <a class="heading-anchor" href="#but-i-hear-cachy-is-good-how-much-tinkering-is-there-really"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>You're right. <strong>Cachy OS</strong> is what Wendell at Level 1 Techs is recommending for folks to get into gaming on Linux and one of the options that GamersNexus is using in their Linux benchmarks. Cachy is an Arch system that uses a rolling release schedule. The default applications are sensible for someone who may be new to Linux, but has technical experience. You get a package manager with a UI, my particular favorite desktop environment, and extremely good application availability through the <strong>Arch User Repository</strong>. If you can't find a package through the official repositories, someone has probably made a build file for it and stuck it in the AUR. Because the system is Arch based, the Arch Wiki is an extremely good resource and the community is generally pretty good as long as you don't do things that are against the recommendations set by the wiki and community. Things that can lead to a nonfunctioning system will be called out immediately. You will need to routinely get updates from your package manager, and maintain an up to date backup, but otherwise a stable system can last basically forever.</p>
<h2 id="are-there-any-distros-you-should-avoid" tabindex="-1">Are there any distros you should avoid? <a class="heading-anchor" href="#are-there-any-distros-you-should-avoid"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Yes, actually. There are a couple of red flags in a distribution to me. The biggest is how much control the team exerts over including packages in the default repositories for the distribution. If the team insists on testing packages when their distribution is based on another one, then that means things are more likely to get out of date because the bigger upstream distribution has the larger community of contributors and testers to make that work. A downstream distro won't. The other red flag is more conditional. If the team exerts a lot of control and is also small, that's a big no from me. Smaller teams tend to be more opinionated, so if they also exert a lot of control over the packages, you can be sure that things will be out of date and your system is more prone to breakage.</p>
<h2 id="so-what-do-you-use" tabindex="-1">So what do you use? <a class="heading-anchor" href="#so-what-do-you-use"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>None of the above, actually. I use <strong>Endeavour OS</strong>. While it is <em>technically</em> its own distribution, it would be more accurate to say that it is Arch Linux with an install script to make getting up and running with a functional system significantly faster and easier. I get package updates pretty quickly and haven't had anything seriously break in an unfixable way yet. Endeavour is <em>NOT</em> for everyone though. They do not offer or support Package manager front-ends. The idea is that users of the OS should be comfortable in the terminal and to keep their system up to date, they need to be updating through the terminal. You can install a GUI package manager frontend if you like, but don't expect support.</p>
<h1 id="some-notes-on-hardware" tabindex="-1">Some Notes on Hardware: <a class="heading-anchor" href="#some-notes-on-hardware"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<h2 id="ive-heard-nvidia-gpus-suck-on-linux-is-my-existing-gaming-pc-cooked" tabindex="-1">I've heard nVidia GPUs suck on Linux. Is my existing gaming PC cooked? <a class="heading-anchor" href="#ive-heard-nvidia-gpus-suck-on-linux-is-my-existing-gaming-pc-cooked"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Not at all. Linus Torvalds (the guy who primarily developed the Linux kernel and still maintains it) has a bone to pick with nVidia specifically because they refused to make open source drivers for their hardware. AMD and Intel do, so the Linux community writ large has an easier time contributing to and supporting hardware from those companies. nVidia, however, insists on not providing completely open source drivers. There was some movement on this a few years ago when nVidia open sourced their kernel module. However, much of the driver remains closed source and stored in firmware, so it's of little use. This means that support for nVidia hardware <em>is</em> worse, but the closed source drivers are still available and generally reliable. You won't get <em>quite</em> as good of performance as you might on Windows, but it isn't like your system will be completely unusable. <strong>I would still recommend moving to Intel or AMD for your next upgrade though</strong>.</p>
<h2 id="im-looking-into-a-pre-built-pc-whats-hardware-support-like" tabindex="-1">I'm looking into a pre-built PC. What's hardware support like? <a class="heading-anchor" href="#im-looking-into-a-pre-built-pc-whats-hardware-support-like"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Great question! This one has three answers. The first is that building the PC yourself is almost always going to yield the best results. Linux maintainers and developers like to build their own systems, so the support generally is better. Stick to mainstream off the shelf parts and you will be fine. There's plenty of great build guides on pcpartpicker or various YouTube channels. It can be intimidating at first, but it is very rewarding and often less expensive to do it yourself.</p>
<p>If you are looking at a <strong>System Builder</strong> like Maingear, Microcenter, iBuyPower, etc, then hardware support is going to be basically the same as if you had bought individual components and built the PC yourself (ie: very good.) That's because that's exactly what these companies do.</p>
<p>If you are buying something from a <strong>System Integrator</strong> like HP, Dell, Beelink, and the like, hardware support is usually fine, though you might run into some hiccups. These companies design and construct their own motherboards and sometimes other components specifically to fit the form factors they aim for. Sometimes they also get semi-custom CPU or GPUs because they make deals with AMD, Intel, or nVidia to get exactly what they need to hit their price and performance targets within their size, power, and cooling restrictions. This bespoke hardware is less well documented and the manufacturers have no vested interest in supporting Linux at all, so they often don't provide Linux drivers or software which means the Linux community tends not to support them back. The only exceptions to this are <strong>System 76</strong> and <strong>Framework</strong>. Both companies directly support the Open Source community, even if one of them (<em>cough</em> Framework) might also support racist assholes in the community. Generally, it is best to do a lot of research on the exact thing you want to buy and whether or not folks have been successful in running Linux on it before purchasing.</p>
<h1 id="questions" tabindex="-1">Questions? <a class="heading-anchor" href="#questions"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Feel free to shoot me a message via <a href="/pages/contact/">the Contact form</a> and I will expand this guide with answers (and reply directly, of course.)</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #19</title>
        <link>https://tk-web.quest/blog/weeknotes-19/</link>
        <guid>https://tk-web.quest/blog/weeknotes-19/</guid>
        <pubDate>Mon, 08 Dec 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<h1 id="tinkering" tabindex="-1">Tinkering <a class="heading-anchor" href="#tinkering"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I set up Bazarr (and necessarily Radarr and Sonarr) this week to download subtitles for my library automatically because the plugin for Jellyfin isn't very good for it. The uptake was pretty good, but I'm not sure how many of the subs are accurate. Hopefully my continued testing will show that they are good enough for me to ditch Plex entirely.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Yakuza Kiwami: I tied a bow on this remake of the first Yakuza game. Overall, I really enjoyed myself with it. I did feel like it felt a lot more like a PS2 game than Yakuza 0 did. It's not surprising, but it was an interesting feeling to have. I felt myself drawn to the side stories significantly more strongly in this game than games previous. I think that might be because I wasn't quite getting the story I loved in Yakuza 0 and Yakuza Like a Dragon from the main path. I'm sure I will get more of that as time goes on, though.</li>
<li>Starship: This is the port of StarFox 64 from Harbour Masters 64, the Ship of Harkanian developers, using their Libultraship framework. I played it on my PC and it was flawless. I did a nice run though the hard path and enjoyed it a lot. I'm excited to see how the modding scene around it develops.</li>
<li>Spaghetti Kart: The port of Mario Kart 64 also based on the work done by Harbour Masters 64. THis one is a lot earlier and more barebones, with very little mod support or enhancement beyond a higher resolution. Playing through one cup has me re-affirming that I don't actually like MK64 all that much. I don't love the driving model and feel like they improved the game feel immensely between MK64 and the next one I played, Mario Kart DS.</li>
<li>2 Ship 2 Harkanian: The Majora's Mask port <em>also</em> also developed by Harbour Masters 64. This time I played a randomizer. Majora's Mask especially feels extremely good as a randomizer game. There's more zones locked behind more specific checks, but there's so many sidequests and minigames that it doesn't feel quite so linear. I'm very excited for more of the randomizer options to come to MM that have been so good in the Harbor Masters 64 port of Ocarina of Time. Hopefully we eventually also see multi-game/combined rando, which would be <em>amazing</em>.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Twin Peaks: My wife and I finally finished the series. We enjoyed it a lot, but I wasn't super enamored with the ending. I don't think I need to read the extra stuff around the series, and I don't love the scale shift between the original series and the Return, but I did still enjoy myself. It's a shame that it left me with more questions than answers and not enough context to develop my own theories to a point of satisfaction.</li>
<li>The Fantastic Four: First Steps: The latest in Disney-Marvel's output headed towards the next Avengers movie. I'm currently very lost/behind on the multiverse of it all, so it's nice to have a movie set in an alternate universe that doesn't rely on the entire weight of the rest of the movies. I'm not really excited for an eventual return to the Avengers, but I do find most of these movies fun as popcorn brain-off entertainment. It did somehow make me interested in going back to watch Thunderbolts and the latest Captain America, but I probably won't dig into that hole.</li>
<li>Mobile Suit Gundam Wing: I'm 16 episodes into the series now and really enjoying it. I can't believe I'd never actually watched it before. There's a lot to love about the characters and the series. I think I'll reserve further thoughts until later, since there's still a long way to go. So far, though, I'm stoked to see where it goes, knowing what I already do about the series.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #18</title>
        <link>https://tk-web.quest/blog/weeknotes-18/</link>
        <guid>https://tk-web.quest/blog/weeknotes-18/</guid>
        <pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<h1 id="tinkering" tabindex="-1">Tinkering <a class="heading-anchor" href="#tinkering"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I updated the <a href="/pages/uses">Uses</a> page. It's now a little longer and more detailed.</li>
<li>I also updated the <a href="/pages/connections">Connections</a> page with some of my own projects. Probably not anything new to anyone here, but might be nice to have all in one spot.</li>
<li>Did the network swap at the new place. Still running into severe signal issues at the new &quot;office&quot; location. I'm going to see if I can use an old AP as a repeater, but initial results suggest not.</li>
<li>I'm doing some looking into Subtitles options for Jellyfin. The OpenSubtitles plugin straight up doesn't do anything, so I'm looking at bazarr.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Yakuza Kiwami has been taking most of my gaming time this week. I've been doing a <em>lot</em> more sub-stories in this game. The Trouble Finder accessory is helping a lot with that. I'm 5 chapters in, and really enjoying it.</li>
<li>I have <em>nearly</em> conquered the Basic Tours in Ridge Racer 2 PSP. The last few races are really putting a damper on my progress. I might have to look at some strategies for them.</li>
<li>I played the first half hour or so of Valkyrie Profile: Lenneth for the PSP this morning. I like it, but it's very slow. I might swap to emulation just to have a fast forward throttle.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Got up through episode 8 of Twin Peaks the Return this week. I'm having a good time, but the thing is grade A crazy. I am really hoping I get any closure at all, even if I have to pull it from vagaries and assumptions.</li>
<li>Not started yet, but I'm going to be picking up Mobile Suit Gundam Wing this week, to watch along with Bluzo a bit. I'm looking forward to it!</li>
<li>I've been watching some of the Game Changer that I hadn't had access to before. I think alongside Taskmaster, it is one of the most interesting game show concepts I've ever seen and I love it a lot.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #17</title>
        <link>https://tk-web.quest/blog/weeknotes-17/</link>
        <guid>https://tk-web.quest/blog/weeknotes-17/</guid>
        <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>A light week for notes. I'm still unpacking and settling in at the new place. Publishing these a little late because I ended up with less energy to write them than I thought.</p>
<h1 id="tinkering" tabindex="-1">Tinkering <a class="heading-anchor" href="#tinkering"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I finally plugged in the big network switch I got from a coworker. I don't think it's going to be a good fit. It's just too loud.</li>
<li>The wifi situation is awful at the new place and there's no good way to get ethernet by the desk. Looks like I'll be spending a little time working out a longer-range wifi setup. I've still got the network equipment from the old house, so maybe I try that stuff first and if it doesn't work straight away we get a second AP to use as a bridge or repeater.</li>
<li>I upgraded my editing process for the podcast. It won't help in every episode, but for those it will help, the process improvements will make it significantly faster to edit. A massive thanks to Mike over in the TWG discord for his excellent guide.</li>
<li>Speaking of the podcast, it's got a <a href="https://twcr-radio.online/">snazzy new site!</a> A huge thanks to AJ for helping us with the move to <a href="http://Transistor.fm">Transistor.fm</a>!</li>
<li>I haven't started in earnest yet, but I did download the slicer for my dad's Prusa 3D printer. I'm excited to start making things with it.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Finished Alan Wake II and really enjoyed it. I really like what they're doing with cyclical storytelling here. I also love the dig at generative AI in the Lake House DLC. The entire thing makes me super excited to see what Remedy does next with Control.</li>
<li>Started Yakuza Kiwami. My initial impressions are gneerally positive. It feels a lot faster and breezier than Yakuza 0 and Yakuza Like a Dragon, but my one big pain point remains from Yakuza 0 in that bosses are extremely spongey.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>We've started Twin Peaks the Return. We're four episodes in and I am liking it a lot while also feeling like Lynch is taking things even slower than he did in the first two seasons. I'm sure we won't get explanations for everything, but I'll be excited to get whatever we do get.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Desert Island Questions</title>
        <link>https://tk-web.quest/blog/desert-island-questions/</link>
        <guid>https://tk-web.quest/blog/desert-island-questions/</guid>
        <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post was originally written for Joel's collaboration post. You can read all of the other entries <a href="https://joelchrono.xyz/blog/">there once it's live</a>.</em></p>
<p>The ever-classic &quot;What would you bring to a desert island?&quot; question is one I have never had an easy time answering. I am pragmatic to a fault and so if I am ever faced with this question, my mind immediately jumps to all of the surrounding questions about the practicality of such an endeavor. A &quot;desert&quot; island implies a small enough island as to never receive a meaningful amount of fresh water, with no trees or other natural resources to sustain oneself, yet there must be a structure of some kind, even if it is simply a television plugged into the sand in order for the thought experiment to work. My concern, then, is less about the video game itself, and more about what video game would offer the most benefit practically to me in that situation. Entertainment is important, of course, but survival is paramount. The question becomes &quot;What game can offer me the best chance of survival?&quot;</p>
<p>Unless, of course, the starvation and slow death is a part of the entire point. With no resources and no hope of rescue, the only solace you have left is a game. The ultimate art form of distraction and time-wasting, now there to help you forget your empty stomach and cracked lips. The question then becomes &quot;What game do I want to die with?&quot;</p>
<p>Then, the question becomes less about the practicality of everything. You get the asker to make concessions: &quot;yes, you have food, water and shelter,&quot; &quot;no there's no hope of rescue,&quot; &quot;yes there are natural resources to build things out of,&quot; &quot;no there is no electricity other than what is needed to run the game,&quot; on and on. The problem becomes one of context and holding something to a high pedestal. But a perfect game doesn't exist. Nothing will be good forever. There is no <em>Citizen Kane</em> of anything. Even <em>Citizen Kane</em> isn't <em>Citizen Kane</em> forever and without context. The question becomes &quot;What is the perfect game?&quot;</p>
<p>None of these questions have an answer. Not a good one. Not a satisfying one. In a way, that's the point. There is no world in which someone doesn't come to regret their choice eventually. Even if they could look at all of the parallel realities and determine that, yes, this game would give them the most enjoyment out of any option. There is no better one. Eventually they will come to resent the game. Hate the game. Discard it. It's a symbol of how you can never pick the right thing. Never pick the perfect thing. The question itself becomes torture for the soul.</p>
<p>So I'd pick <em>Dark Cloud 2</em>.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #16</title>
        <link>https://tk-web.quest/blog/weeknotes-16/</link>
        <guid>https://tk-web.quest/blog/weeknotes-16/</guid>
        <pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<h1 id="weeknotes-returns" tabindex="-1">Weeknotes Returns! <a class="heading-anchor" href="#weeknotes-returns"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>It has been a long few months, but I am happy to say my Weeknotes are back! It has been quite the journey since last I wrote, but here's the short version. As mentioned in <a href="/posts/2025-05-16-newsite/">the How Taming Knots Works</a> post, Taming Knots is a folder of markdown files that <a href="https://gohugo.io">Hugo</a> converts into pretty, static HTML for me. Previously, this was all happening through GitHub Actions and deployed to GitHub Pages. I want to eventually move off of GitHub as much as I possibly can, so I have tried a few different things. I tried moving to <a href="https://docs.codeberg.org/codeberg-pages/">Codeberg Pages</a>, I tried to move to <a href="https://about.gitea.com/">Gitea</a> and use their Actions pipeline to deploy to <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>. I even looked at GitLab for a bit. Eventually though, I decided the juice wasn't worth the squeeze right at this second and that the tinkering was getting in the way of the writing, so I settled everything back down into a setup where I feel like I can move away easily if I need to, but also I can continue to write while I do more research on a better option long term. Taming Knots is still a bunch of markdown files that get uploaded to a Github Repo, but now instead of building and hosting through GitHub, I have Cloudflare Pages watching for changes to the repo and building and deploying the site when it detects a commit. Being on Cloudflare means that I can easily pull the Github piece out and replace it with GitLab if I so choose or I can use any other &quot;Actions&quot; style worker to run Cloudflare's Wrangler tool to package up and deploy the website from many other code ops platform, including Gitea which may make a comeback eventually. All that to say I basically made a big loop, but now I feel more ready to go on the second journey eventually.</p>
<h1 id="moving" tabindex="-1">Moving! <a class="heading-anchor" href="#moving"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Another reason my weeknotes have lapsed is that I'm moving! We are selling the house out in the boonies and moving to a much more affordable place for the next year or two. As you can imagine, packing up the entire house and getting it ready for sale is taking up a lot of my time. Thankfully, this stress will be significantly lessened soon, so my weeknotes and other writing can resume.</p>
<h1 id="projects" tabindex="-1">Projects <a class="heading-anchor" href="#projects"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I've finally gotten my home server into a spot I'm really happy with. I hope it's easy for me to quickly set back up post-move. I've set everything up to be fairly portable. You can read more about it <a href="/posts/2025-10-30-the-home-server">In my Home Server post</a>.</p>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Alan Wake II - I've been really enjoying this one. I love the wide variety in tones that are clearly separated by the characters. Having one character working with a more unsteady and often silly tone while the other does very serious, intense investigation is a fantastic combination.</li>
<li>Easy Delivery Co. - When I don't have the brain power for Alan Wake, I've been playing this fun winter delivery game. It's got fun physics and definitely fits into the &quot;drive a shitty car&quot; genre of vehicle games that I enjoy so very much.</li>
<li>Ridge Racer 2 - A game for when I truly do not want to have to use brain at all. Cars go fast. Do cool drifts. My PSP is so pretty.</li>
</ul>
<h1 id="reading" tabindex="-1">Reading <a class="heading-anchor" href="#reading"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Still working my way through <em>House of Leaves</em> by Mark Z Danielewski. I'd estimate I'm about a third of the way through it. It's tough to tell becuase there's a lot of flipping back and forth.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Twin Peaks - Emily and I have finished the first two seasons and the movie. We talked about it <a href="https://twcr-radio.online/episodes/sexual-maturity-combined-with-superhuman-strength-makes-mike-a-sub">On the podcast</a> for a few hours. I'm excited to get back to it and watch The Return.</li>
<li>City the Animation - Still plucking away at this. It's extremely good, I just haven't gotten to it as often as I'd like.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>The Home Server</title>
        <link>https://tk-web.quest/blog/the-home-server/</link>
        <guid>https://tk-web.quest/blog/the-home-server/</guid>
        <pubDate>Thu, 30 Oct 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Long time no see!</p>
<p>I've heard enough interest in the fabled home server that I decided I'd like to push a little update to the blog about it, especially since I am <em>finally</em> at a stable spot with it where I feel good about all of the services and features I have implimented. I don't forsee myself rolling out any new services or tools in the near future and I have figured out solutions to some of the gaps I had in my setup so now I'm fully ready to share.</p>
<h1 id="why-the-home-server" tabindex="-1">Why the Home Server? <a class="heading-anchor" href="#why-the-home-server"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>My reasoning for doing a lot of this work myself comes down to a few key points. One huge one is the feeling that I have, over the years, given up a ton of ground to various corporate interests in my digital life. All my personal photos were in Google's hands, my music tied up in subscriptions, video transiently floating between streaming services, and all of my documents and notes were in proprietary formats tying me down to specific software or web services. While it felt like the data was <em>safe</em> in many of these locations, it also felt like it could be very easily leveraged for tracking, advertising, and that my data wasn't really mine. How useful is a pen if you can only use it on the paper sold by the pen company? Another reason I went down this road is that I'm a cheapskate. I don't like spending $15/mo for Amazon Prime, $18/mo for Netflix, $23/mo for YouTube Premium (which includes YouTube Music) and $100/yr for Google One cloud storage, among other things and even after all that have to deal with the inconviniences that come with the DRM involved, managing numbers of devices on the streaming services, having content go in and out of availability, not being able to mix local media libraries with the streamed ones, and having limits to my file storage. The final and biggest reason to make a home server for me personally, is that I'm just plain interested in it. I like doing the management and tinkering to get everything working just right.</p>
<p>So then, my plan was to have a server with several terabytes of redundant storage, that can serve video and music over the internet, can be a repository for all of our family's photos, can act as a general-use file server, and that is backed up offsite so that I can follow data security best practices. I'm happy to say that I've achieved that goal and it even has a few tricks up its sleeve.</p>
<h1 id="layer-0-the-hardware" tabindex="-1">Layer 0: The Hardware <a class="heading-anchor" href="#layer-0-the-hardware"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>While just about any computer can be a home server, from a raspberry pi with an external hard drive to a monstrous JBOD (Just a Bunch of Disks) intertwined with a compute server with multiple CPUs and 128GB of RAM, my goal is simple enough that I was able to take common home PC parts and assemble a server on a budget.</p>
<ul>
<li>CPU: Ryzen 5 1600</li>
<li>RAM: 16GB DDR4, 2400MT/s</li>
<li>SSD: 128GB PNY SATA</li>
<li>HDD: 3x 4TB Seagate BarraCuda 7200RPM</li>
<li>GPU: The cheapest possible GPU I could find to let the CPU boot because the Ryzen 1600 doesn't have an onboard one.</li>
</ul>
<p>For the case, I went with the cheapest I could find on Newegg, a $20 mid tower that is a nightmare to work in, but is cheap and holds the parts. None of this hardware was top of the line when I got it and none of it needs replacement quite yet. It's all connected to an ITX motherboard, which is only a problem because it only has 2 RAM slots, so if I want to upgrade I can't just buy more of the same modules. I have to get whole new ones.</p>
<h1 id="layer-1-operating-system" tabindex="-1">Layer 1: Operating System <a class="heading-anchor" href="#layer-1-operating-system"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>There's a few operating system options for home servers. I started my journey with a Windows Server installation. Quickly, though, I found that Windows was not really suitable for the kind of setup I wanted. I didn't want to have to access the server remotely with Remote Desktop. My next stop was an Ubuntu server. Again, I was stymied by the interface, which required too much management via command line interface than I was ready to accept at that time. My next port of call was Unraid. Finally, a Network Attached Storage-focused opoerating system. I liked Unraid a lot. It ran off of a USB stick, was available on the web aywhere in the network, and had support for Plex, the primary service I wanted the server to provide at the time. In the end, though, Unraid just wasn't really cutting it.</p>
<p>Finally, though, I settled on TrueNAS Scale, the Ubuntu-based NAS operating system by iX Systems. iX has been making NAS software for ages. TrueNAS Scale is an enterprise-level solution that is free for personal use. I've found that it makes having a complex, robust setup fairly easy as long as you are willing to learn some of the more advanced concepts you will need. The operating system handles backup and network file shares natively for me, with docker containers making up the bulk of the utility that the server provides.</p>
<h1 id="layer-2-network-setup" tabindex="-1">Layer 2: Network Setup <a class="heading-anchor" href="#layer-2-network-setup"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>One of the most complicated things to get your head around when working with a home server is how you want the network to be set up. The most basic setup would be everything hosted and exposed over local IP addresses and ports. This ensures network security, but you have to remember that 192.168.1.50:32400 is Plex, 192.168.1.50:8123 is Home Assistant, etc. Some of these applications can make a handshake with an external service to allow you to access them outside your network with no further setup, like Plex, but for the most part, this limits access to within the network only.</p>
<p>The next tier up of network complexisty involves creating a domain for your local services, but not exposing that domain to the wider internet. This can be done with a combination of a reverse proxy, like Nginx, and a DNS server. A DNS server can be a useful application on its own, so I'll cover that more in depth later. The short of it is that the DNS server rewrites specific domain calls to an IP address. Once the traffic is going to the local IP, the reverse proxy will look at the request's intended destination (the domain you typed) and forward it to the port you set for that domain. For example, a request for <code>http://jellyfin.local</code> can be intercepted and sent to <code>192.168.1.50</code>. The <code>http://</code> at the start means the traffic is going to come on port 80. The reverse proxy is listening there, sees traffic intended for <code>http://jellyfin.local</code> and knows to forward it from its own port <code>192.168.1.50:80</code> to the Jellyfin port, <code>192.168.1.50:8096</code>. From there, a connection is made and your browser is sent the Jellyfin homepage form your home server. Neat, right? Additional proxy hosts can be added so that each different subdomain sends traffic to additional services.</p>
<p>The level I settled on is just above this. Externally accessible services. The setup is similar to the last one. A DNS server and reverse proxy push traffic to the various services, but in addition to that, you buy the domain you're going to use and ensure ports 80/443 are forwarded from your router to the home server so that the reverse proxy can pick up outside traffic. The safest way to do this is to use a tunnel from the external DNS provider (like Cloudflare) and set up SSL on the domains. IN addition, make sure you never forward anything that would be bad to have public unless you also protect it in another way. Everything should be at minimum behind a username and password. There's also other authentication options, like forcing the reverse proxy to ask for a login. I have my services split. Anything that is bad to have public, like the admin console for the NAS itself, is only available on the local network.</p>
<h1 id="layer-3-services" tabindex="-1">Layer 3: Services <a class="heading-anchor" href="#layer-3-services"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Here's the fun part. What the server can actually do. My list of services is pretty tame compared to a lot of home-labbers. I'd like to expand in a couple directions, but that would require more powerful hardware, so this is where I'm at. Here's everything that runs on the server right now.</p>
<h2 id="samba-shares" tabindex="-1">Samba Shares <a class="heading-anchor" href="#samba-shares"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Samba is the sharing protocol primarily used by Windows devices. It's also fairly easy to set up on Linux, thanks to how common it is. My server hosts a few Samba shares, though a couple are now redundant as you will see. First is the Cloud-Data share. This directory is a general-purpose file server. The folder has subfolders for myself and my wife to put documents, notes, and any other stuff we want backed up. Next is the Copypartycfg share. This exposes the config directory for another service on the server, Copy Party. This is explicitly to allow me to configure copyparty easily, since it doesn't have a native TrueNAS app and simply runs as a docker container. Finally, the third share is Media, a folder to store books, music, movies, and TV shows. Being able to add things easily to media libraries as I buy them is important to me, so having a share directly to that folder was very helpful. Finally, there's a fourth share for PC backups. It simply exists as a network endpoint for backing up the desktop PC in the house.</p>
<h2 id="nas-backup-service" tabindex="-1">NAS Backup Service <a class="heading-anchor" href="#nas-backup-service"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>I use Storj for backup. It has similar uptime to other S3 storage providers like Backblaze or Amazon Web Services, but is significantly cheaper for my specific use case. I'm not currently backing up my largest files, being TV and movies, since it is easy to re-download those, but I may add them in the future. The server backs itself up automatically once a month currently, but I may increase the frequency depending on how it goes and how much they charge for the higher frequency. They charge a little more for pulling data out, but I think it's worth it.</p>
<h2 id="pc-backup-service" tabindex="-1">PC backup service <a class="heading-anchor" href="#pc-backup-service"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>While it doesn't technically run on the server, the server receives the backup files generated by Vorta, which is a GUI frontend for Borg backup. Vorta runs once a day, backing up all of the important things from my desktop- to the samba share endpoint. It also handles the pruning of old backups and backs up as a delta, basically only backing up the changes since the last backup unless the last full backup is out of date.</p>
<h2 id="network-services" tabindex="-1">Network Services <a class="heading-anchor" href="#network-services"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>These are the basic bones that make everything else work. Cloudflared maintains the Cloudflare Tunnel to my external services, and then I have a reverse proxy to allow external traffic.</p>
<h2 id="plex" tabindex="-1">Plex <a class="heading-anchor" href="#plex"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Plex is likely leaving my setup soon because I hate nearly every change they make to the web or smart TV applications. Plex is a media server, hosting on-demand access to movies, TV shows, and music that are hosted on the server. Plex is free, with an optional subscription or one-time payment for a lifetime license to the paid features. I don't really use the paid features, but I have used and liked the software for more than ten years, so I think it's fair to pay for the license.</p>
<h2 id="jellyfin" tabindex="-1">Jellyfin <a class="heading-anchor" href="#jellyfin"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Jellyfin is the free and open source cousin of Plex. It does largely the same job, but isn't quite as polished thanks to its noncommercial nature. I believe it is starting to get mature enough, though, to take over Plex's job. It warrants some more testing before I commit.</p>
<h2 id="calibre-web-automated" tabindex="-1">Calibre Web Automated <a class="heading-anchor" href="#calibre-web-automated"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Calibre is a piece of free ebook library management software, but it was built for a time when folks would just run it on their computer and hook up their e-reader via USB. Calibre Web is a wrapper around Calibre that allows the default interface to be available via a website. Calibre Web Automated is a significantly improved version with a web-first approach. It can be added as an online library to most e-readers, allowing you to host books on the server and download them as-needed to your devide. It makes having a huge library or a device with very little storage much easier to enjoy.</p>
<h2 id="immich" tabindex="-1">Immich <a class="heading-anchor" href="#immich"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>This is the best Google Photos replacement I've ever seen. It handles automatic photo backup from our phones, can generate share links, handles albums and parterner sharing, can import photos from raw files, google photos, or icloud, surfaces all the same metadata Google photos does, replicates Google Photos' motion image features, and will even run facial recognition on the photos so you can make automatic albums for certain people. All for free with no nags or anything.</p>
<h2 id="copyparty" tabindex="-1">Copyparty <a class="heading-anchor" href="#copyparty"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>I was on Nextcloud for a time, but Copyparty does a significantly better job. This file server works as my cloud storage. I have it hosting the Cloud-Data and Media directories and have mounted the server as a WebDAV share in my desktop PC and my phone. Because it hosts WebDAV I can also use it as an endpoint for a community web sync plugin for Obsidian (Remotely Save) which gives me a good replacement for Google Keep and other note-taking apps. It even can host a drop folder so that people can send me files for other projects.</p>
<h2 id="vpn" tabindex="-1">VPN <a class="heading-anchor" href="#vpn"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Finally, a VPN. This lets me get into the network from outside if I need to while also being secure. I don't need it for all the services, but if I need to configure the OS or something, it needs to be there. I use one of the various dynamic VPN services that handles the registration and handshaking of a WireGuard installation without me needing to update everything every time the iP of my home changes.</p>
<h1 id="to-be-continued" tabindex="-1">To be Continued? <a class="heading-anchor" href="#to-be-continued"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>There you have it. The current setup of my home server. If anything major changes, I might come back and write an updated article. For now, as I said, I'm happy with the state of things.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #15</title>
        <link>https://tk-web.quest/blog/weeknotes-15/</link>
        <guid>https://tk-web.quest/blog/weeknotes-15/</guid>
        <pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I know I missed last week and the week before was late. I have had very little time to myself lately.   I'm glad to be back writing though and I even have some additional posts in the works!</p>
<ul>
<li>We're still working on new house stuff, but thinking we will probably end up staying with my parents for a little longer than expected. I'm still cautious, but it's nice to hear folks tell us that what we want is possible.</li>
<li>I successfully deployed Calibre Web Automated this week. The home server is slowly approaching its final form for the time being. Just need to fix FreshRss, figure out a good photos workflow, and roll out AudioBookShelf, then set up backup with backblaze. I have a couple months before my deadline though.</li>
<li>The huge start of school wave at work isn't over, but it has receded a lot. We're now in ticket catch up mode. My queue is still around a hundred tickets, but I'm making progress.</li>
<li>I don't know if it will guarantee me a promotion yet, but the guy directly above me at work is leaving in three weeks. It's sad to see him go, but I'm excited to see if I can capitalize on the opportunity.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Toree 3D: a neat little platformer in the &quot;N64 inspired&quot; category. Solid foundation, but a bit slow. I had a good time, but not as good as the time I had playing</li>
<li>Toree 2: The sequel to Toree 3D with a moderate glow-up. Some new mechanics make it feel better, but not quite as good as</li>
<li>Toree Saturn: The Sonic Adventure-ized version of Toree. An excellent set of mechanics and a massive improvement on many things that were great in the first two games.</li>
<li>20 Small mazes: What it says on the tin. I had a delightful time with this one. Looking forward to Strange Jigsaws later today.</li>
</ul>
<h1 id="reading" tabindex="-1">Reading <a class="heading-anchor" href="#reading"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Oliver VII: I'm early on, but like the style so far. There's not a ton to comment on quite yet.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Continuing with Twin Peaks Season 2. The more I watch, the more soap opera it feels, but I'm still interested in seeing where it goes.</li>
<li>City the Animation: When I catch my wife in the right mood for it, we watch an episode and end up laughing hysterically. If it isn't hitting for you, watch it with someone.</li>
<li>Ferris Beuller's Day Off: One of my comfort films. I still love it a lot. After a very rough week, it was nice to watch something comfortable and familiar.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #14</title>
        <link>https://tk-web.quest/blog/weeknotes-14/</link>
        <guid>https://tk-web.quest/blog/weeknotes-14/</guid>
        <pubDate>Tue, 12 Aug 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>I'm sorry that your RSS reader may have marked all of my previous posts as Unread. As a part of my preparation for moving TK-Web.top away from GitHub permanently, I am now hosting via Cloudflare Pages. This hasn't completely removed the need for GitHub yet. That's going to be a different step. I will absolutely detail the changes to the site when I make that leap. I know Cloudflare isn't really an incredible company, especially with how much of the internet writ large they have their grubby little paws on, but they aren't Microsoft, who announced this past week that GitHub was no longer going to be run independently from the main business. Microsoft is currently a target for the BDS boycott due to their support for Israel's government, which is perpetrating a genocide against the Palistinian people.</li>
<li>I know I'm very late with this week's notes. There was a good reason! Migrating the website was part of it, but here's the other part:</li>
<li>I reinstalled Endeavour OS over the weekend. While I didn't really <em>need</em> to reinstall Endeavour, it's a nice opportunity to make the computer a little more friendly to my wife and reclaim 1TB of storage that was previously allocated to a Windows install. On the new install, I'm back to being all in on KDE. I do miss some of the niceties of Hyprland, but part of being able to support my wife's move to Linux is going to be using the same exact setup she is so I know how to help.</li>
<li>Over at The Worst Community Report, we took over Video Game Podtimism for a week, doing an imitation show. I really enjoyed the recording and editing process. I'm looking forward to the next opportunity we have to ape a network show. It's really fun to completely change format for a week and have something a little looser and free-flowing.</li>
<li>A little over a week from removing YouTube Shorts from my life and I couldn't be happier. On the web, I'm using SponsorBlock, BlockTube, and the uBlock Origin filter <code>www.youtube.com##ytd-rich-section-renderer:has([href^=&quot;/playables&quot;])</code> to block Playables, Movies, and Shorts entirely. On my phone, I'm using Youtube ReVanced with settings added that permanently hide shorts, playables, etc. Sorry <a href="https://www.youtube.com/@itswavelengths">Brendon</a>, but your shorts (which are actually good) are going to have to take the L for the greater good. I'm also blocking a large number of AI music channels via <a href="https://surasshu.com/blocklist-for-ai-music-on-youtube/">This blocklist</a> from Surasshu, loaded into BlockTube on my desktop. I haven't looked to see if I can add the same blocklist into ReVanced yet.</li>
<li>As a separate note, I'm trialing <a href="https://github.com/laylavish/uBlockOrigin-HUGE-AI-Blocklist?tab=readme-ov-file">This blocklist</a> from Laylavish to block a bunch of other AI bullshit on the web writ large. I haven't been running it long enough yet to know for sure if I'll have problems, but if it doesn't cause any trouble, I'll probably adopt it into my PiHole instance.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>We played Gekido Advance for the aforementioned VGP episode. It was a fun time and a game I normally wouldn't play, so I'm glad we did it. IT's hard as shit though, so maybe use some emulator cheats on it.</li>
<li>I put about a half dozen hours into <a href="https://www.youtube.com/watch?v=usWlhxq1704&amp;embeds_referring_euri=https%3A%2F%2Fgamebanana.com%2F&amp;source_ve_path=MjM4NTE">Rose &amp; Violet</a>, a Persona 5 story overhaul putting Kasumi Yoshizawa in the protagonist role. There's some mod-jank in there, but overall I'm finding the experience really charming. It has me excited to experience this story a third time, despite its flaws (which I hope this mod addresses more fully than the Royal version did.)</li>
<li>I started <a href="https://youtu.be/2B1v94Dp1Jw">Super Mariomon</a> on lunch today. It's extremely charming, and very very well polished. I'm only a half-hour in, but I'm excited to play more. I haven't been a pokemon person in a while, but maybe a completely new coat of paint will help me enjoy it more.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Less longform stuff this week, given my busy busy schedule, but here's some recs.</p>
<ul>
<li><a href="https://youtu.be/xEEfp8OqgHo">The latest</a> from Charles Cornell. He's a jazz musician who does a fantastic job breaking down all kinds of music. This one is on Ocarina of Time.</li>
<li><a href="https://youtu.be/R14xkfPpKDA">Greg over at How to Drink</a> has been doing many more episodes lately including significant bits of history. I hope the episodes are doing well for him because I love the addition of history to his formula and it's so obvious that he loves the history portion.</li>
<li>Chris's latest <a href="https://youtu.be/xwmxmUNA7Pw">Antikythera Mechanism</a> episode on Clickspring is comforting and wonderfully informative as always. I'm excited for him to be able to piece the whole thing together by the end of the series.</li>
</ul>
<h1 id="listening" tabindex="-1">Listening <a class="heading-anchor" href="#listening"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>It's not often I get to shout out music I've added to my collection. This time, it's <a href="https://lizzieno.bandcamp.com/album/hard-won">Hard Won</a> by Lizzie No, which I was put on to from a 99% Invisible episode about Centralia, PA which is <em>still burning</em> from a fire started in 1962. The track in question is lovely on this album.</li>
<li><a href="https://www.play-asia.com/hello-cd-blu-ray/13/70iml1">Hello</a> by Furui Riho is the opening song for City the Animation and I cannot stop listening to it. I'm a sucker for horns on a song, I guess.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #13</title>
        <link>https://tk-web.quest/blog/weeknotes-13/</link>
        <guid>https://tk-web.quest/blog/weeknotes-13/</guid>
        <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>A second rough week in a row. A debilitating migraine Thursday and a very late night Wednesday combined with a nice shouting match earlier in the week to really put a damper on things. I'm doing better now that it's the weekend.</li>
<li>We did some yard work to fix up the front of the house yesterday. Planted some new shrubs and added a border ring to one of the trees. Probably going to do the other tree today after I mow. I'm looking forward to getting it done. The shrubs especially have looked bad for an entire year.</li>
<li>I finally decided to ditch Nextcloud on the home server. It offered a lot of nice features, but it ran super slowly and was too heavy. I don't need enterprise features in a personal file server. So instead, I've deployed <a href="https://github.com/9001/copyparty">Copyparty</a>, which is a file server written in python and deployable in Docker. I haven't set everything up I want to with it, but I've got the basics working and I really like it so far. It does exactly what I need: provide access to my home server's file storage from anywhere. The next step for the home server is deploying a photo management solution that plays nice with Copyparty.</li>
<li>I've set up my RG35XXSP again with MuOS Pixie. I'm going to start playing more games at work on my breaks. I love this little thing and the newest version of MuOS feels really great to use.</li>
<li>I've decided that my experiment with Hyprland is at an end. As much as I like it, I also want my PC to be as approachable as possible for Emily, so I'm going to switch back to Plasma. This is going to come with a complete reinstall of the OS to clean things up a bit. I'm looking forward to finally excising Windows from my personal life and switching full time back to Plasma is the best way to do that I think.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>More <em>Robotnik's Ring Racers</em>. I'm just about done with all of the cups in single player on the basic difficulty. There's <em>a lot</em> there within the base release not counting the community made tracks. I haven't even really looked at additional tracks for the game yet, but I'm excited to jump in with those eventually.</li>
<li>I played a bunch of the <a href="https://itch.io/jam/the-worst-game-jam-3">Worst Game Jam 3 submissions</a> <em>Ghost &amp; Found</em> and <em>Along an Etremety</em> were big hits for me. I highly recommend you check them out!</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>We're still plugging away at <em>DanDaDan</em> Season 2 and <em>City the Animation</em>. We're enjoying both of them quite a lot. Once these are done, we'll probably return to <em>Twin Peaks</em>.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>New Pages on Taming Knots</title>
        <link>https://tk-web.quest/blog/new-pages-on-taming-knots/</link>
        <guid>https://tk-web.quest/blog/new-pages-on-taming-knots/</guid>
        <pubDate>Tue, 29 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I did some development work on Tk-web.top today during some downtime at work. I've added two pages to the main navigation at the top of the page, Connections and Uses. I've also taken the opportunity to order the pages in the header to make the order make more sense.</p>
<p>The Connections page is for blogs and other more ongoing media that makes more sense to place in a dedicated page rather than constantly write about them in weeknotes over and over again. I'll try to update the page over time with more blogs, youtube channels, and podcasts.</p>
<p>The Uses page I don't particularly like the name of, but I like the concept of quite a bit. It's a sort of snapshot into the devices and tools I use on a day to day basis right now. As things change, I'll be updating the lists. It's also a good place to put out an intention of replacing tools I like less than I used to for whatever reason.</p>
<p>I plan on adding more of these slashpages over time, but I may not always make the links public. It might be a fun little easter egg for folks.</p>
]]></description>
      </item>
    
      <item>
        <title>weeknotes #12</title>
        <link>https://tk-web.quest/blog/weeknotes-12/</link>
        <guid>https://tk-web.quest/blog/weeknotes-12/</guid>
        <pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>I've had a tough week. A death in the family last weekend has left me drained and unable to focus. We weren't what I would call close, so I feel very strange about it. We didn't have an antagonistic relationship, we just weren't close.</li>
<li>Because of this, I've had weird ups and downs in my energy and ability to do things. Smaller tasks seem to be working better, but I've been too exhausted to do anything for multiple days.</li>
<li>For the first time ever, the podcast was late this week. It's understandable why, but I really don't want to make this a habit. The podcast has been a really good way for me to stay busy and out of depressive holes. Emily probably thinks it's too much effort, but it's effort I want to put in.</li>
<li>I wrote about my current mental state earlier this week. It felt good to express it, even if I did have to write in circles without addressing root causes. I particularly like a few turns of phrase I took in that post. I do also like where I can address the reader directly. Maybe I will begin to incorporate that into more of my writing from now on. It gives things a conversational quality I like. Only time will tell if it is an imitative voice, or a intentional, meaningful change.</li>
<li>I disassembled my lathes more last weekend. I think there's no feasible way to combine or repair them. Perhaps turning will have to wait for a more permanent, more reliable addition to the workshop. I do not really have the time, energy, or money for the hobby right at this juncture. I do want to come back to it, though.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I started Planetarian HD for our next TWCR episode. I talked about my thoughts in my last <a href="https://tk-web.top/posts/2025-07-21-playlog-phd">playlog</a> post. I'm looking forward to discussing it and VN history in general with Rinoa this weekend.</li>
<li>I've continued to play Robotnik's Ring Racers. It's incredible how good this game feels.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Bill &amp; Ted's Excellent Adventure - Emily and I needed a very well-trodden comfortable movie to watch before bed last night. Bill &amp; Ted is a fun one, though maybe not my favorite. It did its job well. I had my best night of sleep all week thanks to the cooldown.</li>
<li>Dan Da Dan season 2 continues to be pretty good. Emily is really enjoying it still, so I'm glad.</li>
<li>I got Emily onto City The Animation and have now been forbidden from watching it without her. I don't mind. It's a great series and I'm glad to share it.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>A pile of bricks</title>
        <link>https://tk-web.quest/blog/a-pile-of-bricks/</link>
        <guid>https://tk-web.quest/blog/a-pile-of-bricks/</guid>
        <pubDate>Thu, 24 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I sit down in front of a computer to type this post with no initial thought other than to work through what is in my mind at this moment. Forgive me, dear reader, if this is confusing, rambling, or otherwise strange. I know I do not write much outside of basic logs and notes. This post will likely be an outlier.</p>
<p>There is a metaphor Emily and I use when we talk about being overwhelmed. I look at it as a pile of bricks. We are building our lives out of these bricks, so each one needs to be addressed individually. Sometimes a given brick needs to be placed before anything else can be laid on top of it. Sometimes a brick is less important, but still needs addressed. When too many bricks are being added to the pile, it's difficult to keep everything in order and know which bricks to lay next.</p>
<p>Usually, this metaphor is useful when I talk to Emily because when an additional concern, idea, or task is mentioned or added, I feel like my pile is growing ever larger. I won't know how much effort each individual brick will take to be mortared and placed. Eventually this pile of bricks becomes untenable and I collapse unless I can work through it.</p>
<p>There have been a few times in my life where the pile has felt too big. I would fall, release all of the tension, ask for help, and pick myself back up again. Each time, I've had the wonderful and incredible support of parents, spouse, and sometimes even friends.</p>
<p>This time, I'm facing down a much bigger pile of bricks than I ever have previously, it feels. If I try to hold it all in my mind at once, I can feel myself wavering on the edge of unconsciousness. My entire body feels heavy and sluggish. At once I feel both numb and emotional. Maybe trying to organize them here will be helpful. Maybe not, but right now I can't ask for the support I normally would. In a sense, I'm on my own.</p>
<p>I won't unload my pile of bricks on you, dear reader. I have typed and retyped the list, but it's simply too big for me, in good conscience lay it here. The list also relies on the privacy and cooperation of others who I have not, and will not, ask nor receive permission from to air their laundry. Suffice to say, there are heavy burdens which are crushing me into the depressive state that is obvious from my writing today.</p>
<p>Normally, when the pile gets preposterously heavy, my collapse is more of an anxiety and panic attack than a depressive episode, but the two disorders do walk arm in arm, so I suppose the different tenor of my reaction this time shouldn't be all that surprising, especially with the tone of the most recent and largest additions to my brick pile.</p>
<p>It is that very same tone that makes this one so much harder to rely on others for support this time. I know that even if people are hurting, they can support one another. I don't feel like I need to be the only strong person in the room. It just feels bad to me when I am asking people for help when they are the very same people I am trying to be strong and helpful for. It's a complicated feeling, and one I don't particularly like.</p>
<p>I am not casting about for a lifeline from you either, dear reader. I only wish to quietly work through my pile on my own, but it is nice to shout into the void sometimes. &quot;I'm working hard!&quot; or &quot;I may feel defeated now, but I know it won't be forever.&quot; So, I do not ask for your attention, dear reader. I do not need or want it. I simply am looking out into the evening sky and saying, to the world in general and to no one at all, &quot;I am alive.&quot;</p>
]]></description>
      </item>
    
      <item>
        <title>Playlog: Planetarian HD</title>
        <link>https://tk-web.quest/blog/playlog-planetarian-hd/</link>
        <guid>https://tk-web.quest/blog/playlog-planetarian-hd/</guid>
        <pubDate>Mon, 21 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Planetarian Is a visual novel from 2004 developed by Key. A developer I know for their involvement in other &quot;classic&quot; VNs like <em>Clannad</em>, <em>Kanon</em>, and <em>Air</em>. I first learned of them from their original anime, <em>Angel Beats!</em> which was animated by P.A. Works and got its own visual novel in 2015.</p>
<p><em>Planetarian</em> is a linear visual novel about a cynical and gruff male POV character who meets a cheerful, yet airheaded robot girl in a dead city after a worldwide apocalypse at a somehow partially-functioning planetarium. It's playing in a lot of trope spaces that were common in Japanese media in the 2000's. Male characters that go through their stories constantly complaining and being &quot;annoyed&quot; by the more cheerful characters around them, but humoring those characters and doing things for them in spite of that apparent dislike and annoyance.</p>
<p>It's this style of character that particularly irks me in stories of this nature. We are told, over and over again from the perspective character that the one other person he's interacting with, a robot named Hoshino Yumemi, is stupid, stubborn, annoying, and repetitive. He has no reason at all to stick around other than empathy, something he claims to lack for these artificial beings. The perspective character gives us plenty of reasons why he should leave the Planetarium behind, with no reason for him to stay, yet stay he does.</p>
<p>That said, I can't help but find myself enjoying the story in spite of that. The characters are consistent in their writing, and humans are contradictory creatures by nature. In a way, the two very different worlds colliding is the interesting part of this. The gruff scrapper and the bubbly slice of life girl make an odd pairing, but they do grow on me.</p>
<p>I'm about two hours in now, in chapter 9 of I think 10 (plus epilogue?) It's interesting to me that this came out in the same year as <em>Clannad</em>, which has a surprisingly similar POV character. Okizaki Tomoya similarly seems to be just coasting through life when we meet him, cynical and disillusioned. Where he and the Junker differ, however, is how their character changes over time. Not necessarily in the direction they go, but rather the speed with which they go that way. Tomoya quickly opens up to whichever love interest you guide him towards. Clannad is a bigger game, with more text and a branching story including a &quot;golden route&quot; where you must complete other routes to unlock a true ending. I think I prefer the linear style of <em>Planetarian</em>, but I do now want to give <em>Clannad</em> another shot.</p>
<p>For more thoughts, tune in to next week's Community Report where we're going to be talking VN turkey with Rinoa.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #11</title>
        <link>https://tk-web.quest/blog/weeknotes-11/</link>
        <guid>https://tk-web.quest/blog/weeknotes-11/</guid>
        <pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>I forgot to mark this one as not a draft on Saturday. Oops</li>
<li>I finally feel like i'm getting into the swing of things at work. I'm completing most tasks easily, and enjoying my time. In a couple weeks, i'll be working five days a week again though, which is a bummer. I guess this gives me something to look forward to next summer though.</li>
<li>We recorded and interview with a few of the game jam participants for the summer jam. It was a great time! I'm excited to get the episode edited tomorrow.</li>
<li>My brain has a disease and that disease is telling me I should start from scratch on my linux desktop and install Arch directly and re-configure Hyprland and everything else from scratch. I don't rightly know how much EndeavourOS changes from Arch upstream, so I probably <em>shouldn't</em> do it, but I also think it would be beneficial for me to take what I've learned from the last few months and start over knowing what I want to use and how I want it configured. Get rid of some of the cruft, so to speak.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>The second episode of City the Animation. I think I like it even more than the first episode. I hope this trend continues. There's not much to add to my impressions from last week.</li>
<li>Ford v Ferrari. It was fine, but the story felt exceptionally rushed. It feels like this would have been much better as six or eight one-hour TV episodes.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I started Planetarian HD for the podcast. It's an interesting look into VN history. I'm excited to talk to Rinoa about it.</li>
<li>I played a bunch of Dr. Robotnik's Ring Racers. It's a mod of Sonic Robo Blast 2, which is a sequel to Sonic Robo Blast which itself is a Sonic fangame made in the Doom and Doom 2 engine. It has some really interesting mechanics to encourage players to use items quickly and seems to have a slightly higher skill ceiling than Mario Kart.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #10</title>
        <link>https://tk-web.quest/blog/weeknotes-10/</link>
        <guid>https://tk-web.quest/blog/weeknotes-10/</guid>
        <pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>Finally hit double digit weeknotes and I haven't missed a single week (although I've been late a few weeks.) Writing regularly has been very helpful for me and I'm glad I started. I'm looking forward to writing more.</li>
<li>I have started writing some of my posts while at work between other tasks. It's the slow season, so I'm not too worried about it. I installed my favorite .md editor on my work laptop and am using Github to synchronize my drafts and posts. It's been working surprisingly well. I want to be able to write personal emails on my work computer as well during downtime, so maybe the next step is installing Obsidian and just paying for their sync.</li>
<li>I don't want to count my chickens, but I think I might get a job advancement opportunity soon. No more details for now, but it could come with a 5-7% raise, which would be really nice to have.</li>
<li>I've decided to start working towards a CompTIA Network+ certification. It's a challenging subject for me, but I think the cert will serve me well and be well worth the studying.</li>
<li>I finally got in touch with Typeractive about a replacement Lily58 tenting foot. Turns out their contact form didn't ever deliver my first message and they've been extremely responsive this time right away.</li>
<li>I got new sunglasses! Having a thick prescription means I only get new ones every few years. My old ones were from 2022 or so. I accidentally ordered the wrong color of frames, but I like them anyway. It's not what I would pick for myself, but I think they still look good. I ended up getting them from Eyebuydirect because I like my normal glasses from them so much.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Played and finished Loco Motive this week. I wrote a quick <a href="https://tk-web.top/posts/2025-07-07-playlog-lm-1">playlog</a> about it, if you're curious. My overall impression was really positive. I got stuck less than I typically do in adventure games and really enjoyed the writing, art, and voice acting. A lovely game, overall.</li>
<li>Briefly played Half Minute Hero for the PSP. I only played some of the early Hero levels, and like them, but I don't think it's going to have the staying power I want. Especially since a lot of the stuff <em>around</em> the actual game takes a long time to sit through comparatively.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Watched a lot more Apocalypse Hotel with my wife. I'm so glad she likes it. I think we'll probably finish it next week.</li>
<li>Watched episode 1 of City The Animation. It's amazing to me how much different cityscape or establishing shots look in this series compared to anything else I've ever seen. The super-wide establishing shots make the entire city feel toyetic in a way I really enjoy. The use of color and detail also makes the series feel lush and vibrant in a way that other anime, whether made for TV or as movies, do not. I think this is due to a combination of very saturated colors, a focus on jewel tones, and high contrast with thick lines. Even if the writing and comedy don't carry it, I think I'll keep watching just for the visuals.</li>
<li>Emily and I picked up DanDaDan Season 2. I liked the first couple of episodes a fair bit. I hope the series continues to be so well animated. Science Saru continues to do exceptional work. The shots where they are animating the splash pages especially are fantastic. I don't like the new opening quite as much, but it's going to be tough to top Creepy Nuts for this series.\</li>
<li>I also watched Office Space last night since it's such a common reference at work. I like it a fair bit. It being very short and concise helps a lot with my enjoyment of it.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Playlog: Loco Motive</title>
        <link>https://tk-web.quest/blog/playlog-loco-motive/</link>
        <guid>https://tk-web.quest/blog/playlog-loco-motive/</guid>
        <pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Loco Motive is a murder mystery point an click adventure game in the style of old LucasArts adventure games released late last year. I played the game in its entirety last week and had a great time with it.</p>
<p>A constant point of consternation for me is how poor the puzzle logic of an adventure game in this style can be and how much that can affect my progress. I did have to turn to a guide three times in my playthrough, but for the rest of the game, the in- game hints were good enough.</p>
<p>The game is completely voice acted, which is an impressive feat, and the entire cast has done a wonderful job. Each character feels believable in this heightened reality, and they bounce off of each other really well. To this end, the writing is also very good, with plenty of funny moments and lines.</p>
<p>The voices would fall flat if it weren't for the very expressive art. While this could have easily been fully illustrated, I feel like the pixel aesthetic works really well for the game and has a ton of personality.</p>
<p>This one gets a big recommendation from me!</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #9</title>
        <link>https://tk-web.quest/blog/weeknotes-9/</link>
        <guid>https://tk-web.quest/blog/weeknotes-9/</guid>
        <pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>A short week this week. I worked Monday, Tuesday, Wednesday, and then only for a couple hours on Thursday thanks to the Fourth of July holiday. It's nice to have a bit of a break.</li>
<li>We got Sophie some CBD oil to try and curb her anxiety during the fireworks. It worked pretty well! though we still lost sleep from the jerks deciding 1 AM was a good time to start a fireworks show.</li>
<li>Fourth of July was nice. I went to see my extended family for a bit. It was nice to see them, even if the cousins did start fighting again.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Soul Hackers 2. I wrote a play log for SH2 with my initial thoughts. You can find it <a href="https://tk-web.top/posts/2025-07-01-playlog-sh2-1/">here</a>. Overall I'm liking it a fair bit!</li>
<li>Dice Throne. An interesting dice combat boardgame introduced to me by my coworkers. We played an X-Men set. It was interesting, but not completely my bag. Might be better with more experience. It's tough to tell.</li>
<li>Kiri-Ai: The Duel. A very simple game, but very fun and strategic. It gave me a lot of Street Fighter vibes. It's a carrd game where players take the roles of samurai in a duel. Each player has mostly the same cards, so the game is a lot about reading your opponent and anticipating their moves. I really enjoyed it and will probably pick up a copy for myself.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Finished the original Star Wars trilogy with my wife. It was fun to revisit, but I think I'm all Star Wars'd out for the time being. Andor will have to wait I think.</li>
<li>Started and completed Stardust Telepath at Zeno's recommendation. It's a cute little show, but not really striking in any major way. Very much empty calories, but it's a genre I am a sucker for.</li>
<li>My coworkers and I watched The Old Guard and the new sequel since this week was so slow. The first is an interesting movie. Definitely has some faults in the plot, but the action was decent. They definitely do the over-cut action scenes though. The sequel was significantly worse, with retconned plot elements and lots of holes.</li>
<li>I started watching Apocalypse Hotel again, this time with my wife. She really liked the first couple episodes, so I'm excited to watch the rest of it with her.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Play Log: Soul Hackers 2</title>
        <link>https://tk-web.quest/blog/play-log-soul-hackers-2/</link>
        <guid>https://tk-web.quest/blog/play-log-soul-hackers-2/</guid>
        <pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I've been lamenting the fact that I don't have good notes for games that I've been playing, which means when I share a game on The Worst Community Report, I end up unable to properly articulate my thoughts. I'm sure the more I talk about things, the more I will feel confident as I speak critically. However, in an effort to speed up this process and flex my critic's muscle, I've decided to start writing play logs for myself and publishing them. Not every game will get a log, and they may not always be in a nice, easy to read format. They may not even make sense outside of the context of my own brain. I do hope they are useful or enjoyable somewhat, though.</p>
<p>Soul Hackers 2 is a JRPG from Atlus released in 2022. I'm playing it on PC. Soul Hackers as a series is a sequel to the 1997 Devil Summoner: Soul Hackers for the Sega Saturn, which got updated ports for PSX and 3DS later on. I always misremember the original Soul Hackers as a GBA game. Soul Hackers is technically a sequel to the original Devil Summoner from 1995, though the Devil Summoner series splits into Soul Hackers, which is the JRPG style branch and the Raidou games, which are the action combat version. Raidou's first game recently got a remaster for modern platforms.</p>
<p>I started Soul Hackers 2 about a week and a half ago. I picked it up mostly because it was reasonably cheap and because it was SMT-related, I figured I'd like whatever Push Turn varient it was sporting. I've never played any of the other Devil Summoner games extensively, so this series is more or less new to me, though I do really like Persona, another SMT spinoff. Since I started, I've played maybe six hours or so. Not enought to truly dig in yet, but enough to be introduced to much of the main cast.</p>
<p>First, the characters. I enjoy the cast a fair bit. I don't have a great idea of how Saizo and Arrow are going to be long term, but I do really enjoy Milady, Figue, and especially Ringo. The protagonists of the Persona games do have some personality, especially if you read and carefully consider your dialogue choices, but Ringo contrasts signficantly with the Persona MCs. She has a lot more personality straight from the jump.</p>
<p>Something I find really interesting about the characters and the story is that Figue and Ringo, the two AI leads are specifically not robots, but they aren't completely human either. That said, Aion, the system that birthed them, decided that beings with souls were what was needed most to ensure the success of their mission. A purely logical being wouldn't perform the Soul Hacks Ringo does to restore the other characters to life. Ringo's curiosity and sense of humor help me stay attached to her a lot.</p>
<p>The mechanics are both simpler and more complex than Persona. Gone is Push Turn, replaced by a standard battle system, and the number of damage types is also reduced. That said, the Sabbath system that replaces Push Turn and weakness exploitation feels great to use and does a lot of similar things to Push Turn, where you are encouraged to exploit weaknesses, but spread the damage out among the various enemies in each encounter. The COMP and Soul Skill systems give each character a sense of a build even though they all have the ability to use any Demon you like (as long as there are no duplicates)</p>
<p>The relationship building feels lighter than Persona, but it also feels less missable. The skills you get from the relationships also seem very  very very good, so I'll be interested to see how they shake out. I love when a game gives you broken abilities on purpose and this seems to be aligned in the same direction.</p>
]]></description>
      </item>
    
      <item>
        <title>Switching to an ergo-split keyboard</title>
        <link>https://tk-web.quest/blog/switching-to-an-ergo-split-keyboard/</link>
        <guid>https://tk-web.quest/blog/switching-to-an-ergo-split-keyboard/</guid>
        <pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>My old keyboard has been dying for months, maybe a year, even. It's a Logitech G815. The thing that has been the most annoying as it has aged has been the volume roller registering phantom input and not registering intended input. Some of the keys started to get unreliable as well, so I decided it was time to retire it. My new job has me typing a lot more, so I wanted to try something new. Maybe I could stave off some of my RSI symptoms if I got something more ergonomic. After several months of doing research, I decided it was finally time to pull the trigger, so I bought a split ergonomic keyboard in the form of a Lily58 kit from <a href="https://typeractive.xyz">Typeractive</a>.</p>
<h1 id="picking-the-lily58" tabindex="-1">Picking the Lily58 <a class="heading-anchor" href="#picking-the-lily58"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>In looking at what would theoretically feel better on my wrists where my RSI is most present, I found that there are several factors when it comes to creating a good typing position. One of the biggest things you can do immediately is separate your hands and keep your arms as straight as possible, with appropriate bends at the elbows. On a normal keyboard, this isn't really possible, but if you chop the board in half, you can adjust to any width you like. Another ergonomic adjustment that isn't really possible on a standard board is adjusting the angle. Not front to back, like most keyboards allow for, but from side to side. It's advantageous to type on an angled board, with the thumb side of your hand higher than the pinky side. Many split keyboards have options for tenting feet that let you make that adjustment. The Lily58 fits both of these criteria, while also having enough keys to fit my preference. Many ergonomic split keybaords very few keys, which makes the emulation of a full layout difficult. The Lily58 has 58 keys, so with very basic layering, every function is available. I also wanted to stay away from some of the more expensive options. Like many hobbies, it feels like you can spend as much as you want on a keybaord these days.</p>
<p>This keyboard might come off looking pretty DIY and it is. The actual layout is open source (MIT License) and was designed by <a href="http://kata0510.github.io/Lily58-Document/">Kata0518 on Github</a>, but you can buy the boards from a variety of sellers. Most places that sell the Lily58 simply print the circuit board for it and sell that. Maybe with the other components needed to make it function, but they often don't assemble the boards at all. Typeractive offers a half-built option. They do the difficult and tedious soldering of the diodes and hotswap switch sockets and you solder the much easier controllers and displays. The key switches and keycaps themselves are all press-in. This was the biggest reason I went with them. The other major reason is that they have a customized Lily58 option that uses Kailh Choc key switches, which are lower profile than the standard Cherry MX style switches you may know well from most mechanical keyboards. The lower profile switches tend to fell better to me. My old keyboard used Logitech Romer-G switches, which felt like low profile Kailh switches anyway, so the sound and feel of my new keyboard feels familiar in a good way.</p>
<h1 id="building-the-board" tabindex="-1">Building the Board <a class="heading-anchor" href="#building-the-board"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>The board came in several parts. In the box, I got the PCBs, top plates, 3D printed cases, sixty Kailh Choc white switches, a set of MBK Hypersonic keycaps, a pair of Nice!Nano controllers, a pair of batteries, a pair of Nice!View screens, a set of four tenting feet, and a pair of acrylic screen covers, as well as the hardware required to get it all together.</p>
<p>The process for building the board went pretty easily. I'd never soldered pins like these before, but once I got the hang of it, all the joints went together well. It's always fun for me to learn a new skill, and now I'm itching to do more projects like this. After everything was soldered, it was a simple matter of pressing in the switches and screwing the case together. In the end it took me a couple hours across two days, but I'm very happy with the result.</p>
<p>The Nice!Nano modules use ZMK firmware, which is an open source standard. I don't really have a horse in the race between QMK/ZMK, but working with ZMK was super easy. I used the online <a href="https://github.com/nickcoutsos/keymap-editor">keymap editor</a> made by Nick Coutsos to generate it. My layout is fairly simple. I have most things available on the <a href="baselayer.png">base</a> layer, with a numpad, arrow keys, media keys, bluetooth settings, and function row available on the <a href="raiselayer.png">raise</a>/<a href="lowerlayer.png">lower</a> layers. I'm not completely happy with it. Having the esc key in the number row isn't great. My muscle memory is always off by one key in that row. I think it's not the best layout, but I like it so far otherwise.</p>
<p><img src="lily58.jpg" alt=""></p>
<h1 id="adapting" tabindex="-1">Adapting <a class="heading-anchor" href="#adapting"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Getting used to the Lily58 has been a challenge. It has really illuminated some bad typing habits. I don't use my pinky fingers as much as I probably should and I move my hands across the board a lot. These habits are bad, ergonomically, but have been very difficult for me to kick. I still mistype more often on the 58 than on my work laptop or standard keyboard and I'm slower there too. I have been improving though, and now I catch myself sometimes typing for several seconds at a time without looking down or stumbling. I'm sure that as I type more, I will keep getting better and I'm looking forward to it.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #8</title>
        <link>https://tk-web.quest/blog/weeknotes-8/</link>
        <guid>https://tk-web.quest/blog/weeknotes-8/</guid>
        <pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>Finally, I'm getting the hang of Reaper. This week's Worst Community Report was finished well before deadline this time. I still spent longer than I'd like to on it, but with some practice, it should keep getting better and better!</li>
<li>Had another one on one meeting with my new boss. Well, new as of around a month ago anyway. We talked a little about my performance. He complimented my gung ho attitude in wanting to dive straight into the work. I told him it's the best way for me to learn. Most of the rest of the meeting was talking about office culture and how unique our position is as contracted employees &quot;working for&quot; a service provider but embedded with the client. Overall, I'm really enjoying the new job. It feels much more interesting and fun than wrenching on wheelchairs and I feel like there's a lot for me to look forward to learning.</li>
<li>Somewhat related to my new job, I've been getting more prone to headaches. I feel like it's probably from the increased screen time. I'll increase the strength on the blue filter on them and turn the brightness down a touch. I had the screens bright and higher contrast because I hadn't dialed in window scaling for my eyesight. Now that I've started working with bigger fonts, I'm going to start working on comfort. Maybe since my glasses will be less prone to damage now, I should get some new ones with an anti-glare coating. That said, I have never really noticed or been bothered by glare on my lenses, so it might be a waste. Maybe something I try once.</li>
<li>Speaking of getting used to things, though, I am getting better and better at typing on my Lily58. The quibbles I have with the layout still bug me, but overall, I do like it. I wonder if the ergonomic benefits are actually helping or not. Now that I no longer turn wrenches for a living, my RSI pain is less intense most days anyway, so it's tough to tell if the keyboard is actually helping or not. The one thing I don't like about it is the very small battery in each half. It's pretty simple to upgrade and it's not a HUGE deal if it's small, but I would still like to have it be a bit better. Right now it's good for a couple days at the most, a far cry from the Logitech keyboards that can run for a year on a couple AA batteries.</li>
<li>I'm thinking I want to get in the market for a cheap used laptop to put Linux on. It sounds like some of the nicer Chromebooks would be a really good pick for it, since the OS kills consumer interest in them. A laptop that would be $400 with Windows can be had for less than a hundred bucks. That said, this is a project that will have to wait a bit. I have a lot of other project irons in the fire, so to speak. This will have to wait unless I see a really great deal.</li>
<li>Like I put in my notes last week, I want to start reading more, so yesterday I set up Calibre on my home server. I'm planning on starting with a few of the books <a href="https://joelchrono.xyz/blog/the-big-time/">Joel</a> has been <a href="https://joelchrono.xyz/blog/the-space-merchants/">reading</a> lately. From his reviews and talking to him, I feel like I'd enjoy them.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I picked up Soul Hackers 2, the sequel to the spinoff of the spinoff of Shin Megami Tensei. First impression is pretty good. It has an interesting way of encouraging you to not focus down enemies one at a time, which is a staple of FF/DQ JRPGs.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>My wife and I have been watching the original Star Wars trilogy. It's fun to go back to those movies, even if the readily available versions have some really awful &quot;improvements.&quot; To be frank, I'm surprised Disney doesn't list the original theatrical versions on their streaming service.</li>
<li>I watched all of Apocalypse Hotel in preparation for the Community Report we recorded this morning. It's a fantastic show for lovers of little guys. A fantastic rec from Emily and Zeno.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #7</title>
        <link>https://tk-web.quest/blog/weeknotes-7/</link>
        <guid>https://tk-web.quest/blog/weeknotes-7/</guid>
        <pubDate>Sun, 22 Jun 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>Another week another set of late notes. Between the new job, the podcast, and everything else going on, I'm stretched a little thin. Thankfully, I'm getting better at editing the podcast quickly and the weekend plans are starting to let up, so I can look forward to some more time soon.</li>
<li>I'm getting faster on the Lily58 with some practice. I'm not completely used to it yet, but I'm improving, which feels nice. I feel like my dream keyboard would be close to this, but with a few more keys. Maybe just one, actually. The esc key needing to be in the same row as the numbers causes a fair few problems, but I also don't think I'd want to give up a dedicated esc key. Decisions decisions</li>
<li>It's hard to believe we're almost a full month into the Worst Community Report already. I'm having a ton of fun with it and I think this week's episode is going to be a banger!</li>
<li>My new job is going well. I am being praised for the speed with which I pick things up, which feels nice. I'm thinking I won't have any trouble with the work. My one big anxiety is trying to remember all of the names and locations of the users. I hope that knowledge will come with time.</li>
<li>It's been crazy hot the last few days. Summer is well and truly here. I passed on doing yardwork this weekend. It's just too hot. Hopefully next weekend is a little cooler so I can get some things done.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I played and finished Metal Gear Rising Revengeance for this month's Low Key Video Game Book Club. It's an interesting game. It feels very Platiunym, but limited by the Stealth Espionage Action of Metal Gear and Kojima's works. Thankfully I think the Metal Gear of it all re: alerts and stealth can be largely ignored.</li>
<li>My next game is probably going to be completing Cyberpunk 2077. I have a lot of progress and I just need something to fill time until I get to the next game I know I'm playing for the Community Report.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>My wife and I continue our journey through Twin Peaks. We just discovered who killed Laura Palmer with a large amount of time left in the series, so I'm very interested to see where it goes from here.</li>
<li>I picked up Apocalypse Hotel on Emily and Zeno's recommendation. I love it so far! It's very cute and funny. I'm really interested in seeing where it goes.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #6</title>
        <link>https://tk-web.quest/blog/weeknotes-6/</link>
        <guid>https://tk-web.quest/blog/weeknotes-6/</guid>
        <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>Another light week thanks to the new job, and a busy weekend left me writing these notes a bit late.</li>
<li>Continuing to learn and enjoy the Lily58. There's still some things that are tough to remember about the layout, but I'm getting faster at typing on it. I did realize that I messed up the placement and orientation of a couple of the tenting feet, so now I need to peel them off and put them on in a better spot, though the smoothness of the keycaps makes me not want to use it tented in the first place. Maybe something to learn over time.</li>
<li>We recorded and released episode 2 of the Community Report this week. Community reception continues to be pretty good. I'm getting faster at the edit as well, though I neglected to complete it this weekend as planned. Looks like another week of focusing hard on the edit after work for me.</li>
<li>Father's day was this weekend. We had my parents, my brother, and his husband over for brunch. It went pretty well. Fairly uneventful, but still nice to spend time together</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Cast n Chill demo - A nice idle/casual fishing game with some of the prettiest pixel landscape art I've ever seen. I don't love the fishing mechanics, but the idle mode helps a lot with that. Plus it has a cute dog.</li>
<li>Metal Gear Rising Revengeance - Started and finished this one this week. It was the lion's share of my gaming time. I enjoyed it quite a bit, but I don't think I'd like to go back to it like I do with other Platinum Games titles. It felt kind of like two things glued together, not mixed together if that makes sense. Platinum combat and Kojima weirdness, but the two never really meet.</li>
<li>Ball X Pit demo - From everything I've seen from Next Fest, I think this is the roguelike to watch. Very polished with a fresh and interesting set of mechanics. Might not dethrone Balatro for me, but I'll be interested in playing the full release for sure.</li>
<li>Bloodrush: Undying Wish demo - Another roguelike in a sea of them. It has some interesting ideas, but doesn't feel quite polished enough for me to stick to it long term. Definitely feels like the kind of game that the developer wants you to complete though. Still, it's very mush still in development, so it might get a good amount of tuning before release.</li>
</ul>
<h1 id="watching" tabindex="-1">Watching <a class="heading-anchor" href="#watching"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>The Good, The Bad, and The Ugly - Probably my absolute favorite western, and a long one too. I've seen it more times than I can count thanks to my dad. Some incredible directing and performances here. If you like the genre but have never seen it, I highly recommend it.</li>
</ul>
<h1 id="reading" tabindex="-1">Reading <a class="heading-anchor" href="#reading"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I shamefully haven't been reading as much as I want to. I've had a bit of a rough week. I'm looking forward to maybe building or finding a cheap eink ereader to start going through more books, but I haven't done a ton of looking yet.z</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #5</title>
        <link>https://tk-web.quest/blog/weeknotes-5/</link>
        <guid>https://tk-web.quest/blog/weeknotes-5/</guid>
        <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>We launched The Worst Community Report this week! The first episode is available on <a href="https://www.youtube.com/watch?v=zV7Jwl6E6Rw">YouTube</a> and most major podcast platforms. This is a project that came together rapidly, but I'm still very proud of what we've done.</li>
<li>I'm learning Reaper in order to edit the show. It's really complex, but I greatly enjoy using it and look forward to making the show sound better and better!</li>
<li>I built a Lily58 from Typeractive.xyz. It's a split format keyboard intended to be more ergonomic. I'm writing these notes with it and am trying to force myself to really learn how to use it quickly. My typing speed is heavily handicapped by the board currently, but I can feel myself learning it. It's strange to learn this and realize that I hardly use my pinkies to type, vastly preferring to slide my hands sideways to use my ring fingers. A post will be incoming as I learn the layout and decide if I like it.</li>
<li>I started my new job! I had headaches after the first two days, but I think drinking more water will help. I may have to investigate if I can set up my own tea station. Their beverage game is <em>weak</em>.</li>
</ul>
<h1 id="playing" tabindex="-1">Playing: <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I started Haste: Broken Worlds yesterday. The characters are neat, and the mechanics are pretty solid. It's kind of a roguelike 3D platformer. It's pretty good. Feels kind of B-game-ey in a good way.</li>
</ul>
<h1 id="listening" tabindex="-1">Listening <a class="heading-anchor" href="#listening"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Nothing particularly new here, but <a href="https://friendsatthetable.net">Perpetua</a> continues to be really good with extremely Final Fantasy IX vibes.</li>
</ul>
<h1 id="reading" tabindex="-1">Reading <a class="heading-anchor" href="#reading"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I honestly haven't read as much as I'd like to this week. I'm thinking I want to set up Calibre or AudioBook Shelf or something and start reading more books again,</li>
</ul>
<h1 id="videos" tabindex="-1">Videos <a class="heading-anchor" href="#videos"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>Stephen posted a new <a href="https://youtu.be/DLsZB0TNSfY">video</a> on Ace Attorney that is really great. I've wanted to get into more visual novels. Maybe Ace Attorney will be a good way in for me.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Embracing Open Source Part 4: Daily Programs</title>
        <link>https://tk-web.quest/blog/embracing-open-source-part-4-daily-programs/</link>
        <guid>https://tk-web.quest/blog/embracing-open-source-part-4-daily-programs/</guid>
        <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post is a part of my Embracing Open Source series. You can read the last post</em> <a href="/posts/2025-05-15-EOS3"><em>here</em></a><em>, or if you are particularly interested in a related topic or want to get in touch with me about the series, please</em> <a href="/pages/contact"><em>send me a message</em></a><em>.</em></p>
<p>This post marks the change from general advice and helping new users into Linux toward posts where I'll be explaining things that I've been doing and what benefit those processes or programs give me, what I would have been using on Windows, and what I wish were different about what I use in the hope that maybe someone reading has a good alternative that does what I need. I particularly don't want to overwhelm with options, so for each type of thing, I'll just mention what I use and move on. If you want something different, you are welcome to do more research on your own.</p>
<p>A common stumbling block for people moving to Linux is wondering what software they'll use on a day-to-day basis. Thankfully, through WINE, Proton, and good old fashioned multi-platform applications, a lot is available to fill the gaps left by another operating system. This post is a quick list of programs that I use daily. They may not be the best in their respective category, but I've found that for the most part, these get the thing done relatively well.</p>
<h1 id="operating-system-functions" tabindex="-1">Operating System Functions <a class="heading-anchor" href="#operating-system-functions"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>These are things that would just be included by default in another operating system, and for which each distribution tends to have a preferred default. Some of these are default to Endeavor OS with KDE Plasma, but many are alternatives that I've put together after finding some issue with the Plasma default.</p>
<ul>
<li>File Browser - While <a href="https://wiki.archlinux.org/title/Thunar">Thunar</a> isn't my preferred file browser UI, it is the one that I have ended up with due to some weird compatibility issues between non-KDE desktops and <a href="https://apps.kde.org/dolphin/">Dolphin</a>. If you're on plasma, use Dolphin. It's <em>exceptionally</em> good. Tabs, split view, tree view, built in share support, customization context menu entries via Dolphin Actions. On KDE, all of this works fantastically and seamlessly. On other desktops, like Hyprland which is what I use, Dolphin has no idea how to open any files and will not populate a list of applications to use even if it doesn't have a file association. So I'm stuck with Thunar, which is my closest second choice. It has a reasonably good UI, support for a split view and tabs, and with some plugins can even do basic stuff Dolphin handled seamlessly, like using trash folders and generating thumbnails.</li>
<li>Web Browser - <a href="https://firefox.com">Firefox</a> is no longer a <a href="https://arstechnica.com/tech-policy/2025/02/firefox-deletes-promise-to-never-sell-personal-data-asks-users-not-to-panic/">perfect recommendation</a>, but I feel like it's still better as a browser to recommend for user privacy than Google Chrome. Firefox is often the default browser option on Linux distributions, though privacy focused alternatives, like <a href="https://librewolf.net/">LibreWolf</a> do exist that are based on the Firefox open source base. I'm looking to hopefully switch to <a href="https://ladybird.org/">Ladybird</a> once it's ready for prime-time.</li>
<li>Terminal Emulator and Shell - I use <a href="https://sw.kovidgoyal.net/kitty/">kitty</a> as my terminal emulator. Mostly because it works by default with Hyprland and very seamlessly at that. It's quick and capable and plays nice with everything I want to do. As for my shell, I like <a href="https://zsh.sourceforge.io/">Zsh</a>. It was the default in Manjaro, so I got used to it, but plugins and such included in zsh are really useful. For more on my zsh configuration, check out my <a href="/posts/2025-05-18-EOSMini-zshrc">EOS Mini post about it</a>.</li>
<li>Application Launcher - I use <a href="https://github.com/SimplyCEO/wofi">Wofi</a> to handle this and a few other things. It works pretty much exactly like the Windows PowerToys launcher or Spotlight on MacOS. I press Super+Space and get a text box and a few commonly used programs. I type in what I want, hit enter and it launches. I'm looking to eventually add more to my configuration like being able to start a new markdown file straight from the launcher or pass a search from Wofi to Firefox to be run immediately.</li>
<li>Notes - I used to use Google Keep for much of this, but lately have moved to <a href="https://obsidian.md">Obsidian</a>. It's very capable without obfuscating all of your notes in a weird database. It uses markdown for formatting, with the addition of double brackets <code>[[like this]]</code> to denote a link to another Obsidian note, which makes organization really easy, though I tend to be redundant and put notes in folders anyway. The vault folder also contains the configuration and plugins that you use, so if you were to, for example, synchronize that vault to another device with something like Nextcloud, you get free synchronization between devices.</li>
<li>Text and Code Editor - OSS Code is a version of Microsoft's very good VS Code editor without the AI junk crammed down your throat. It's still compatible with VS code extensions and has good Github integration. I use it for most of my configuration file editing and basic text editing tasks.</li>
</ul>
<h1 id="productivity-and-creation" tabindex="-1">Productivity and Creation <a class="heading-anchor" href="#productivity-and-creation"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>These are programs for getting things done that wouldn't normally be assumed to be a part of the operating system. My use cases are not your use cases, probably, so there may be better options for you here. This is just what I've ended up with.</p>
<ul>
<li>Markdown Text Editor - The program I'm writing in <em>right now</em>, <a href="https://www.marktext.cc/">MarkText</a> is a very nice markdown editor. I picked it over other common editors like Obsidian and Typora because it adheres pretty strongly to the markdown standard as written with no proprietary formatting like Obsidian uses and I just plain like the way it looks better than Typora. My MarkText is set to automatically open my blog posts folder when it starts, so I can easily reference old work and save new work in the right place.</li>
<li>Office Suite - <a href="https://www.libreoffice.org/">LibreOffice</a> is the default across much of the Linux world for good reason. It supports all the formats I might use and is familiar enough in UI that I can bang out the work I need fairly quickly. It includes answers for word, powerpoint, excel and onenote.</li>
<li>Image Editors - I use two image editors, depending on what I'm doing. For quick and dirty tasks where I'm mostly just manipulating existing images, I use <a href="https://gimp.org">Gimp</a>. I'm familiar with Gimp since I've been using it for about fifteen years, but also it's just a very capable photoshop-esque program that runs well. For anything where I'm drawing or doing more artistic stuff, I use <a href="https://krita.org/en">Krita</a> which is kind of like Gimp's digital painting focused cousin. While the two share some DNA, it's more common ancestor than common base. The two programs have diverged a fair bit in their direction.</li>
<li>Audio Editing and Recording - While I've got old experience using <a href="https://www.audacityteam.org/">Audacity</a>, I feel like the Digital Audio Workstation environment has been one of the fastest improving and growing areas in creative software. Audacity is old reliable, but I want to learn <a href="https://www.reaper.fm/">Reaper</a> which seems more aimed at what I want to do with audio.</li>
<li>Scanning - I have a Brother laser printer and scanner that I have to begrudgingly pull out of the closet every few months to print or scan something. The print driver is just whatever works with this model of printer, but for scanning, I have found having a dedicated program like <a href="https://www.naps2.com/">NAPS2</a> available to be extremely useful. It works with both the feeder and flatbed scanner and can collate pages into a single PDF easily. It's not fancy, it's just a work horse program that I appreciate.</li>
</ul>
<h1 id="communication" tabindex="-1">Communication <a class="heading-anchor" href="#communication"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Love it or hate it, we use the global net to keep in touch. Thankfully, everything I need is already here.</p>
<ul>
<li>Email - <a href="https://www.thunderbird.net">Thunderbird</a> is the long-running email client from the folks at Mozilla and my daily use pick. I like that it has PGP security built in, so I can use end-to-end encryption with my contacts and it has a sensible low-frills interface. It's fast and I adapted pretty quickly from Gmail.</li>
<li>Chat, Video/Audio Calls - While <a href="https://discord.com">Discord</a> is not open source, it's unfortunately where my friends and favorite communities are. If moving people to an open standard was possible, I'd be much more bullish about switching to something like Matrix. Unfortunately, I'm just stuck.</li>
</ul>
<h1 id="media-consumption" tabindex="-1">Media Consumption <a class="heading-anchor" href="#media-consumption"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Sometimes I like to have fun on the computer. Here's the stuff that lets me do that. Without these, moving to Linux full time just wouldn't be an option for me at home. I'm very thankful that these exist.</p>
<ul>
<li>Music - While I don't listen to music locally on my machine a whole bunch, I do occasionally fire up a music player to either organize some files or actually listen to something. For the former, I use <a href="https://www.strawberrymusicplayer.org/">Strawberry</a> and the latter I use <a href="https://tauonmusicbox.rocks/">Tauon Music Box</a>. Strawberry's tagging and organization tools are fantastic, but the program looks kind of ugly. Tauon is beautiful, but doesn't have quite as many tools as Strawberry. It would be nice to find an option that had both halves of this equation, but I'm also not precious about it. This setup works remarkably well for my use case.</li>
<li>Video - None of the video I watch is local to my machine, so a standard like <a href="https://www.videolan.org/vlc/index.html">VLC</a> isn't really applicable to me. My physical media is all ripped to a <a href="https://plex.tv">Plex Media Server</a> where I watch via a web browser, TV app, or mobile app. I would like to switch to <a href="https://jellyfin.org/">Jellyfin</a> eventually, but I'm waiting for their app situation to be a little bit better first.</li>
<li>Reading - I don't read e-books much, but I do read a lot of blogs. For that, I tend to use <a href="https://github.com/yang991178/fluent-reader">Fluent Reader</a> on Android, though in doing research for this post, I realize now that Fluent Reader has a desktop app. Maybe I would read more on my computer if I had that installed. To manage all of my RSS subscriptions, I use <a href="https://freshrss.org/index.html">FreshRSS</a> which does have its own fairly good reading UI.</li>
<li>New Games - Like just about every PC gamer, I use <a href="https://store.steampwoered.com">Steam</a> a lot. It's by far the best tool to launch and run modern games, regardless of if you bought them from Steam or not.</li>
<li>Other Game Stores - I use <a href="https://heroicgameslauncher.com/">Heroic Launcher</a> to claim free games from Amazon and (until recently) Epic Games as well as download and install games from Amazon, Epic, and GoG. It's not a perfect option, but it generally works well and I can use it in conjunction with Steam to make games run.</li>
<li>Emulation - I use a bevy of programs for emulation. For a frontend, I use <a href="https://es-de.org/">EmulationStation Desktop Edition</a> which makes everything look nice. For most old systems (16-bit and earlier) I use <a href="https://www.retroarch.com/">RetroArch</a> to actually run them, though they're launched through ES-DE. For newer games, I use dedicated emulators. <a href="https://github.com/Rosalie241/RMG">Rosalie's Mupen64 Gui</a> for Nintendo 64, <a href="https://www.duckstation.org/">DuckStation</a> for Playstation, <a href="https://pcsx2.net/">PCSX2</a> for Playstation 2, <a href="https://ppsspp.org">PPSSPP</a> for PSP, and <a href="https://dolphin-emu.org">Dolphin</a> for GameCube and Wii for starters. I don't tend to dip into DS, 3DS, Wii, Wii-U, PS3, or Xbox emulation much, though with the speed at which <a href="https://rpcs3.net/">RPCS3</a> is developing, it might be worth it to eventually add to my stable.</li>
<li>Other Games - I also play a fair bit of The Legend of Zelda: Ocarina of Time and Majora's Mask via the Ship of Harkanian and 2 Ship 2 Harkanian ports which you can find via the <a href="https://github.com/harbourMasters">HarbourMasters</a> GitHub repo. They've also got a StarFox 64 port there, so check it out.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #4</title>
        <link>https://tk-web.quest/blog/weeknotes-4/</link>
        <guid>https://tk-web.quest/blog/weeknotes-4/</guid>
        <pubDate>Sat, 31 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>Really feeling the drag at work because I'm so short on days left before switching jobs. As of the posting of this, I've only got two days left. I feel like I haven't changed my demeanor much toward my coworkers, but they interpret every joke I make as much more bold than I normally would be and attribute that to me leaving. Maybe they're right.</li>
<li>I did a lot more writing this week than I expected to. A double header on Monday, the week notes of course, and some drafts in the works too. I feel like I'll swing between heavier and lighter weeks a bit, but I am really enjoying getting to write again.</li>
<li>I tried setting up <a href="https://mierak.github.io/rmpc/">Rusty Music Player Client</a> and the daemon it connects to, but I didn't really love the experience. I just think some apps shouldn't be so complicated and a terminal ui just doesn't work for how I'd use a music player anyway. I think I'll stick to <a href="https://www.strawberrymusicplayer.org/">Strawberry</a> and <a href="https://tauonmusicbox.rocks/">Tauon</a>.</li>
<li>I worked on a <strong>REDACTED</strong> project this week with <strong>REDACTED</strong> and <strong>REDACTED</strong>. We even had <strong>REDACTED</strong> help us out as <strong>REDACTED</strong>. I'm really excited to <strong>REDACTED</strong> on <strong>REDACTED</strong>.</li>
<li>Did a <em>TON</em> of cleaning up in the yard and garden this morning. Helped Emily move a big Mile High Iris that was falling over, pulled a bajillion weeds, picked up after the dog, and cleaned out the garage. I have to mow tomorrow which i'm dreading. It's been raining enough that I haven't been able to mow for three weeks. The yard is a jungle. The clover is coming in nicely though!</li>
</ul>
<h1 id="playing" tabindex="-1">Playing <a class="heading-anchor" href="#playing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>
<p>Dipping in slightly to Dark Cloud 2 again. Mostly just due to not really feeling the pull to start anything new that's on the larger side. I probably won't play a whole lot more of it this time.</p>
</li>
<li>
<p>Picked up Cyberpunk 2077 again, hoping to finish the DLC then go back in to the main story and finish that. I've done so much side stuff that there can't be <em>that</em> much game left.</p>
</li>
</ul>
<h1 id="listening" tabindex="-1">Listening: <a class="heading-anchor" href="#listening"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li><a href="https://traffic.libsyn.com/secure/fa87551f-de56-4971-a0d1-a3c6eabc913f/side-story-05.mp3?dest-id=4970820">Side Story</a> continues to be wonderful. This week's episode on Blue Prince has me wanting to dig back in to the game and unlock more of the deep mysteries, though I'll probably bounce right away anyway.</li>
</ul>
<h1 id="reading" tabindex="-1">Reading: <a class="heading-anchor" href="#reading"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li><a href="https://joelchrono.xyz/blog/new-desk-and-keyboard/">Joel got a new desk</a> and has joined the ranks of the mechanical keyboard typists. I really like the color scheme of his keys. The post somewhat inspired my Tech Loadout post from Monday.</li>
<li>I stumbled into the <a href="https://shellsharks.com/scrolls/scroll/2025-05-16">Scrolls</a> blog and really love it. Basically just a shotgun blast of indie web and fediverse stuff to look at in each issue. The next issue is a bit late. I really hope it continues.</li>
<li>Sophy Wong has started a <a href="https://sophywong.com/studionotes/2025/5/13/just-start">Studio Notes</a> blog. I love this post on some strategies to just start making something. I find myself doing the same things fairly often.</li>
<li>Brendon is in Japan and has posted a <a href="https://wavelengths.online/posts/the-home-screen-in-japan-may-2025">home screen update</a> from the trip. I love these kinds of posts, even if I'm not a fan of the iOS look.  Now I have to wait for a bit to post mine though so it doesn't look like I'm piling on.</li>
<li>Adam over at <a href="https://omg.lol">omg.lol</a> made a post about their new venture, a <a href="https://notes.neatnik.net/2025/05/seizing-the-means-of-discovery">web directory for their members</a>. I'm glad that the directory is viewable by non-members. It will join <a href="https://ooh.directory">Ooh Directory</a> in places I visit periodically to find new blogs to follow.</li>
</ul>
<h1 id="videos" tabindex="-1">Videos: <a class="heading-anchor" href="#videos"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<ul>
<li>I stumbled upon <a href="https://www.youtube.com/@BreadOnPenguins">Bread on Penguins</a> recently. I like how quickly and without fanfare she digs into each topic. I probably won't use everything she features, but I've picked up a few settings and tools from her videos that I'm sure I'll use a lot.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Daily Technology: 2025 Edition</title>
        <link>https://tk-web.quest/blog/daily-technology-2025-edition/</link>
        <guid>https://tk-web.quest/blog/daily-technology-2025-edition/</guid>
        <pubDate>Mon, 26 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I've spoken a fair bit about using Linux with my Embracing Open Source series, but I realize I've neglected to give a rundown of what I actually use day to day in a nice, easy to refer to place. So here it is, my complete technology loadout (for now)</p>
<h1 id="at-the-desk" tabindex="-1">At The Desk <a class="heading-anchor" href="#at-the-desk"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>My desktop computer is a workhorse. A bit old, and a bit under-powered by today's standards, it still does everything I need and want. It's an understated black mid-size tower, sitting on a bookshelf by the desk.</p>
<h2 id="the-system" tabindex="-1">The System: <a class="heading-anchor" href="#the-system"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>OS: EndeavourOS</li>
<li>Kernel: Linux 6.12.30-1-lts</li>
<li>CPU: AMD Ryzen 7 3800X</li>
<li>RAM: 32 GB</li>
<li>GPU: AMD Radeon RX6700 XT</li>
<li>Storage: 1x 2 TB NVMe SSD (Linux), 1x 1 TB NVMe SSD (Windows)</li>
<li>Displays: 2x HP 24&quot; 1920x1080 @ 60hz</li>
</ul>
<h2 id="accessories" tabindex="-1">Accessories <a class="heading-anchor" href="#accessories"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>Mouse: Logitech G502 Hero</li>
<li>Keyboard: Logitech G815 (Clicky variant, Romer G switches)</li>
<li>Speakers: Logitech X-140</li>
<li>Headphones: Audio Technica ATH-M40X</li>
<li>Controller: Xbox Series controller (USB-C)</li>
</ul>
<h1 id="in-the-basement" tabindex="-1">In The Basement <a class="heading-anchor" href="#in-the-basement"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I have a home server that lives in my basement. It hosts a variety of private services for myself and my family. I eventually want to include it in my EOS series, but that's probably going to be near the end of the series when I finally get off of most Google services. The machine itself is a smaller mid-size tower on the floor, just plugging along. I'd like to move it into a rack at some point, but this is fine for now.</p>
<h2 id="the-homeserver" tabindex="-1">The Homeserver <a class="heading-anchor" href="#the-homeserver"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<ul>
<li>OS: TrueNAS Scale Electric Eel</li>
<li>CPU: AMD Ryzen 5 1600</li>
<li>RAM: 16 GB</li>
<li>GPU: some old Nvidia GPU, just needed something so the system boots since the CPU doesn't have integrated graphics</li>
<li>Storage: 1x 128 GB SATA SSD (OS) and 3x 4 TB 7200 RPM HDD (bulk storage, in a ZFS pool)</li>
</ul>
<h1 id="in-the-living-room" tabindex="-1">In The Living Room <a class="heading-anchor" href="#in-the-living-room"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I've got a couple of things tech-related in the living room. Basically just the gaming machines. The switch I've had since the console launched. The Optiplex is a bit newer (to me) and was a corporate disposal I was able to pick up on the cheap. Toss a new SSD in there and it makes a pretty great streaming receiver for my desktop PC and can handle some light indie games on its own too.</p>
<ul>
<li>Nintendo Switch (Original, bad battery life model)</li>
<li>Dell Optiplex with a 11th-gen Core i3 and 128GB SSD running Bazzite</li>
</ul>
<h1 id="in-my-pockets" tabindex="-1">In My Pockets <a class="heading-anchor" href="#in-my-pockets"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I carry a few things with me daily. It's pretty normal stuff, but for the sake of completeness, I may as well include it. The watch might be a weird inclusion, but like my Optiplex in the living room, its a corporate disposal I was able to pick up and reset. Funny enough, the factory reset completely removed all of the garbage the company it came from loaded it up with. They didn't even set up their apps on a system partition or anything.</p>
<ul>
<li>Phone: Google Pixel 7a
<ul>
<li>OS: Android 15</li>
<li>Launcher: Niagara Launcher</li>
</ul>
</li>
<li>TicWatch E3
<ul>
<li>OS: Android Wear 3.5</li>
</ul>
</li>
<li>Anbernic RG34XXSP
<ul>
<li>OS: MuOS (Aw Banana)</li>
<li>Storage: 1x 128 GB MicroSD, 1x 64 GB MicroSD</li>
</ul>
</li>
</ul>
<p>Laying it all out I'm both surprised at how much there is and surprised at how little there is. I don't have an additional laptop, tablet, or e-reader. I don't have extra consoles, and I don't have some VPS in the cloud either.</p>
]]></description>
      </item>
    
      <item>
        <title>Declaring Email Bankruptcy</title>
        <link>https://tk-web.quest/blog/declaring-email-bankruptcy/</link>
        <guid>https://tk-web.quest/blog/declaring-email-bankruptcy/</guid>
        <pubDate>Mon, 26 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Email is a scourge on my existence. No, that's not quite right. <em>Most</em> email is a scourge on my existence. There, that's better. I've had my main email account since 2009. That's a <em>lot</em> of email. At first, I was writing this post while filtering and deleting my email, but at this point, I am calling mail account bankruptcy and am deleting huge swaths of messages. I'll keep some recent stuff, some mail that's important, but basically I'm just nuking most of the account from orbit. But how did we get here? How did we get to where I'm looking at 30,000 messages wondering if there's something that I will really regret deleting in here?</p>
<h1 id="gmail-all-mail-and-15gb-of-free-storage" tabindex="-1">Gmail, All Mail, and 15GB of &quot;Free Storage&quot; <a class="heading-anchor" href="#gmail-all-mail-and-15gb-of-free-storage"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>First, some history. On April 1, 2004, google launched Gmail, a free ad-supported webmail client and service. It was an April Fool's joke, but like all the best April Fool's jokes, people actually got something out of it.</p>
<p>Part of Gmail's whole pitch was that you never have to delete anything ever again. All of your mail will always be there for you in a searchable database with good filtering. Instead of hitting &quot;Delete&quot; you are supposed to hit &quot;Archive&quot; where a message will be removed from the inbox, but it'll still hang around in an &quot;all mail&quot; view. The reason this was possible was another innovation of Gmail. Every user would get a chunk of free storage for their email. It started small-ish, at 1GB, but as peoples' accounts aged and email got bigger, with more image attachments and html embedded in the messages, the free storage got bigger. Now, a free Google account will give you 15GB of storage space to be used across Gmail, Google Photos and Google Drive. My 26 years of email alone takes up more than half of that storage allocation.</p>
<p>Now, a modern adage rings true here. If you aren't paying for the service, you're the product. It started innocuous enough. Gmail was a loss leader for Google for a while. Eventually to mitigate some of that, Google started selling advertisements for the Gmail inbox view, and of course, your email is available to them to tailor more advertising to you. In the United States, email 180 days old or older is considered abandoned. That means that everything older than 180 days can be accessed by the government without your consent or knowledge. Twenty six years of my life online All the media piracy sites I had accounts on in college. All of the private conversations Facebook sent me emails about when I was younger. The contents of every single package I've ever received from Amazon or any other online retailer. All of it is in those 30,000 emails and the vast majority of them are available to the government, and probably advertisers too if I had to guess. It's time for that to change.</p>
<h1 id="cleaning-up-my-mess" tabindex="-1">Cleaning up my mess <a class="heading-anchor" href="#cleaning-up-my-mess"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>So, how does one start going about downsizing and categorizing 30,000 messages? Unfortunately, this way leads to madness. The more I filtered, deleted, sorted, filed, and deleted, the more I felt that even the dents I was making weren't worth it. Any reason I'd gone back to old email was pretty unnecessary in the grand scheme of things. I started with handy search terms that come up often in mail you don't need. &quot;Do not reply&quot; and &quot;Unubscribe&quot; and such. These led to big numbers of messages getting deleted, and shredding everything from before 2015 helped too, but in the end I'd worked on it for six hours across two sessions and landed at 2,979 emails remaining. I was paging through messages 25 at a time until I saw a company name, searching for that name, and deleting the five or ten messages that showed up.</p>
<p>I was really close. I could feel it, but each message deleted felt more and more like defeat. I didn't save my mail like this. Not that I really get physical mail worth saving anyway. No, I don't think it's worth holding onto these messages just because I can. I'm glad I looked to see what was even in there, but if this is an exercise at all, it should be an exercise in letting go, not organization.</p>
<h1 id="whats-next" tabindex="-1">What's next? <a class="heading-anchor" href="#whats-next"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I'm really not quite sure. I want to get away from Gmail eventually if I can justify paying for email, but I think in the meantime, I'll commit to deleting anything I receive from a company and anything personal will get archived. My overall deadline for deciding on what to do next is in December. By then I have to clear out my Google Drive and Photos accounts because that's when I am switching from encrypted files stored in Drive to real backup of the home server that's acting as the local host for all of that anyway.</p>
<p>In any case, I'm hoping my email inbox starts becoming a lot more meaningful as I continue to expand my horizons in the indie web and reach out to other bloggers I like.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #3</title>
        <link>https://tk-web.quest/blog/weeknotes-3/</link>
        <guid>https://tk-web.quest/blog/weeknotes-3/</guid>
        <pubDate>Sat, 24 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>
<p>Last weekend was really rough. Just some big deep emotional conversations I don't really want to re-hash or even get sympathy on. I'll process things in my own time. Just mentioning it at all to say that I am okay and my family is okay. I just might be a little more subdued for a bit.</p>
</li>
<li>
<p>I had a final in person interview with one of the companies I'd interviewed with last week and ended up with an offer. I'm going to be working IT support for a Managed Service Provider working with a local school district. After getting the offer, I successfully negotiated an even higher wage than I'd initially even hoped for. Everyone at the office was really nice and I think I'm going to fit in pretty well there.</p>
</li>
<li>
<p>Relatedly, I handed in my notice at the old job fixing wheelchairs. It was a kind of down note, but at the same time I feel like I'm being encouraged to chase the next thing, which is nice. Definitely a job where I would highly recommend my manager and most of the team to anyone looking for work, but would absolutely never ever ever recommend the company I worked for. This is the first company I've ever thought about writing a review for at all and it's because I would give it negative stars if I could. I'll probably establish at this new job for a few months before actually writing that review though.</p>
</li>
<li>
<p>I've been continuing my email conversations with <a href="https://joelchrono.xyz">Joel</a> though the pace is a little more manageable now. It's really great to have a sort of net-pen-pal, if that's the term. Especially someone who gets Linux stuff, which I really don't have in my personal life.</p>
</li>
<li>
<p>I've been sucked into the well that is <a href="https://store.steampowered.com/app/881100/Noita/">Noita</a>. I knew that it was deep, but I had no idea it was <em>this</em> deep. It has the depth of open world survival games like Minecraft or Terraria in terms of material interactions, has roguelike build tuning that would put Balatro and Binding of Isaac to shame, and is lovingly coated with a layer of deep Finnish folklore-flavored alchemy-fueled lore. The sheer ambition in this game is staggering and I feel like it will be a classic for a long time to come.</p>
</li>
<li>
<p>My wife and I are continuing our trek through Season 2 of Twin Peaks. It's a little slow going with the long episodes, but I'm still enjoying it immensely. I cannot fathom that most or all of the questions will have answers by the end (especially knowing the show's troubled continuation and extremely late third season) but it's so specific in its vision that I find it enthralling.</p>
</li>
</ul>
<p>Something I hadn't really considered when I first started doing weeknotes, but I have come to really enjoy when I'm reading weeknotes by other bloggers, is a short list of recommended reading or follows. Here's this week's list.</p>
<ul>
<li>
<p>Phil and Logan re-launched their site this week with new branding and everything. Gordon Hamburger is now <a href="https://www.70percentcomplete.com/welcome-to-70-complete/">70% Complete</a>. I really like the rebrand. The logo treatment and re-introduction post are really great.</p>
</li>
<li>
<p>I've been going through some of Ben Kimmel's blog, <a href="https://thewrittenaddiction.com">The Written Addiction</a> and enjoying it quite a lot.</p>
</li>
<li>
<p>While I don't quite have the same relationship to music as Amin, I really liked <a href="https://benjaminhollon.com/musings/listening-to-less-music/">his post</a> about listening to less music and having a more intentional relationship with the medium. I feel like I probably am similar to him except you could easily replace music with podcasts. Maybe it's time I take a hard look at what I listen to each week and whittle down the list. Especially with my new job being less podcast friendly.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>EOS Mini: zshrc</title>
        <link>https://tk-web.quest/blog/eos-mini-zshrc/</link>
        <guid>https://tk-web.quest/blog/eos-mini-zshrc/</guid>
        <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Welcome to the first Embracing Open Source mini! There are a ton of Linux-adjacent topics that aren't often covered as a part of bigger series, so I wanted to highlight those smaller topics in mini posts. Today's subject is the <code>.zshrc</code> file. If you use fish, dash, bash, or any other shell, this won't really be specific to you, but you may still find some value here.</p>
<p>A command line window is made up of two things in Linux. The first, more obvious one is the Terminal Emulator. This is the program that displays the text from the system that describes commands happening on the system and allows you to interact with and start those commands. The other part is the shell itself. You can think of the shell as the program that interprets what you write into it into commands to give to the system. I use <a href="https://sw.kovidgoyal.net/kitty/">kitty</a> as my terminal emulator and <a href="https://zsh.sourceforge.io/">zsh</a> (Z Shell) as my shell.</p>
<p><code>.zshrc</code> is the file that zsh looks at every time it's opened to set its configuration. The overall configuration for zsh is loaded at different times from different files. For example, if you log into the computer with zsh, then it will load <code>.zprofile</code> at login. All of these files are normally stored at <code>/home/username&gt;/</code>. Since I log in using SDDM, the only zsh config file I use is <code>.zshrc</code>. Let's take a look at the file. Don't worry, we'll do it in chunks.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment">## Environment Variables</span>
<span class="token comment"># Default Programs</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">EDITOR</span><span class="token operator">=</span><span class="token string">"code"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">BROWSER</span><span class="token operator">=</span><span class="token string">"firefox"</span>

<span class="token comment"># Follow XDG Base Dir Specifications</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XDG_CONFIG_HOME</span><span class="token operator">=</span><span class="token string">"<span class="token environment constant">$HOME</span>/.config"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XDG_DATA_HOME</span><span class="token operator">=</span><span class="token string">"<span class="token environment constant">$HOME</span>/.local/.share"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XDG_CACHE_HOME</span><span class="token operator">=</span><span class="token string">"<span class="token environment constant">$HOME</span>/.cache"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XDG_STATE_HOME</span><span class="token operator">=</span><span class="token string">"<span class="token environment constant">$HOME</span>/.local/state"</span>

<span class="token comment"># History files</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">LESSHISTFILE</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CACHE_HOME</span>/zsh-less-history"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">PYTHON_HISTORY</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_DATA_HOME</span>/python/history"</span>
<span class="token assign-left variable"><span class="token environment constant">HISTFILE</span></span><span class="token operator">=</span><span class="token string">"~/.cache/zsh/zsh-history"</span> <span class="token comment"># Moves history file to cache</span>
<span class="token comment"># History options</span>
<span class="token assign-left variable"><span class="token environment constant">HISTSIZE</span></span><span class="token operator">=</span><span class="token number">1000000</span>
<span class="token assign-left variable">SAVEHIST</span><span class="token operator">=</span><span class="token number">1000000</span>
<span class="token assign-left variable"><span class="token environment constant">HISTCONTROL</span></span><span class="token operator">=</span>ignoreboth <span class="token comment"># Ignores duplicate and commands starting with a space</span></code></pre>
<p>Here's the first section of my config. It looks like a lot, but really it's not too bad. The comments should guide us a bit. In case you've never seen scripting before, a comment is a line that the computer doesn't try to interpret. In this config, comments start with one or more hashes (#). As you can see, then, the first section sets some environment variables for default editor and browser.</p>
<p>Next, we have the XDG directory specification. These are commonly used locations for specific types of data. Configuration files should go into <code>/home/&lt;username&gt;/.config/</code> for example. The <code>$HOME</code> variable here translates to the <code>/home/&lt;username&gt;</code> part, so if anyone else put this line into their config, it would still work. the <code>XDG_DATA_HOME</code> can be thought of as <code>%APPDATA%</code> on a Windows machine, basically a home-folder-bound place to store application files so that the user doesn't need extended permissions to use them. The cache directory is where applications should stick their temporary files. The State directory is like a <em>slightly</em> more important version of the cache. It should house data for applications that they may need between restarts, but isn't important enough to go into the data directory.</p>
<p>Next, we have the history file setup. The less history file stores output history anytime the user uses the -less flag on a command or opens manual pages by executing <code>man &lt;command&gt;</code>. The Python history is for python commands, of course. The HISTFILE variable sets up where zsh should send command history. The options after are for the total number of lines to store and how much of that should be stored between sessions. The next line, as the comment says, tells zsh to ignore repeated commands or commands that start with a space.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment"># add ~/.scripts to PATH</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">PATH</span></span><span class="token operator">=</span><span class="token string">"~/.scripts:<span class="token environment constant">$PATH</span>"</span>

<span class="token comment"># Set XDG specification locations for various environment variables</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CARGO_HOME</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_DATA_HOME</span>"</span>/cargo
<span class="token builtin class-name">export</span> <span class="token assign-left variable">DISCORD_USER_DATA_DIR</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${XDG_DATA_HOME}</span>"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">FFMPEG_DATADIR</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>"</span>/ffmpeg
<span class="token builtin class-name">export</span> <span class="token assign-left variable">GOPATH</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_DATA_HOME</span>"</span>/go
<span class="token builtin class-name">export</span> <span class="token assign-left variable">GTK_RC_FILES</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>"</span>/gtk-1.0/gtkrc
<span class="token builtin class-name">export</span> <span class="token assign-left variable">GTK2_RC_FILES</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>/gtk-2.0/gtkrc"</span><span class="token builtin class-name">:</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>/gtk-2.0/gtkrc.mine"</span>
<span class="token builtin class-name">export</span> <span class="token assign-left variable">NODE_REPL_HISTORY</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_DATA_HOME</span>"</span>/node_repl_history
<span class="token builtin class-name">export</span> <span class="token assign-left variable">NPM_CONFIG_USERCONFIG</span><span class="token operator">=</span><span class="token variable">$XDG_CONFIG_HOME</span>/npm/npmrc
<span class="token builtin class-name">export</span> <span class="token assign-left variable">NUGET_PACKAGES</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CACHE_HOME</span>"</span>/NuGetPackages
<span class="token builtin class-name">export</span> <span class="token assign-left variable">BUNDLE_USER_CACHE</span><span class="token operator">=</span><span class="token variable">$XDG_CACHE_HOME</span>/bundle
<span class="token builtin class-name">export</span> <span class="token assign-left variable">BUNDLE_USER_CONFIG</span><span class="token operator">=</span><span class="token variable">$XDG_CONFIG_HOME</span>/bundle/config
<span class="token builtin class-name">export</span> <span class="token assign-left variable">BUNDLE_USER_PLUGIN</span><span class="token operator">=</span><span class="token variable">$XDG_DATA_HOME</span>/bundle
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XINITRC</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>"</span>/X11/xinitrc
<span class="token builtin class-name">export</span> <span class="token assign-left variable">XSERVERRC</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$XDG_CONFIG_HOME</span>"</span>/X11/xserverrc</code></pre>
<p>Here's another section. The first part adds my home folder Scripts directory to the PATH variable so they can be called from anywhere. You might recall a script that would be useful to call from anywhere from the <a href="/content/posts/2025-05-16-newsite">How the new Taming Knots works</a>. This is where that script lives.</p>
<p>The following section is just setting up environment variables for a bunch of stuff I have installed to make them use the correct XDG directories, since not all programs follow the specification.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment"># Source external files</span>
<span class="token comment">## add wal colors support for TTY</span>
<span class="token builtin class-name">source</span> <span class="token variable">$XDG_CACHE_HOME</span>/wal/colors-tty.sh

<span class="token comment"># Load modules</span>
zmodload zsh/complist <span class="token comment"># Completion</span>
autoload <span class="token parameter variable">-U</span> compinit <span class="token operator">&amp;&amp;</span> compinit
autoload <span class="token parameter variable">-U</span> colors <span class="token operator">&amp;&amp;</span> colors <span class="token comment"># Shell Colors</span>

<span class="token comment"># Completion Options</span>
zstyle <span class="token string">':completion:*'</span> menu <span class="token keyword">select</span> <span class="token comment"># Set completion menu to TAB</span>
zstyle <span class="token string">':completion:*'</span> special-dirs <span class="token boolean">true</span> <span class="token comment"># force . and .. to show in Completion menu</span>
zstyle <span class="token string">':completion:*'</span> list-colors <span class="token variable">${(s.<span class="token operator">:</span>.)LS_COLORS}</span> <span class="token assign-left variable">ma</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">\</span><span class="token punctuation">;</span><span class="token number">33</span> <span class="token comment"># Colorize the completion menu</span>
zstyle <span class="token string">':completion:*'</span> squeeze-slashes <span class="token boolean">false</span> <span class="token comment"># Explicitly disabled to allow /*/ expansion</span></code></pre>
<p>The next section sets up colors for TTY, then starts loading modules. The first two lines are to set up the Zsh completion module. This module gives me a menu when autocomplete finds multiple entries that fit what's been typed so far. The next module sets up color highlighting for commands, including the completion menu.</p>
<p><img src="2025-05-18-16-25-24-image.png" alt="an example of the completion menu in action"></p>
<p>The next section is options for the completion module. The comments are pretty self explanatory here.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment">#Main options</span>
setopt append_history inc_append_history share_history <span class="token comment"># History improvements:</span>
<span class="token comment"># History is appended rather than overwriting, is appended as code is executed, </span>
<span class="token comment"># and is shared across sessions</span>
setopt auto_menu menu_complete <span class="token comment"># Autocomplete first menu match</span>
setopt autocd <span class="token comment"># Type the name of a dir to CD into it</span>
setopt auto_param_slash <span class="token comment"># When a dir is autocompleted, add a slash, not a space</span>
setopt no_case_glob no_case_match <span class="token comment"># makes autocomplete not case sensitive</span>
setopt globdots <span class="token comment"># include dotfiles in autocomplete</span>
setopt extended_glob <span class="token comment"># matches ~,#,^</span>
setopt interactive_comments <span class="token comment"># allow comments in shell</span>
setopt notify <span class="token comment"># notify in terminal when a long process completes</span>
stty stop undef <span class="token comment"># stops accidental terminal stop</span></code></pre>
<p>The next section is where we get into zsh's main options. The first one sets up some extra history stuff to make it easier to go back and check it later. The next option sets up completion so that it will automatically write what I select from the menu, so I can just keep typing to get a longer path or set arguments when running a command. The next one is really nice, it lets me <code>cd</code>, or change directory, without typing cd at the beginning of the command. For example, if I open a new shell and want to get to the Taming Knots files, I could just type <code>doc&lt;TAB&gt;P&lt;TAB&gt;t&lt;TAB&gt;&lt;Return&gt;</code> to get to <code>Documents/Projects/taming-knots</code>. Similarly, the next option just makes the autocomplete end with a slash unless another key is pressed so that it's set up for moving through directories automatically and the next option makes it so that the shell doesn't care about case <em>only in the context of autocomplete</em>. Useful if I don't know what case a file might use.</p>
<p>The glob options below make it easier to match to files with special characters or hidden files. Interactive comments adds comments to the shell itself when running commands. By default, zsh doesn't send a notification to the system when a long command finishes. Setting the Notify option fixes that. The last one on the list is disabling the ctrl+S hotkey, which normally stops the terminal in its tracks. I never use it and it causes more problems than it solves.</p>
<pre class="language-shell"><code class="language-shell"><span class="token comment"># keybinds </span>
bindkey <span class="token string">"^a"</span> beginning-of-line
bindkey <span class="token string">"^e"</span> end-of-line

<span class="token comment"># Use Oh My Posh for prompt</span>
<span class="token builtin class-name">eval</span> <span class="token string">"<span class="token variable"><span class="token variable">$(</span>oh-my-posh init <span class="token function">zsh</span> <span class="token parameter variable">--config</span> $XDG_CONFIG_HOME/oh-my-posh/.posh.json<span class="token variable">)</span></span>"</span>

<span class="token comment"># Import colorscheme from 'wal' asynchronously</span>
<span class="token comment"># &amp;   # Run the process in the background.</span>
<span class="token comment"># ( ) # Hide shell job control messages.</span>
<span class="token comment"># Not supported in the "fish" shell.</span>
<span class="token punctuation">(</span>cat ~/.cache/wal/sequences <span class="token operator">&amp;</span><span class="token punctuation">)</span></code></pre>
<p>Final section! The first two just set some useful keybinds to go to the start or end of a line. The next one tells zsh to load up <a href="https://ohmyposh.dev/">Oh My Posh</a> to make the prompt prettier. Finally, the last line tells the terminal to use colors from my wallpaper using <a href="https://github.com/eylles/pywal16">PyWal16</a>.</p>
<p>Overall, my configuration is pretty tame, but so seldom do I see examples of configurations in Linux that I figured it would be a good idea to share and explain what I've done and why.</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #2</title>
        <link>https://tk-web.quest/blog/weeknotes-2/</link>
        <guid>https://tk-web.quest/blog/weeknotes-2/</guid>
        <pubDate>Sat, 17 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<ul>
<li>
<p>Got off of my six-day workweek last week and dove straight into a day and a half of cleaning the house and getting the yard back into shape. I was dead tired after, but this week has been more-ish relaxing, thankfully.</p>
</li>
<li>
<p>I got a wonderful email from a reader and fellow blogger (Check out <a href="https://joelchrono.xyz/">Joel’s blog here</a>.) I’m sure he would say it isn’t much, but I do really appreciate the contact. It’s amazing how much motivation just one message gave me to keep going. We've since been carrying on a longer conversation back and forth. I hope I can forge similar friendships with other bloggers around both the Worst Garbage Online community and in the wider 'net as a whole.</p>
</li>
<li>
<p>I had three interviews this week. The first was with a law firm. I think I did well on it. The second was with a Managed Service Provider over the phone. I must have done well with it because they wanted to schedule a video interview the very next day. That video interview was the third one. The same company that wanted a video interview right away reached out <em>again</em> and I'm now going in to the office to speak to them in person Monday. I had a fourth interview scheduled for a penetration testing company, but the rep dropped out last minute. I guess a meeting went over time. Hopefully we can re-connect sometime next week.</p>
</li>
<li>
<p>Taming Knots has a new home! I love Pika.page, but I was interested in seeing what self-hosting a site would look like. Then I realized site hosting and email hosting are <em>the</em> two things I really don't want to do on my home server because they're annoying to set up and my ISP probably won't like me hosting on my personal connection. I opted for using Hugo with GitHub Pages instead. I don't love hosting it on GitHub, which is owned by Microsoft, but the documentation is just so much better when working with GitHub, so I'm kind of stuck. The nice thing is that storage space is not really a concern, especially given how light Hugo's sites are and as long as I stay under 30,000 files, I won't draw the ire of GitHub, so for now on a technical level, it's the perfect host for my little project, especially since the hosting is free.</p>
</li>
<li>
<p>I've set up local mail clients both on my PC and on my phone. In addition, I've started using PGP encryption on email. I am still using Gmail, but I'd like to eventually move away from the service along with most other Google stuff. I know using encryption for something like Email makes me seem a bit like a crank, but to be honest it's boilerplate privacy tech. I'll probably go over PGP basics in a future <a href="/content/posts/2025-05-15-EOS3">Embracing Open Source</a> post, but for now if you want my pub key, just ask!</p>
</li>
<li>
<p>I'm back on my bullshit again, playing Dark Cloud 2. It's like a comfy warm blanket of a game to me at this point. I normally am very much against upscaled texture packs for old games, but I figured I'd try it this time just to see. So far, everything looks pretty great except for the inventory icons, which are still jagged and low resolution. There's probably just not enough detail there for an algorithm to upscale them while still looking nice.</p>
</li>
<li>
<p>My wife and I finished Season 1 of Twin Peaks, so now we're on to Season 2. I'm fully in new stuff I've never seen before, so I'm excited to go through it.</p>
</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>How the new Taming Knots works</title>
        <link>https://tk-web.quest/blog/how-the-new-taming-knots-works/</link>
        <guid>https://tk-web.quest/blog/how-the-new-taming-knots-works/</guid>
        <pubDate>Fri, 16 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Hello dear reader, and welcome to the brand new Taming Knots! I would say it's improved, but... well it arguably hasn't. But at least it hasn't really gotten worse either. Because of this change, I want to do a rundown of how the site works now, my workflow going forward, and what that means for my writing here. Before all that, though, I should go over the old site a bit and explain <em>why</em> I would want to move.</p>
<h1 id="goodbye-pikapage" tabindex="-1">Goodbye, Pika.page <a class="heading-anchor" href="#goodbye-pikapage"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Like I said in my <a href="https://taming-knots.pika.page/posts/taming-knots-has-moved">moving post</a> on Pika, I love Pika Page and everything else Good Enough makes. They seem to have a really great vision for the kinds of things they want to make and how to make those sustainable. To be perfectly honest, I'm kind of sad to not use their platform anymore.</p>
<p>The reasons I'm moving away from Pika are twofold. First, and the most practical thing, is that I am a very cheap person generally. It's very hard for me to justify spending sixty dollars a year or more (with a domain) on the blog when cheaper options that meet the same requirements are available. I put myself under very stringent budgetary constraints regularly. I understand that, for a lot of folks, sixty bucks isn't a lot and they are right. But what if I could host the blog for free on Github Pages in exchange for a little extra work on my end? That suddenly removes a ton of pressure for me to write continuously and allows me to have more fun with the writing of the blog.</p>
<p>The second reason is kind of linked up with that last point. I am finding a lot of enjoyment in building out a layer of services that I maintain myself or at least allow me to do some more nuts and bolts work on them. I've set up media streaming, cloud-less cloud storage, an RSS reader and subscription server, and a few other things for my home server. I originally also wanted to host the blog there, but I think it's more secure to put a separation between my personal files and the public blog. As a sort of half-step measure between having a fully managed service to blog on and hosting it myself, I've taken to using a static site generator to build and maintain the blog, but using a separate service provider to host it. The benefit? this service provider's free limitations are extremely generous. I could write thousands of posts, even with images and not run out of space. But I'm getting ahead of myself.</p>
<h1 id="enter-hugo" tabindex="-1">Enter Hugo <a class="heading-anchor" href="#enter-hugo"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p><a href="https://gohugo.io/">Hugo</a> is a static site generator. Most websites on the internet are dynamic, offering interactive elements, tracking, analytics, advertising, and myriad other bells and whistles. Hugo, and similar generators like Jekyll or 11ty, work by taking some input files, usually markdown text, applying a set of HTML and/or CSS templates to them, then spitting out static HTML webpages. These pages are light and fast to load, even on slow mobile networks and thanks to the HTML and CSS, they look pretty nice too.</p>
<p>I started by trying Jekyll, since it came recommended by my blog pal, Joel. I ran into a snag when I tried to deploy the site though, so I eventually dropped it. I briefly looked at 11ty, but I didn't really like the setup for it. The last one I tried, Hugo, was immediately the one I stuck with. There were a few false starts surrounding theming, but eventually I realized that I was thinking about modifying an existing theme all wrong and got everything up and running fairly smoothly.</p>
<p><img src="2025-05-16-21-47-58-image.png" alt="The website directory"></p>
<p>The site directory is laid out in a sensible way. <code>archetypes</code> holds the basic layout for the front matter for blog posts. <code>assets</code> holds an override for the theme's colors (more on that in a minute) and exists to hold site assets like the favicon or other commonly used images, scss, or css that will be used all over the site. <code>content</code> is where the posts and pages live (in their own subfolders.) <code>data</code> is a folder for shortcode that can take input data from another source and output it in a nice format inside a post. I don't forsee myself using that one much. <code>i18n</code> is for localization content, basically allowing the blog to be multilingual if only it were so easy for me to pick up another language. <code>layouts</code> is for overrides to default page layouts set by the theme. <code>public</code> is where Hugo outputs the final site in HTML for consumption. <code>resources</code> holds the resources the code snippets in <code>data</code> take as input. <code>static</code> is where images that are hosted on the blog go. Finally, the <code>themes</code> directory is where the site's theme, <a href="https://github.com/hugo-sid/hugo-blog-awesome">hugo-blog-awesome</a> lives. The directory structure of the theme is basically identical to the base hugo structure. The theme's files act as a base and the main directory override those files. For example, this is what <code>themes/hugo-blog-awesome/assets/sass/main.scss</code>'s first two sections look like:</p>
<pre class="language-scss"><code class="language-scss"><span class="token comment">//////////////// 1. Light Colors /////////////////</span>
<span class="token property"><span class="token variable">$text-base-color</span></span><span class="token punctuation">:</span> #434648<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$text-link-blue</span></span><span class="token punctuation">:</span> #003fff<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$text-link-blue-active</span></span><span class="token punctuation">:</span> #0036c7<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$bloquote-border</span></span><span class="token punctuation">:</span> #c4c8cc<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$blockquote-text</span></span><span class="token punctuation">:</span> #525b66<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$inline-code-text</span></span><span class="token punctuation">:</span> #333638<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$inline-code-bg</span></span><span class="token punctuation">:</span> #d8dbe2<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$toc-bg</span></span><span class="token punctuation">:</span> #edecec<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$go-top-bg</span></span><span class="token punctuation">:</span> #dfe0e397<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$go-top-bg-hover</span></span><span class="token punctuation">:</span> #dfe0e3<span class="token punctuation">;</span>

<span class="token property"><span class="token variable">$black</span></span><span class="token punctuation">:</span> #0d122b<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$light</span></span><span class="token punctuation">:</span> #ececec<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$smoke</span></span><span class="token punctuation">:</span> #d2c7c7<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$gray</span></span><span class="token punctuation">:</span> #6b7886<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$white</span></span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>

<span class="token comment">//////////////// 2. Dark Colors /////////////////</span>
<span class="token property"><span class="token variable">$dark-text-base-color</span></span><span class="token punctuation">:</span> #babdc4<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-text-link-blue</span></span><span class="token punctuation">:</span> #77a8fd<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-text-link-blue-active</span></span><span class="token punctuation">:</span> #5292ff<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-bloquote-border</span></span><span class="token punctuation">:</span> #4a4d56<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-blockquote-text</span></span><span class="token punctuation">:</span> #9b9ba3<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-inline-code-text</span></span><span class="token punctuation">:</span> #c2c4ca<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-inline-code-bg</span></span><span class="token punctuation">:</span> #2d2d2d<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-toc-bg</span></span><span class="token punctuation">:</span> #323232<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-go-top-bg</span></span><span class="token punctuation">:</span> #676767b3<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-go-top-bg-hover</span></span><span class="token punctuation">:</span> #676767<span class="token punctuation">;</span>

<span class="token property"><span class="token variable">$dark-black</span></span><span class="token punctuation">:</span> #131418<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-white</span></span><span class="token punctuation">:</span> #eaeaea<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-light</span></span><span class="token punctuation">:</span> #1b1d25<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-smoke</span></span><span class="token punctuation">:</span> #4a4d56<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-gray</span></span><span class="token punctuation">:</span> #767f87<span class="token punctuation">;</span></code></pre>
<p>Basically it sets a bunch of colors. Now here's the first sections of the <code>main.scss</code> file located in <code>asseets/sass</code> in the main site directory:</p>
<pre class="language-scss"><code class="language-scss"><span class="token comment">//////////////// 1. Light Colors /////////////////</span>
<span class="token property"><span class="token variable">$text-base-color</span></span><span class="token punctuation">:</span> #000D1B<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$text-link-blue</span></span><span class="token punctuation">:</span> #015D9D<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$text-link-blue-active</span></span><span class="token punctuation">:</span> #004577<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$bloquote-border</span></span><span class="token punctuation">:</span> #c4c8cc<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$blockquote-text</span></span><span class="token punctuation">:</span> #57606b<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$inline-code-text</span></span><span class="token punctuation">:</span> #000D1B<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$inline-code-bg</span></span><span class="token punctuation">:</span> #d8dbe2<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$toc-bg</span></span><span class="token punctuation">:</span> #edecec<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$go-top-bg</span></span><span class="token punctuation">:</span> #dfe0e397<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$go-top-bg-hover</span></span><span class="token punctuation">:</span> #dfe0e3<span class="token punctuation">;</span>

<span class="token property"><span class="token variable">$black</span></span><span class="token punctuation">:</span> #0d122b<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$light</span></span><span class="token punctuation">:</span> #e9b394<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$smoke</span></span><span class="token punctuation">:</span> #D4916B<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$gray</span></span><span class="token punctuation">:</span> #B47458<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$white</span></span><span class="token punctuation">:</span> #ebd1c2<span class="token punctuation">;</span>

<span class="token comment">//////////////// 2. Dark Colors /////////////////</span>
<span class="token property"><span class="token variable">$dark-text-base-color</span></span><span class="token punctuation">:</span> #bfc2c6<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-text-link-blue</span></span><span class="token punctuation">:</span> #D4916B<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-text-link-blue-active</span></span><span class="token punctuation">:</span> #B47458<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-bloquote-border</span></span><span class="token punctuation">:</span> #4a4d56<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-blockquote-text</span></span><span class="token punctuation">:</span> #9b9ba3<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-inline-code-text</span></span><span class="token punctuation">:</span> #bfc2c6<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-inline-code-bg</span></span><span class="token punctuation">:</span> #005270<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-toc-bg</span></span><span class="token punctuation">:</span> #323232<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-go-top-bg</span></span><span class="token punctuation">:</span> #676767b3<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-go-top-bg-hover</span></span><span class="token punctuation">:</span> #676767<span class="token punctuation">;</span>

<span class="token property"><span class="token variable">$dark-black</span></span><span class="token punctuation">:</span> #000D1B<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-white</span></span><span class="token punctuation">:</span> #eaeaea<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-light</span></span><span class="token punctuation">:</span> #00406d<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-smoke</span></span><span class="token punctuation">:</span> #00284b<span class="token punctuation">;</span>
<span class="token property"><span class="token variable">$dark-gray</span></span><span class="token punctuation">:</span> #42474e<span class="token punctuation">;</span></code></pre>
<p>As you can see, the colors have been changed. This override file lets me change those colors without modifying anything else about the theme. Similarly I can make modified copies of anything in the <code>themes</code> directory to make new overrides to change other parts of how the site looks. In fact, the <code>hugo.toml</code> file in the root of the site is itself an override of the theme's version.</p>
<h2 id="writing" tabindex="-1">Writing <a class="heading-anchor" href="#writing"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>As mentioned before, all of the site's content is in markdown files and images. Markdown syntax is really easy to write in and provides <em>most</em> easy layout options. It turns <code>*this* **weirdly formatted** *text*</code> into <em>this</em> <strong>weirdly formatted</strong> <em>text</em>. It can handle lists, ordered lists, links, and a bunch of other useful stuff. When sent through the Hugo parser, you can even mix HTML with Markdown. That's how I've embedded the Letterbird contact form for the site in the <a href="/pages/contact">Contact Page</a>.</p>
<p>As for <em>how</em> I write the posts, I've tried a few markdown editors and I've landed on <a href="https://www.marktext.cc/">MarkText</a> It does a few things for me that I really like. It can be set up to open a directory of files in the sidebar automatically so I can easily reference old posts. It supports front matter in the format Hugo expects (although I do wish it could automatically add the parameters that Hugo expects in the front matter.) It also supports automatically adding images from the clipboard or dragged into the editor to the site's <code>static</code> directory. When an image is added to the editor, it uses this syntax to automatically embed the image. <code>![](/../../static/img.png)</code>. Hugo doesn't technically need the <code>/../../static</code> part, but this setup allows the MarkText preview to correctly display images and doesn't break anything for the site.</p>
<p>Once a post is written and ready to publish, I flip the <code>draft = </code> parameter in the front matter to true, then save the file in <code>/content/posts</code>. With everything staged and ready, I open a terminal and execute my deployment script.</p>
<p>The deployment script is a tiny, simple shell script that just combines a few commands for me. It looks something like this</p>
<pre class="language-shell"><code class="language-shell"><span class="token shebang important">#!/bin/bash</span>
<span class="token assign-left variable">CWD</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">pwd</span><span class="token variable">)</span></span>
<span class="token builtin class-name">cd</span> /home/brent/Documents/Projects/taming-knots
hugo
<span class="token function">git</span> <span class="token function">add</span> <span class="token parameter variable">-A</span>
<span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"Updated Blog"</span>
<span class="token function">git</span> push
<span class="token builtin class-name">cd</span> <span class="token variable">$CWD</span></code></pre>
<p>The script saves the currently open directory in a variable, <code>CWD</code>, then changes to the location of the blog folder. The <code>hugo</code> command makes Hugo build the site locally first. It's not necessary for me, but I like to see if it hits any errors right away. Then, the script looks for and adds any changed or new files to a commit, writes a commit message, then pushes the change to GitHub Pages before setting the terminal directory back to where it was open previously. The script is saved into a <code>~/.scripts/</code> folder that I have added to my <code>$PATH</code> so that I can invoke it from anywhere in the system and it will still work and put me right back where I was.</p>
<h2 id="deployment" tabindex="-1">Deployment <a class="heading-anchor" href="#deployment"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h2>
<p>Once the files are pushed to GitHub, the repository automatically runs the build and deploy action through a GitHub Workflow. I use the one Hugo's developers recommend with no modification at all, so I won't clog up the post by pasting it here. It basically just sets up a temporary environment just to run the <code>hugo</code> command, then deploys everything in the <code>public</code> folder to the Github Pages url. Adding a new post takes about thirty seconds. Not too shabby for free.</p>
<p>The site is hosted on GitHub Pages, but the domain I use is registered with <a href="https://porkbun.com/">Porkbun</a>. Porkbun is my name server as well, so I just have it set up with an A record to forward to GitHub Pages and I put the domain in to the Github Pages control panel for the repository to make sure it gets forwarded to the right place.</p>
<h1 id="wrapping-up" tabindex="-1">Wrapping up <a class="heading-anchor" href="#wrapping-up"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Welp that's about it. I might go deeper into how I set up the site in the first place, but honestly Hugo is so easy to work with that I would recommend just going for it and trying it yourself if you're curious. The official documentation is great as well. Sure it's a little more fiddly than the excellent Pika.page editor, but it was fun and interesting to set up and now I have a complete, working offline copy of the site with backups of all of my posts so if anything happens to Taming Knots, I'll be able to put it back up somewhere else.</p>
]]></description>
      </item>
    
      <item>
        <title>Embracing Open Source Part 3: The Year of the Linux Desktop</title>
        <link>https://tk-web.quest/blog/embracing-open-source-part-3-the-year-of-the-linux-desktop/</link>
        <guid>https://tk-web.quest/blog/embracing-open-source-part-3-the-year-of-the-linux-desktop/</guid>
        <pubDate>Thu, 15 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post is a part of my Embracing Open Source series. You can read the last post</em> <a href="/posts/2025-05-02-EOS2"><em>here</em></a><em>, or if you are particularly interested in a related topic or want to get in touch with me about the series, please</em> <a href="/pages/contact"><em>send me a message</em></a><em>.</em></p>
<p>The “Year of the Linux Desktop” has been so often repeated and shouted about, especially from the maintainers of Linux distributions that it may be the biggest joke in the entire Linux community. I think this joke continues to exist for a couple of reasons. The first is that the idea of any Linux distribution being friendly enough that a user never ever has to type a command or edit a file is laughable. The second is that, for most Linux users, that friendliness comes with limitations that they’re just not interested in. So the joke stays and will stay with us to the heat death of the universe.</p>
<p>Don’t misunderstand me here. Linux is still perfectly usable on the desktop and, depending on distribution and desktop environment, can be used almost exclusively using the graphic user interface rather than a command-line interface. The key operator here is <em>almost</em>. Unlike the previous posts, this is going to be a lot looser with less real advice. I’m mostly just going to try to explain why I use the things I do. This is building off of Part 2 in this series, so if you aren’t familiar with things like linux distributions, then please go back and read that.</p>
<h1 id="kde-plasma" tabindex="-1">KDE Plasma <a class="heading-anchor" href="#kde-plasma"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>I don't use Plasma day-to-day anymore, but I do still keep the desktop environment on my machine for a couple of good reasons. Firstly, if I ever have an application that misbehaves on my tiling window manager setup in Hyprland, I can flip over to Plasma quickly to make it work. The second reason is that it's a good way to have a very robust set of basic utilities you'd expect to find on any modern operating system that might not be packaged with a more do-it-yourself style desktop environment.</p>
<p><a href="https://kde.org/plasma-desktop/">KDE Plasma</a> is the default desktop environment for Manjaro, and is available as an edition or flavor of nearly every other Linux distribution, including the one that I use, <a href="https://endeavouros.com/">Endeavour OS</a>. KDE is robust and well-maintained, with an extensive suite of packaged applications that are often recommended as the best in class option to fill each role. For example, Kate, the text editor is great and is only barely upstaged by Code, the open source version of Microsoft's excellent Visual Studio Code text editor.</p>
<p>Plasma works similarly to Windows's desktop environment. By default you get a panel along the bottom of the screen with an application launcher, task manager, and system tray. The desktop supports icons, shortcuts, folders and files. Your system settings are all located in the KDE settings application which is honestly better than what Microsoft provided for the entirety of Windows 8 and through most of Windows 10. Windows are floating unless you make them fullscreen, and plasma even supports windows-esque snapping. Overall it's a very familiar and safe option to use as a desktop environment while still looking very stylish and modern. It's hands down my pick for a desktop environment if you're coming from Windows and looking to try your hand at Linux.</p>
<h1 id="hyprland" tabindex="-1">Hyprland <a class="heading-anchor" href="#hyprland"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>So if I don't use KDE, what is the desktop that I do use like?</p>
<p><em>Dear reader, I warn you. This way lies madness.</em></p>
<p>Hyprland is what people pick when they enjoy the setup of a system just as much as actually using it for doing things. When you first install it, you are constantly adding extra bits and pieces, editing text files to change the configuration, and spending just as much time in a text editor and terminal as you would normally be spending watching <a href="https://www.youtube.com/watch?v=emUCJL4CCfs">videos of ravens asking if they're a good boy</a>. Once you get everything just right though? you find more things to tinker with. BUT THEN if you get all those things set up the way you like, it's a dream to use.</p>
<p>The paradigm for how windows work on basically any other OS is tossed out the window with a tiling window manager. When I open a program in Hyprland, it fills the screen automatically. If I open another window, it will automatically resize the existing window to be half the screen and the new window will fill in the other half. Keep opening new windows and the space will keep subdividing.</p>
<p><img src="hypr-subdivide.png" alt="This is what Hyprland looks like with 10 windows open on a single desktop."></p>
<p>With hotkeys, you can move windows around, re-arrange the layout, and even convert a tiled window into a floating one. In this way, the tiling window manager is kind of the opposite of modern floating window desktop environments. In KDE you can snap as an option. In Hyprland, snapping is the default and a floating window is an option.</p>
<p>The other big difference is in customization. I'm not talking just visual theming, though that certainly is something you can do with Hyprland. What I mean is that every default, every hotkey, every single thing that Hyprland does on a surface level view, is controlled by a single configuration file. Because that file is explicit in its construction, you can change anything you want. For example, on my install of Hyprland, if I press Super (the windows key) and E, it will open Thunar, my file manager. I specified Thunar as the default program in the Hyprland config, then manually set a keybind to open the default file manager further down the config file.</p>
<p>The way Hyprland's configuration works is a sort of &quot;best-practice&quot; in Linux and in window managers especially. If a component is built for use with window managers, all of the defaults will be explicitly written into the config file and you are encouraged to make any edits you want to that config in order to make it yours. Similarly, since Hyprland doesn't come with a lot of things, like a task bar, system tray, lock screen, notification center, or even a clock, you are expected and encouraged to install those components separately and the development community has done a wonderful job of supplying sample configurations and varied examples of each component. Here's a list of what I've landed on with regards to customization components.</p>
<ul>
<li>
<p>Waybar - Similar to a Desktop Environment Panel, or taskbar in Windows terminology, except Waybar is extremely customizable. My install doesn't even really look like a task bar. It's just a couple clusters of icons and useful information at the top corners of each of my screens.</p>
</li>
<li>
<p>Hyprlock - A lock screen built for use with Hyprland. I can hit Super+L to lock my screen and hide open applications. The config is extremely open ended though, so you can really make your lock screen look however you like.</p>
</li>
<li>
<p>Wofi - An application launcher similar to Apple's spotlight. Super+Spacebar pulls up a floating window with a text prompt. I type in what I want to launch and it automatically populates and updates a list of programs. Enter to launch.</p>
</li>
<li>
<p>Wlogout - A tool to quickly log out, shut down, or reboot my computer. Super+M brings up the menu, and I can select options by clicking or using the arrow keys.</p>
</li>
<li>
<p>SwayNC - A notification center. It integrates with Waybar and I have them themed similarly.</p>
</li>
<li>
<p>SpectacleRC - A screenshot tool. Super+S starts the tool and I can click and drag to select an area to get a screenshot of. Screenshots automatically get put in my clipboard.</p>
</li>
<li>
<p>Clipse - A clipboard manager. Has a dedicated terminal UI that will show up with Super+V</p>
</li>
</ul>
<p>So, if I use Hyprland and like it, why not recommend it widely? I think it's pretty safe to say that most people don't want to and shouldn't have to type in settings for their programs line by line in a configuration file. It's just not a great experience for most people. There are, however, the sickos out there like me that enjoy the setup process. For those people, a simple description of what Hyprland is and how it is configured will be plenty to make them go try it on their own regardless of what I'm saying I recommend or not.</p>
<p>In the end, whatever you use is great if it works for you. And if you decide to go down the Window Manager hole with me, then I salute you!</p>
]]></description>
      </item>
    
      <item>
        <title>Weeknotes #1</title>
        <link>https://tk-web.quest/blog/weeknotes-1/</link>
        <guid>https://tk-web.quest/blog/weeknotes-1/</guid>
        <pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>I want to get into the habit of writing more often. <a href="https://gilest.org/doingweeknotes/index.html">Weeknotes</a> seems like a good way to hone the skill a bit and reflect on prior weeks as I do.</p>
<ul>
<li>I did an extra day of work this week, my overtime clocked in at around 9 hours for the pay period. My notes are probably going to be really light because of it.</li>
<li>I did twelve job applications. I got emails to set up interviews on two of my previous applications from last week or the week before. I also got a call on one, but the pay was too low.</li>
<li>My wife and I have continued to plug along in Twin Peaks. We’re almost done with the first season. I’m surprised she’s liking it as much as she is. I hope the remainder of the show doesn’t leave her cold.</li>
<li>I wrote two blog posts last week in my “Embracing Open Source” series. These were mostly background. I’m looking forward to the second “part” of the series where I go into detail about my setup and experiences with Linux as a daily driver OS and <a href="https://hyprland.org/">Hyprland</a> as my most recent desktop environment love.</li>
<li>I didn’t do much gaming this week. I mostly just came home and slept after work. I did check out the demo for <a href="https://store.steampowered.com/app/2533600/Bloodthief/">BloodThief</a> though and it seems like a really fantastic speed game. It will be interesting to see how much the developer leans in to it. So far it seems like a lot.</li>
<li>I’ve been futzing with my RSS reader setup a lot these past few days, trying to find good blogs to subscribe to. Today I got <a href="https://docs.rsshub.app/">RSS Hub</a> set up to compliment my existing <a href="https://freshrss.org/index.html">FreshRSS</a> install. Now, I can use RSS Hub to dig up and generate RSS feeds for more stuff on the internet.</li>
<li>Tonight is Chinese food and digging into <a href="https://store.steampowered.com/app/3567760/Twigs_Adventure_64/">Twig’s Adventure 64</a>, a game by a developer I really like that specializes in little collectathon platformers.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Embracing Open Source Part 2: Linux</title>
        <link>https://tk-web.quest/blog/embracing-open-source-part-2-linux/</link>
        <guid>https://tk-web.quest/blog/embracing-open-source-part-2-linux/</guid>
        <pubDate>Fri, 02 May 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post is a part of my Embracing Open Source series. You can read the last post <a href="posts/2025-04-30-EOS1.html">here</a>, or if you are particularly interested in a related topic or want to get in touch with me about the series, please <a href="/pages/contact">send me a message</a>.</em></p>
<p>Linux is a tough topic to wade into, but this will be a pretty general overview of my path into using the open source operating system for the last year and change, as well as some general recommendations and best practices to keep in mind when trying to dive in yourself. My recommendations shouldn’t be taken as gospel, and everything I say is up to your interpretation anyway, so if you have a different preference, then that’s great! Part of what makes Linux such a great OS to use is that there’s so many options.</p>
<p>Like I wrote in my previous post, I’ve been a casual observer of Linux for a long time, only dipping my toes in here and there. At some point in the fall of 2023, however, I decided I’d like to try to fully dive in to running Linux and only Linux as much as I could. At first, it started as a kind of fun challenge for myself, but I quickly found out that I just prefer the way Linux handles a lot of things. Here’s how things progressed for me.</p>
<p>In late 2023, I installed a second hard drive in my primary desktop PC. I installed Manjaro to it so that I could leave the Windows drive intact for my wife to use whenever she wanted to use my computer for something. Over the next year or so, I made small modifications to the system, tinkering here or there when I tried to do something and couldn’t or wanted to use a new program that wasn’t in the default repositories. I figured out how Systemd Mount Units work, installed the KDE Discover store, set up flatpak, and used Proton with non-steam games. I dipped my toes ever so slightly into the terminal. I even tried to install some things from the AUR (Arch User Repository) which didn’t work, but I assumed it was something I was doing wrong.</p>
<p>Over time, I started to understand what kind of OS I’d installed. My previous Linux experience was with Ubuntu and Linux Mint, both of which do major releases once or twice a year, with minor updates in between. Manjaro, on the other hand, is a rolling release. That means that packages go live very quickly without being held back for a major version change of the underlying system. I liked this change. It felt like I was getting new features more frequently and stuff was staying up to date better. I also was having less in the way of programs insisting that their dependencies were out of date than in my previous experience. Overall I had a good time. There were problems, though, that I would only start to discover later.</p>
<p>Earlier this year, I switched to EndeavourOS, which is less of a distribution all its own and more an installation script that runs after a basic Arch Linux install to set up some basics that Arch normally doesn’t give you right off the bat. Manjaro is also based on Arch, but they have different repositories and a different methodology for package releases, which means packages can be out of date. Normally this isn’t a big deal, but anytime you try to use the AUR, those build files will often insist on having the latest packages and will fail if they aren’t available. Overall, Manjaro feels like it’s bolted on to the existing OS, while EndeavourOS feels like a layer of helpful tools that floats on top.</p>
<p>My current EndeavourOS experience is that the AUR works, I use the terminal a lot more, and I’ve had to fight with a few things here and there to get everything working just right. It’s not all roses, but if something isn’t working quite as expected, I usually can figure out what is going on and fix it. More reliance on the terminal is kind of a blessing in disguise. Oh, and I’m using Hyprland, which is a tiling window manager (more on that in a bit) that looks really snazzy and is a joy to use, but is also completely different to how I used to use my computer.</p>
<h1 id="picking-a-distribution" tabindex="-1">Picking a Distribution <a class="heading-anchor" href="#picking-a-distribution"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay, so you’re feeling emboldened. Maybe you want to install it on a virtual machine first. Maybe you want to just dive right in. Either way, you need to pick a distribution. Linux itself is just the kernel. You can’t really use plain Linux as an operating system, so maintainers and developers will build out distributions, versions of the OS that are the same kernel underneath, but might have different packages surrounding that kernel. There’s a few things to keep in mind when picking a distribution to try. How big is the team behind it and how big is the community? Does the distribution use a rolling release, or a set release schedule? Is the distribution based on something else, or is it its own top level thing? Is it immutable? Let’s go through these one at a time.</p>
<p>First off, the team size behind a distribution and the size/activity level of the community is huge. Unlike a commercial OS, no one is being paid to support you if something breaks or isn’t working right. The community around a Linux distro and the size of the team behind it does a lot to show you how likely it is that someone out there has an answer for your question. Ubuntu, for example, has a big team at Canonical running the show and the community is pretty extensive. Arch, on the other hand, has a slightly smaller community, but the activity level and knowledge of that community is huge. Generally, I’d suggest staying away from distributions with small teams or communities. Stick to well recognized names. Fedora, Arch and Ubuntu are all good starting points. Which one to go with will depend on the other factors.</p>
<p>Next, consider the stream. Is the distribution you’re considering downstream from something else? Some distributions are based on others. For example, Manjaro is based on Arch. Ubuntu is based on Debian. Linux Mint is based on Ubuntu. Sometimes this is a benefit. If something isn’t working in Linux Mint, the likelihood of a solution for Ubuntu working is pretty high. That said, every layer of abstraction from the upstream sources means updates will take longer to get to you and you might have to contend with distribution-specific changes which negates the increased community size from being based on something else, like there’s some issues I had in Manjaro that couldn’t be fixed by looking for Arch knowledge because those issues came from the way Manjaro’s maintainers handle packages and hold some back for more testing. I decided to go with EndeavourOS partially because it leaves basically all of the base Arch distro intact, while just doing some of the setup footwork for me.</p>
<p>Windows and Mac users will be used to the periodic release schedule of something like Ubuntu. Every year, Ubuntu releases new versions in April and October, just like Microsoft will do their “H1” and “H2” releases for the first and second half of the year. You still get updates in between, but those updates are for the packages and programs on top of the base OS, not anything core to the OS itself. This means that if a core component of the OS gets a new feature, any developer that wants to use that feature can’t update until the next major OS release. This release methodology increases the stability of the OS, but also means that at worst your packages may be six months out of date. It also introduces the risk of a version upgrade breaking things because so much is changing at once and maybe not all of the programs you use or their dependencies are ready for the jump when you do the upgrade. A rolling release, on the other hand, is meant to basically be always up to date. Every time a package, core or not, gets an update, you can apply it. It means that every time you update, something might break, but in actual use it means developers can keep their programs up to date and using the latest features as much as possible. Just make sure you update at least once every couple weeks or you might find that the system refuses to update or something else breaks. Arch, OpenSuse Tumbleweed and distributions based on them are rolling releases. Linux Mint, Ubuntu, Fedora, and Debian are all periodic releases.</p>
<p>You may have heard of an Atomic OS or an Immutable OS. These distributions use layers of abstraction to make the core of the OS completely unchangeable by the end user. This is how Mac OS is built these days. Every install is exactly identical on the system level as long as it’s using the same OS image. This is nice because users can’t destroy their install nearly as easily and backing up or restoring the OS is trivial. The downside is that some changes that a user might want to make become more difficult and will be wiped out with new updates because the core of the OS is completely overwritten when a new version is installed. Fedora Silverblue, Bazzite, and Steam Deck OS all work this way. Most other distributions don’t. I like to get under the hood, so I avoided these for my main computer, but my home theater PC doesn’t need to be as customized, so I put Bazzite on it.</p>
<p>Finally, after looking at all of those aspects, do a little bit of research into the intention and ideology of the team making the distributions you are considering. Read the websites, try to get a feel for what they want their OS to do. What is important to them. Compare that against what you want to do or are interested in. For example, this blurb is on the EndeavourOS home page: “Start your Endeavour with a lightweight Arch-based, terminal centric system ready to personalise and a stellar community at your side.”  It tells you right away that if you aren’t interested in a system that is built to rely on the terminal for core functions, you should stay away. Likewise, if you are looking for a strong community for support, this might be a good spot for you. Compare this to Linux Mint: “Linux Mint is an operating system for desktop and laptop computers. It is designed to work 'out of the box' and comes fully equipped with the apps most people need.” They’re focusing on making things work with little configuration and are touting the idea that the OS comes with a bunch of software already installed. This might be a better OS for you if you just want to pick up and go without worrying much about configuring the system or dealing with the terminal, but on the other hand, maybe they’ve made some decisions about what software “most people need” that you won’t agree with, so you’ll have to go searching for alternatives or spend time removing junk you don’t want.</p>
<p>There’s one final thing to mention before we close; the Desktop Environment. if the Linux kernel is the core and the Distribution is the layer of core packages around that core, the desktop environment is the top layer of applications the user will be interacting with every time they use the computer. Sure, this means the browser or word processor, but also the file manager and general desktop. Unfortunately, there’s not a ton of guidance I can give here other than telling you to look at the screenshots of the various flavors of desktop environment available for the distribution you choose. Usually the big names are the most well documented and reliable. The two giants in this category are GNOME and KDE Plasma. Both of which are available on a huge number of distributions. Others, like XFCE, Cinnamon or Mate, are usually pretty good, but maybe a little less well supported with customizations. There is, however, a different category of desktop environment available. The Window Manager. These are basically the desktop environment alone with no bells or whistles. Some won’t even come with a taskbar by default. Naturally, these are much more difficult and time consuming to configure, but it also means that the configuration is usually portable between computers and there are a lot more options to set things up exactly how you like. Window managers include Sway, i3 and Hyprland, among others. If you’re new to Linux, I suggest sticking with the standard Desktop Environment options, rather than going for a window manager. If you’re interested in a more in-depth exploration of my window manager of choice, Hyprland, then watch this space. I’ll get to it sooner or later in this series.</p>
<p>I hope all of this is helpful to someone. Linux is a hard thing to build recommendations for, since the experience of using a Linux desktop can be so varied. Next time, we’ll explore Hyprland and how I’ve got my desktop set up with a tiling window manager for the first time.</p>
]]></description>
      </item>
    
      <item>
        <title>Embracing Open Source Part 1: Ideology and Background</title>
        <link>https://tk-web.quest/blog/embracing-open-source-part-1-ideology-and-background/</link>
        <guid>https://tk-web.quest/blog/embracing-open-source-part-1-ideology-and-background/</guid>
        <pubDate>Wed, 30 Apr 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post is the start of a series I’ve been wanting to write for a long time. I want to chronicle my journey with Linux, Free and Open Source Software, and taking back control over my data and my devices. If there’s a topic you are particularly interested in reading about in a future installment, please feel free to <a href="/pages/contact">send me a message</a>.</em></p>
<p>It’s been nearly twenty years since I got a PC that was mine and mine alone. It was a laptop, a Dell XPS Studio 1640. It was huge, thick and heavy with a bright red top and a leather strip on the lower part of the screen’s back. I loved that thing. It was 2009 and most of the corporations that are in the news now for <a href="https://www.theverge.com/news/650665/google-loses-ad-tech-antitrust-monopoly-lawsuit">anti competitive practices</a> and <a href="https://www.scientificamerican.com/article/heres-why-states-are-suing-meta-for-hurting-teens-with-facebook-and-instagram/">harming teens</a> were on the upswing. It was a golden age of free software that — because the companies involved were raising venture capital funding — was more focused on gaining users than anything else. Windows was still an operating system you paid for, and Adobe Creative Cloud was still four years away. We were starting to move towards the enshittification hole, but we hadn’t tipped over the edge quite yet.</p>
<p>This was around the same time that I first heard of Linux, an alternative operating system to the commercial juggernauts Apple and Microsoft were peddling. I even tried Linux, booting into an Ubuntu 10.04 live CD on my red leather laptop. It was an interesting experiment, but Linux wasn’t ready for me yet, and more importantly, I wasn’t ready for Linux yet. Even with the release of the poorly received Windows 8, I went back to Microsoft, to what was comfortable and familiar.</p>
<p>Over the years, I heard more and more about how Linux was “good now” or that every year was “the year of Linux on the desktop.” Now a meme, these insistent claims felt like a form of denial at the time. I tried Linux again in 2018 or so, several years after valve released the first version of SteamOS, an Ubuntu-based Linux distribution with Steam preinstalled and right around the time that Valve released the first versions of their Proton compatibility layer. It felt a bit better in some ways, but still I found myself returning to Windows a month or so later. It wasn’t until the fall of 2023 that I made the switch again. This time, it stuck. I ran <a href="https://manjaro.org/">Manjaro</a> for a little over a year, learned a lot about Linux and rolling release distributions, and switched to <a href="https://endeavouros.com/">EndeavourOS</a> earlier this year.</p>
<p>So, you may be asking, where’s the ideology the post title promised me? Trust me, dear reader, it’s coming. Right now, in fact. I gave you my background first to establish my position. I’m a fairly recent full convert to Linux generally speaking, though I’ve enjoyed the fruits of FOSS projects for decades, most commonly in the video game emulation space. I’m no coder or contributor, I am far from a terminal wizard, and I am constantly looking up ways to make my computer work the way I want it to. So why the effort? Why not just go with the herd, install Windows 11, and use a computer that has wider support because it’s the default? I break down my reasoning like this. I want my data to be mine. I want my data to be portable. I want my data to be private, and I want my computers to do what I want the way I want it to. If I can get all that and also not have to worry about developers abandoning or shutting down software I’m using, I think I can be a lot happier in my technology life.</p>
<p>So what do I mean by wanting my data to be mine? Let’s look at an example. I have an Android phone. My phone comes with an app for taking notes. Because it’s Android, those notes live in Google Keep, a web service run by Google that synchronizes your notes to the cloud, allows you to share them with others, and collaborate on them. All useful features to be sure, but who owns those notes? They don’t even exist on my phone. They’re on a web server somewhere controlled by a corporation that has so many fingers into the proverbial information pie that the pie is more fingers than filling at this point. If google decides to kill Keep like they have with <a href="https://killedbygoogle.com/">so many other services</a>, those notes are just… gone and I’ll need to find a new way to take and share notes. In this way, my notes aren’t mine. Whether they survive or not is just up to someone else. The same can be said of music, movies, video games, calendars, instant messaging, search, online file storage, and so many more types of data. I want to claw back whatever I can, even if it means investing time and energy into providing those things for myself.</p>
<p>Adding on to the previous point, I want my data to be portable. Yes, that means being able to export my information and take it with me, but more importantly, that means being able to continue to interact with that data outside its original context. If my note taking app of choice shuts down, I want the notes to be in an easily readable and standard format so that I can read them with any number of alternate programs. I want my movies to work outside of whatever digital store I purchase them from. I want my music to be available offline indefinitely. In fact, I want all of my stuff to be available whether I can connect to the internet or not. Similarly, I want any internet availability of my data to be based on my own terms. I want to host it myself, which means I’m also a much smaller target for hacks or data breaches.</p>
<p>So if my data is available offline, is not tied into a corporate service, and is portable and readable in standard formats, then that naturally leads to data privacy. I know I can’t escape the eye of corporate tech giants completely, but reducing my footprint where I can is something I want to strive for. I will admit that privacy is somewhat less of a concern for me compared to the other points, but it is a nice benefit to have as I address the other issues.</p>
<p>The last point is mostly about Linux. At first, I just wanted to get away from Microsoft insisting that Windows must have an online account, but over time I realized that in almost every instance, if my computer didn’t do the thing I wanted it to, it was easy to change that behavior in Linux. Mostly through the way that Linux applications tend to handle settings. While I still believe that most mainstream computer users should not be expected to edit text configuration files to change settings, I cannot deny that the flexibility and portability of text files is really great. For example, I can reinstall my entire operating system with the applications I use, then just drop my configuration files in my home folder and be right back to the configuration I had. Linux best practices are also beneficial in helping me ensure a computer does what I want. For example, programs are intended to output data in such a way as to make that data easy to ingest with another program. The example folks who are newer to Linux will still probably recognize involves <code>curl</code>, which is a program for getting data from the internet via URL. So you might have a command that looks like this: <code>curl http://server/script.sh | bash</code>. This command uses <code>curl</code> to pull a script from a server, then immediately pipes, or sends that output to <code>bash</code> which will execute the script.</p>
<p>As I move forward in my Linux journey, I will keep coming back to these four major principles. My ideal is to have as much of what I use day to day covered by them as I can. I’ve already done a lot of this work, so keep an eye out for the next installment in this series where I go over how to pick a Linux distribution and get started with it in 2025.</p>
]]></description>
      </item>
    
      <item>
        <title>Tool Recommendations</title>
        <link>https://tk-web.quest/blog/tool-recommendations/</link>
        <guid>https://tk-web.quest/blog/tool-recommendations/</guid>
        <pubDate>Sat, 12 Apr 2025 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Every home should have a well stocked toolbox. From dorms to single family dwellings, everyone should have some basic tools to take care of emergency maintenance tasks. I've outlined below a few toolboxes that are ideal to serve each type of home. These lists are by no means exhaustive or apply to every situation. These are just my recommendations. These lists are also additive. Each list assumes that you already have the tools in the previous list. After the tool lists, there are two bonus lists. One is for additional items that will make things easier or faster. The other is for consumables.</p>
<p>A note on tool pricing and what to buy: In the vast majority of cases, you should get the cheapest possible version of a tool you can. In the US, you will find that Harbor Freight has a lot of extremely cheap tools. Some of these are good, some are very much not worth it. Some can be adapted or modified to make them better. Harbor freight has a really robust tool reviewing community on YouTube. If you are unsure, it's likely a good idea to look up some impressions. If you use a tool enough to break it, then consider upgrading to a nicer version of the same tool depending on how fast it breaks. If you break a screwdriver after ten years, maybe just buy the same screwdriver again, for example. Similarly, keep an eye on the conditions of your tools. A worn out Philips screwdriver will almost always cause more harm than good. Replace tools that are worn out.</p>
<h1 id="minimal" tabindex="-1">Minimal <a class="heading-anchor" href="#minimal"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>These tools are the bare minimum I consider to be essential for any person living on their own.</p>
<ul>
<li>Tool box or bag – Always always have a home for your tools. Ideally this will be big enough for everything on the list, plus some room for expansion.</li>
<li>Hammer – Any framing hammer will do. It should have a claw on the back for pulling nails and a flat head on the other side.</li>
<li>#2 phillips screwdriver – Get one with a long shank (see Fig. 1) to fit into deep holes. #2 phillips is the most common screwdriver head you will likely find in the US. In Canada, you might want to add a Robinson screwdriver.</li>
<li>Flathead screwdriver – Get a 1/4&quot; wide one to start. This will fit most slotted screws you will come across. In a pinch, a flathead screwdriver is a good wedge or pry bar.</li>
<li>Angled pliers – Also called channel locks. These pliers are at an angle to give you a little more mechanical advantage when turning bolts. The channels mean they are significantly more adjustable than standard pliers.</li>
<li>Adjustable wrench – Sometimes also called a Crescent Wrench or a Monkey Wrench. These wrenches have a worm gear in the head that moves one of the jaws closer or further away. A small one is fine to start. This, plus your channel locks, will give you the tools you need to do most basic plumbing repair.</li>
</ul>
<p><img src="screwdriver-anatomy.png" alt="Fig. 1: screwdriver anatomy"></p>
<h1 id="apartmentcondo" tabindex="-1">Apartment/Condo <a class="heading-anchor" href="#apartmentcondo"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>While apartment maintenance people are available to fix basically anything you need them to, sometimes they can be backed up and whatever your repair is may not be high enough priority for them to get to you right away. You can make your apartment life a lot easier with a slight upgrade to the basic tool kit above.</p>
<ul>
<li>Magnetic Stud Finder – These little guys are extremely cheap. They find studs by magetizing onto the drywall screws used to affix the drywall to your walls. If you're hanging anything heavier than wall art, screw directly into the studs. Just find a stud with your magnet, then put your screw in a couple inches up or down.</li>
<li>Outlet Tester – Also a cheap tool that can be invaluable. You plug it into an outlet and it lights up to tell you if the outlet is working or not. It has a little bit of circuitry inside to diagnose common problems.</li>
<li>8/9/10/11-in-1 screwdriver – These screwdrivers have a wider variety of bits for unusual screw sizes, plus a couple common socket sizes for hex bolts. When I did apartment maintenance, this driver was my work horse. Look for one in a similar style to Fig. 2.</li>
<li>4 (or more) in-1 Paint knife – These cheap paint/putty knives have tools for opening paint cans, spreading spackle, cutting seam lines, and cleaning paint rollers. Don't bother buying a single use putty knife when one with more function is the same price.</li>
<li>Bright flashlight – Sometimes the lights go out, it happens. Having a nice, bright flashlight is important. A cell phone would work for this in a pinch, but having something dedicated that you always know the location of is useful. Especially if that light can be clipped onto a hat, strapped onto your head, or even held in your mouth as you do work in the dark.</li>
</ul>
<p><img src="11-in-1-driver.png" alt="Fig. 2: 11-in-1 Screwdriver"></p>
<h1 id="detached-home" tabindex="-1">Detached Home <a class="heading-anchor" href="#detached-home"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Congratulations! You're in a single family home and now you have to contend with all of the stress and work that entails! Most of these tools are about getting things juuust right or doing more involved repairs yourself, since you're more likely to be in this kind of home for much longer than an apartment or similar.</p>
<ul>
<li>Measuring Tape – You know them, you love them. Get one of the silver metal ones. They are nearly indestructible compared to their plastic cousins.</li>
<li>Bubble Level – They're cheap, they're simple, and they work. Get one and use it anytime you hang anything on the wall.</li>
<li>Speed Square – Good for ensuring things are at right angles (or common other angles) to each other, has the bonus benefit of being able to carry lines between walls if you want things to be the same height around a corner.</li>
<li>Straight Edge/Ruler – You never know when you're going to need a straight line. Your bubble level may be able to double as a nice straight edge as well.</li>
<li>Pipe Wrench – Confusingly, also sometimes called a monkey wrench. These wrenches are designed to bite into smooth, round surfaces and have a long handle to ensure you have a good mechanical advantage. You won't use it often, but when you do, you'll be glad you had it.</li>
<li>Standard and Metric Hex Keys – Also called Allen keys or Allen wrenches. These are the things that Ikea gives out for free. There's a wide variety of sizes in both metric and standard, so having a set of each is important if you don't want to strip out the screws.</li>
<li>Torx Wrenches – A set of torx wrenches is cheap and this style of screw is getting more and more popular. They don't slip or strip out.</li>
<li>Standard and Metric Box End Wrenches – Sometimes your adjustable wrench will just be too big to fit into a space. Having a complete set of box end wrenches is nice for that eventuality. If you are feeling fancy, wrenches with ratchets in the round end are nice.</li>
<li>Standard and Metric socket sets – Sometimes you can only get to a screw from directly above it. That's where sockets come in. You don't need huge sets of each, just get small kits with common sizes.</li>
<li>Drywall saw – A saw that can cut into a wall is nice to have and inexpensive. Drywall saws are specific in that they have a pointed end, good for starting a cut.</li>
<li>Needle Nosed Pliers – useful for fishing things out of drains or clearing hair out of some more modern drain designs. Get a pair that are very long and narrow.</li>
<li>Diagonal Cutters – We do not use the slang for these. Don't ask. They look like pliers, but have a cutting edge. Most cut from both sides at once. A good set of diagonal cutters can be wire strippers, wire cutters, and even trimmers for plants in a pinch.</li>
<li>Additional Flathead Screwdrivers, Additional Adjustable Wrench – A wider variety of these tools is useful in some circumstances, but not always required. If you followed the previous lists already, I would get a long handled flathead (12&quot; shank) a wider flathead (3/8&quot; or 1/2&quot;) and a longer adjustable wrench (12&quot;)</li>
</ul>
<h1 id="upgrades" tabindex="-1">Upgrades <a class="heading-anchor" href="#upgrades"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>These are tools to buy as you feel you want them to save time, effort, or expand your repair possibilities.</p>
<ul>
<li>
<p>Power Drill and Impact Driver – A battery powered drill and driver set is not very expensive as far as power tools go and can be combined with a good set of bits to make any screwing task exceptionally faster and easier. Save money and get the impact driver first. You can get drill bits compatible with them and they'll be significantly better at driving screws.</p>
<ul>
<li>A Note on Power Tools – It is very likely that whatever power tool brand you buy into first will be the one your stick with, since the batteries are interchangeable. For this reason, I recommend Makita, Miluakee, and DeWalt. Ryobi has a huge variety of tools, but I have had some very bad experiences with Ryobi tools letting go of bits, sometimes in a very dangerous manner. Similar complaints can be leveled at the various home center house brands, Rigid and Kobalt. A dedicated tool maker and reputable brand is the way to go here.</li>
</ul>
</li>
<li>
<p>Nylon Deadblow Mallet – A deadblow mallet has metal ball bearings inside the head. As you land a swing, all of those pellets move from one side of the mallet to the other, preventing the mallet from bouncing back at you and ensure more fo the force from the swing goes into whatever you are hitting. A nylon head will prevent the mallet from marking whatever you're hitting as much.</p>
</li>
<li>
<p>Multimeter – One of those &quot;you don't need it until you do&quot; style tools. A multimeter will detect AC or DC voltage, resistance, and continuity. Useful when dealing with battery backup systems, troubleshooting power tool batteries, or doing electronics projects.</p>
</li>
<li>
<p>Headlamp – The big upgrade to a flashlight is a flashlight that you don't need hands to use. They look goofy, but are dead useful.</p>
</li>
<li>
<p>Precision Screwdriver Set – Useful for fixing electronics, taking apart toys to fix them, or doing any other small work. I like the ifixit Mako set.</p>
</li>
<li>
<p>Infrared Thermometer – An invaluable tool for HVAC or refrigeration diagnosis. Point it at a vent and pull the trigger. If your AC is working, the air coming through will be very cold.</p>
</li>
<li>
<p>Electric stud finder – These tools will tell you not only where the studs are, but also when you're aimed at the center of them, if there are any electric lines nearby, and sometimes even if there are water pipes you are at risk of rupturing.</p>
</li>
<li>
<p>Laser Level – Uses a compass and accelerometer to determine what is flat, then projects a laser along that line on the wall. Extremely useful for ensuring multiple items are exactly the right height on walls and significantly more foolproof than a bubble level.</p>
</li>
</ul>
<h1 id="consumables" tabindex="-1">Consumables <a class="heading-anchor" href="#consumables"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Stuff that's useful to have on hand. Generally speaking, buy these in bulk rather than as a couple of individual pieces. It's not much more expensive to do so and will save you a lot of time in the long run.</p>
<ul>
<li>1 1/2&quot; Wood Screws (I recommend torx head) – Wood screws only have threads closer to the tip. The benefit here is that they can pull two pieces of wood together with some clamping force better than other screws.</li>
<li>1 1/2&quot; Drywall Screws – These phillips head screws are cheap and abundant. Good for hanging light decorations or doing drywall repair.</li>
<li>3&quot; drywall screws – These are ideal for digging into studs for mounting heavier decorations like shelves.</li>
<li>Drywall Anchors – Get the metal big screw kind (Fig. 3.) Anytime you hang anything on a wall, either drill into a stud, or use an anchor. Your curtain rods and photos will never fall off the wall with these guys.</li>
<li>Picture Nails – If you don't want to dig a big hole into the wall with an anchor, nails are cheap. I don't personally recommend them, but hey, you do you.</li>
<li>Painter's Tape – Blue (or green) masking tape. Good for getting clean lines when painting. Just remember to pull the tape before the paint fully dries!</li>
<li>Electrical Tape – Use this any time you need to wrap up a wire. Electrical tape is waterproof from the non-sticky side, but shouldn't be used as a water seal.</li>
<li>Duct Tape – The old standby. Get whatever color you want. This stuff is dead useful for temporary fixes.</li>
<li>Teflon Tape – Use this or pipe dope on any plumbing connection you make, but not both! Teflon tape is significantly less messy. Just make sure you wrap it with the threads, not against them.</li>
<li>Rug Tape – A great way to keep rugs stuck down to wood floors. Use some of this at each corner if your rugs slide around too much.</li>
<li>Loctite (blue) – If you ever have screws that like to back themselves out due to vibration, thread locking fluid will help them stay put. The blue varietty is meant to be removable if you ever need to. The red kind will permanently affix whatever you use it on.</li>
<li>Scotch Brite or 220-grit sandpaper – Useful for cleaning up pipes when making new connections, can also be used to sand down spackle.</li>
</ul>
<p><img src="drywall-anchor.png" alt="Fig. 3: Drywall and stud anchors."></p>
<h1 id="what-not-to-keep-on-hand" tabindex="-1">What not to keep on hand <a class="heading-anchor" href="#what-not-to-keep-on-hand"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Some stuff just isn’t worth buying a lot of or keeping on hand. Things dry out or become unusable over time, so it’s better to just buy some when you need it. In all of these cases, follow your local hazardous materials disposal instructions. Here's some examples of what not to hang on to:</p>
<ul>
<li>Spackle - unless you're buying unmixed dry mud, don't bother keeping this stuff around. Once it dries it can't really be fully revived.</li>
<li>Caulk - The caps on these tubes don't really seal. Don't stock up on extra. Once a tube is open, it's on a limited timeline.</li>
<li>Super Glue - These glues are super useful to have, but never in bulk. They oxidize and draw out moisture from the air which makes the accelerator barely work or work not at all on them. Plus, they don't cure as hard if they're old.</li>
<li>Paint - Unless they're primary colors that you will go back to regularly or relatively soon, don't keep old paint around.</li>
</ul>
]]></description>
      </item>
    
      <item>
        <title>Stardew Valley 1.6 and Returning to the Simple Life</title>
        <link>https://tk-web.quest/blog/stardew-valley-16-and-returning-to-the-simple-life/</link>
        <guid>https://tk-web.quest/blog/stardew-valley-16-and-returning-to-the-simple-life/</guid>
        <pubDate>Fri, 03 May 2024 00:00:00 +0000</pubDate>
        <description><![CDATA[<p><em>This post is for 2024’s WeblogPoMo2024, a challenge to post every day in May. While I cannot commit to being able to write something every day, I will try to post something every week in May.</em></p>
<p>Lately I’ve been playing a lot of Stardew Valley’s 1.6 update. I absolutely adored the game when it originally released. It was the first ever game in the farming/life sim genre that I really stuck with for any significant length of time. I never really felt a pull to stick to it longterm, though and eventually fell off. I don’t really have forever games as much as games I come back to on a semiregular basis. Stardew has had two revisitations from me. The first one was when multiplayer was new. The second one was a couple years ago. While I enjoyed my time with the game both of those times, I never even completed the base game’s content again to get to the “new” stuff.</p>
<p>This time, I feel a much greater sense of momentum, not only because of the promise of new stuff at the end of the road, but also some very thoughtful changes to the early and midgame parts of Stardew Valley. Perhaps the biggest of these changes is the alteration to the game’s economy. Nothing has been particularly rebalanced in terms of the various methods of making money. Rather, there are just a lot more things to spend that money on now. At launch, Stardew Valley felt balanced around two years of ingame play, with the possibility of completing everything in one if you knew ahead of time what to plant or fish for. Now, the game feels balanced for maybe three or five years of ingame play not counting the Perfection completion. There’s a lot more to spend money on. There are new options to randomize required items for the community center bundles, and there’s more reason to play through many years of the game.</p>
<p>I find this rebalancing act to be very interesting as a concept. Like the game was intended for one type of player at first, then a bunch of stuff was added to the end of that experience over time. Now there’s more runway to get to that same end-game style content, but also it makes that curve a lot smoother. It feels like an appropriate change to a game intended to be more comfortable and anti-stressful, but it does also mirror some late-game updates to other indie titles. One of the ones that most readily jumps to mind is Terraria’s Journey’s End update, which added a huge amount of content to make playing and replaying the game more interesting and ensmoothen the path to endgame content.</p>
<p>I guess I don’t really have much to say about it at this point. I’m still working towards the “new endgame” so to speak, so I don’t really have a complete formulation in my head yet, but I am thoroughly enjoying myself and encourage lapsed Stardew Valley fans to go back and enjoy the game again.</p>
]]></description>
      </item>
    
      <item>
        <title>Tea</title>
        <link>https://tk-web.quest/blog/tea/</link>
        <guid>https://tk-web.quest/blog/tea/</guid>
        <pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate>
        <description><![CDATA[<p>Every once in a while, folks I know will reach out to me asking for recommendations for this, that, or the other with regards to tea. While coffee lovers are a dime a dozen, especially in the US, the tea-loving community tends to be much smaller, though I have also found tea lovers to be a lot more interested in sharing their passion, rather than gatekeeping others. In that spirit, I want to put basically all of my tea knowledge down to paper, as it were, in order to share the love that I have for the breadth and depth of what at first appears to be a remarkably simple beverage.</p>
<p>Before we begin, however, I need to impress upon you, dear reader, that I am not the be-all or end-all of tea knowledge or any sort of a taste-maker. I am not some refined palate who can pick apart all of the component flavors in a cup. I simply like what I like and enjoy trying different things enough to make a few recommendations. I also am not, and never have been, a coffee drinker, so I don’t have specific advice for the lover of tea’s sister-beverage. I’m also coming at this from the perspective of an American so my resources may not be as helpful, though I do hope that they can begin to point anyone in the direction of a good cup of tea.</p>
<p>So, where should we start? I could expound upon specific distributors, growing locations, brewing methods, or equipment, but I think we should start where it is always best to start. At first principles. What is tea? At its most basic level, tea is a beverage brewed with leaves from Camelia Sinensis, or the tea plant. Tea grows in southeast Asia and India, with two major varietals, C. Sinensis var Sinensis and C. Sinensis var Assamica. There’s a couple other varietals, but these are the major two you will see. Like many other types of plant, the location and conditions for growth and processing can drastically change the flavors found in tea, which we will explore soon. For now, it is worth knowing that in this article, if I am talking about tea, then I am talking about tea made from Camelia Sinensis.</p>
<p>The tea plant is typically farmed in long rows. They look mostly like little shrubs, which is exactly what tea is. Farmers will trim the shrubs, plucking tea leaves from them. This is typically done twice a year in spring or early summer. While some larger industrial operations will use machines to speed up the process, smaller farms or farms focused on the highest quality product will do this process by hand. Once the leaves are plucked, they are wilted for around 12 hours. The wilting process is often done overnight. During this time, the leaves will lose a third of their moisture content and begin to oxidize. Once this has happened, the leaves will be torn or bruised to speed up the enzymatic oxidation process. Once the leaves have reached the desired oxidization level. Generally speaking, lighter teas will be oxidized less than darker teas. That’s why lighter teas, like white and green teas taste more vegetal or grassy, while black teas taste more bitter and malty. Once the tea leaves have reached the ideal oxidization, they will be lightly heated to denature the enzymes. This is known as kill-green or fixation. With this done, the tea can be rolled. This is sometimes done by hand, but can also be done by machine. The rolled leaves are then dried, causing them to become brittle and shelf-stable. From here, they can either be pulverized and bagged for teabags, or packaged up for sale as loose leaf tea.</p>
<h1 id="okay-so-what-should-i-drink" tabindex="-1">Okay, so what should I drink? <a class="heading-anchor" href="#okay-so-what-should-i-drink"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>That’s a good question! The first thing you should do, as with any new endeavor, is try a variety of things to see what you like! Earlier, I said that I would only be talking about Camelia Sinensis teas here, but that’s because that’s what I like. Sure there’s a lot of variety within that category, but there’s also whole other categories of “tea” that aren’t technically “tea” like Yerba Mate, Rooibos, and Herbal Teas. I’ll touch on those at the end of the article, but let’s get back on topic here.</p>
<p>If you’ve ever had any tea in your life, it has probably been a black tea and of all black teas, there are a few that show up again and again. The first is English Breakfast. This tea is a black tea that is known to be very strong in flavor, with lots of bitter tannins. English breakfast is typically a blend of teas made from the Darjeeling and Assam areas of India. The other common tea, as loved famously by Captain Jean-Luc Picard from Star Trek: The Next Generation, is Earl Grey. Earl grey is a black tea that is combined with bergamot oil or peels. These bitter oranges give the tea a distinct flavor and aroma.</p>
<p>I’ll confess. I don’t particularly like either of these teas. The Darjeeling style tea especially tastes significantly more bitter and less rich than the Assam-forward teas I like to drink. A common Assam-forward tea is Lipton. Yep, as it turns out, I like the taste of the very cheap plain default black teabags in America when compared to many fancy Brittish teas simply because Lipton uses more Assam tea in their blend. Outside of those three common black teas, you can find some other styles. Your local Asian grocery store might have some smoked black teas. These acrid teas might pique your interest if you enjoy smoked barbecue or mezcal. You also might find Irish breakfast, which tends to be a blend that is much heavier on the Assam tea than its English counterpart.</p>
<p>Next to these, you will probably find green teas. These are much more grassy in flavor and are lighter. They’re less bitter and tend to blend better with other flavors, which is why many pre-bottled green teas are bolstered with artificial fruit flavors. Green teas also tend to come in Chinese and Japanese styles. Chinese greens tend to have a little bit more oxidization, while Japanese green teas come in several flavors all on their own, from the bright and extra-grassy sencha to the earthy and bitter matcha to the unusual popcorn-like taste of genmaicha.</p>
<p>Sometimes in the grocery store, you might also see oolong teas. Oolong is kind of like a bridge between green and black teas, with more of the tannins and malty notes from black teas while retaining some of the slightly more vegetal qualities of green teas. The combination can make them taste almost nutty in flavor. That said, the variety in oolong teas is extremely wide, with various regions making unique varieties that taste unlike any others.</p>
<p>As tea has grown in popularity, white teas have also started appearing. Extremely light, these teas are delicate and floral, with almost no oxidization at all and an airy quality. The light oxidization also means they’re less overly bitter than black teas, but they don’t share the extreme vegetal taste as green teas.</p>
<p>There’s two more categories of tea that I cannot speak to at all. Pu’erh tea is fermented, pressed into bricks and left to age. Its flavor is often described as earthy or dirt-like. Yellow tea is the other one, this tea is cooked green tea that loses some of its green color as the chlorophyl in it decays. It’s not as oxidized as oolong or black teas, but it loses some of the vegetal notes due to the yellowing process. It’s also notably not roasted. When yellow tea is cooked, it’s held around 100 degrees F.</p>
<p>When you’re just starting out, I’d recommend getting one box each of English breakfast, green, and one of the mass market teas, like PG tips or Lipton. If you’re feeling adventurous and can find some, try Earl Grey, Oolong, and white tea too. The brands here don’t matter a ton. The big thing you’re trying to do is figure out what you like out of the major categories. Think of it like trying apples, oranges, and leafy greens. There’s major differences between varieties of apples, citrus fruit, and leafy greens, but knowing which categories you want to explore further can help you build a vocabulary to look for your next exploratory purchase. There’s another section down below with recommendations on specific places to go get tea once you have that vocabulary.</p>
<h1 id="okay-i-have-some-teabags-now-what" tabindex="-1">Okay, I have some teabags. Now what? <a class="heading-anchor" href="#okay-i-have-some-teabags-now-what"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Great! This section is really straightforward, I promise. Now that you have tea, it’s time to make it! Each box should have brewing instructions, but there’s also a basic set of rules for brewing tea. It’s really easy. First, do not boil your tea. Always pour your hot water over your teabag or tea leaves in another heat-safe mug or teapot. If you maintain a boiling temperature while brewing the tea, it will come out tasting burned and bitter. Second, don’t leave the tea in the mug after the brew time is over. The longer tea steeps, the more stuff leeches into the water. The good flavors come into the water in the first couple minutes. By the fourth or fifth minute, you’re just getting nasty extra-bitter flavors. Thirdly, don’t let your tea sit too long, even after you take out the leaves or bag. Tea leaves and teabags contain a lot of tea dust that continues to strengthen and change the tea flavors after you remove the bulk of the leaves. While this doesn’t make your tea turn immediately, it can give the tea off flavors if it sits for a few hours. Generally speaking if it gets so cold you want to reheat it, you might as well dump it out.</p>
<p>Many people across the world drink tea completely without adornment, but I’ve found that a splash of whole milk and a little sugar go a long way toward my personal enjoyment. I like sweet things, so the sugar is a given, but the milk does a lot to reduce the drying effect the tannins have on my palate and taking the edge off of the bitterness. This is especially true in black teas. Tea is a lighter, less bold flavor than coffee, though, so if you’re a big latte drinker, maybe start with less milk and if you normally use half and half or cream in coffee, maybe downgrade to milk instead. Any sweetener you like is fine, and any non-dairy milk is fine as well, just experiment a bit to figure out what you like best! Just don’t pour your milk into your mug before the boiling water. Douglas Adams was definitely wrong on this one.</p>
<p>As far as equipment is concerned, there’s a lot of misinformation out there. First of all, the microwave is totally fine for heating water. You just want to be exceptionally careful. If you heat your water too much, then disturb it, it can flash-boil causing burns. You can also absolutely use a pot to boil water on your stove or hot-plate. Just be careful when you pour.</p>
<p>A good first upgrade for a new tea lover is a good kettle. You can get one to heat on your stove top, but a much better option is to use an electric one. It plugs into the wall and heats the water directly inside the kettle with electricity. A common misconception here is that electric kettles are slow in North America where our mains voltage is only 120 volts. While it’s true that a kettle in many European countries with 240-volt power will boil water faster, a 120-volt kettle is still much faster than a stove top kettle. Mine even boils faster than a pan on the “rapid boil” 240v burner on the stove with the same volume of water. IF you’re concerned about plastic touching your boiling water, all-stainless steel models do exist and are relatively affordable. If you like green, white, or oolong teas, I recommend getting a variable-temperature one so you can set a specific temperature to brew at.</p>
<h1 id="that-was-tasty-i-want-more" tabindex="-1">That was tasty! I want <strong>MORE</strong> <a class="heading-anchor" href="#that-was-tasty-i-want-more"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Excellent news! There’s loads of places to get excellent tea these days. The biggest tea upgrade you can make after investing in a good kettle is upgrading the quality of the leaves you’re using. Teabags, even the fancy pyramid ones, use tea that has been crushed and broken up so much that the tea brews very quickly and it’s difficult to dial in that perfect level of flavor. The quality of leaves in teabags is also often just not quite as good. That’s where loose leaf tea comes in.</p>
<p>Loose leaf teas might need some special brewing practices. For example, it’s a good idea to rinse your leaves with boiled water once right before brewing them. Basically pour enough water to cover them, then dump out the water before brewing them normally. This washes away some of the smaller particles and dust that you don’t want to keep in your cup.</p>
<p>Matcha is powdered, so it requires a little bit of a unique process as well. Sift your matcha into a bowl or mug, then add water. Mix it vigorously to build a foamy head at the top. A milk frother is a good shortcut, but don’t overdo it. The more agitation you do, the faster it will brew.</p>
<p>My first major recommendation with regards to loose leaf tea is to support local businesses as much as you can, especially if they have good relationships with tea farmers that they work directly with and aren’t just repackaging and reselling bulk tea that they are buying from other sellers. These shops can be useful for trying a lot of varieties quickly, but aren’t always forthcoming with their sources.</p>
<p>After that comes specialty grocery stores. These sometimes directly import tea from other parts of the world that are harder to find locally. Asian grocers often have sizeable selections. Some stuff to look out for in this category are</p>
<ul>
<li>Ito-en Sencha - Ito-en is basically the default green tea supplier in Japan. A huge amount of green tea you find in japanese vending machines is Ito-en, but they also sell teabags and loose teas internationally. The loose sencha is quite good.</li>
<li>Maeda-en Matcha - The more expensive the can, the better the matcha will be. One of the few things in tea where the price per cup of the finished product is tied directly to how good that cup is.</li>
<li>Yama Moto Yama green tea bags - Also a japanese green tea, this time in bags. Not quite as common as Ito-en stuff, but I like these teabags better than Ito-en’s teabags</li>
</ul>
<p>If you can’t find a specialy store with tea to try, your local grocer might have some variety. Try anythign that catches your eye. Even if it’s the same style of tea, diffrerent brands do things slightly differently, so it’s worth experimenting to find what you like. Some stuff to get your started:</p>
<ul>
<li>Celestial Seasonings Green Tea - The basic Celestial Seasonings green tea is actually extremely good. While Celestial Seasonings specializes in herbal teas that are, strictly speaking, not tea, they do have some good stuff.</li>
<li>Lipton tea - Yep, the super cheap boxes of 100 teabags that are my most commonly drunk tea are these bad boys. The decaf tastes weird. Don’t bother.</li>
<li>Twinnings Irish Breakfast - A more assam-heavy variety of English BReakfast, this tea is strong and malty and tastes even better with milk in it.</li>
<li>Bewley’s Irish Breakfast - A tea I haven’t ever found in the US, but is like the Twinings Irish breakfast, but better.</li>
<li>PG Tips - A tea I know more by reputation than anything else. The only one in the entire article I name but haven’t yet tried, but the recommendation is so ubiquitous, that I figure it’s worth giving a try.</li>
<li>Bigelow Constant Comment - an earl grey adjacent blend with black tea, orange rind, and sweet spices.</li>
</ul>
<p>For Chinese teas of all kinds, my favorite source is Yunnan Sourcing. There’s a <a href="https://yunnansourcing.com/">global site</a>, where orders ship directly from China. They create and maintain relationships directly with farmers and are very reasonably priced. They also maintain a US warehouse and separate <a href="https://yunnansourcing.us/">US site</a> for domestic orders. The US site naturally has faster shipping, but the chinese site sometimes has a wider selection. Some of my favorites from this seller are</p>
<ul>
<li>Yunnan “Black Gold Bi Luo Chun” Black Tea - Yunnan Sourcing’s best seller and work horse, an excellent black tea with a strong assam flavor profile and a pleasing gold color. This is one that basically lands in my cart every time I make an order because of how reliably excellent it is.</li>
<li>Honey Orchid “Mi Lan Xiang” Dan Cong Oolong Tea - My wife’s current favorite, floral and nutty, with a slightly matly aftertaste. Goes well with milk and honey.</li>
<li>Premium Grade Dragon Well Tea From Zhejiang Long Jing Tea - My favorite chinese style green tea. This one is a little bit darker and fuller-bodied than the japanese green teas, but still with a light, grassy flavor.</li>
<li>Feng Qing Classic 58 Dian Hong Premium Yunnan Black Tea - My runner up for best black loose leaf tea from this seller. A rich, full flavor that is moderated slightly with some floral notes.</li>
</ul>
<p>I have also had good luck with the <a href="https://beautifultaiwantea.com/">Beautiful Taiwan Tea Company</a> Some stuff I’ve liked from here has been</p>
<ul>
<li>Red Jade Black Tea - Like the Black Gold, but even better. It brews to a bright red color and tastes incredible, malty and thick, like it’s coating your throat. Even better with milk.</li>
<li>Formosa Assam Black Tea - My runner up to the Black Jade. Sits somewhere bretween the Classic 58 from Yunnan Sourcing and the Black Gold from them. Has a slightly fruity flavor to it when you add sugar.</li>
<li>Yushan High Mountain Oolong - Nutty and malty, with a strong savory flavor. Definitely a fun tea to try to see how different an oolong can be from green and black teas.</li>
<li>Four Seasons Oolong - A little dusty, since it’s picked with a machine, but reasonably priced and easy to brew. Has a vegetal flavor, but stays away from the overwhelmingly grassy notes of green teas.</li>
</ul>
<p>For japanese tea, I find it hard to go wrong with anything sold by <a href="https://ippodotea.com/">Ippodo</a>. It can be a little pricey, but they ship worldwide and the quality is very high. Recommendations here are</p>
<ul>
<li>Ummon matcha - A full, earthy, savory tea with very little in the way of grass flavor. Brews a deep dark green. Add a little sugar and it’s accessible to basically anyone.</li>
<li>Hosen Sencha - a light, fragrant tea with less astringency on the aftertaste. A great one to start with.</li>
<li>Kaboku Sencha - a green tea that tastes almost sweet all on its own, with floral flavors and a fresh-cut-grass scent.</li>
<li>Kanro Gyokuro - A slightly sweet and savory green tea, with a complex flavor. The manufacturer also recommend brewing it cold for a different experience, which is unusual in tea.</li>
</ul>
<h1 id="okay-so-the-tea-is-good-but-my-mugs-are-lackluster" tabindex="-1">Okay, so the tea is good, but my mugs are lackluster… <a class="heading-anchor" href="#okay-so-the-tea-is-good-but-my-mugs-are-lackluster"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>This is the secret true reason to love tea: The teaware! You can find amazing teaware everywhere, from the asian grocers I mentioned in the last section, to the online tea sellers, to specialty shops that only exist to sell you another teapot, even though you already have four and this one is too small to really be useful anyway, but it’s so damn cute. I don’t have a problem. You have a problem. That problem is you don’t have enough teaware.</p>
<p>A couple notes, though. Due to the international love of tea, most capacities for teaware will be labeled in mililiters. It’s worth looking up how much that is in your local units so you can get an idea. I absolutely have a teeny tiny 120ml teapot that is barely big enough to do anything with because I didn’t read the description well enough. Here’s some fun things to look at</p>
<ul>
<li>Ippodo’s <a href="https://ippodotea.com/collections/utensils/products/yakishime-kyusu">Yakishime Kyusu</a> - An 8-oz teapot in the kyusu style. Kyusu have a handle perpendicular to the poouring spout and are meant to be poured completely one-handed. The hollow handle ensures the pot stays cool while you handle it, even if it’s full of deliciously hot tea.</li>
<li>Forlife’s <a href="https://www.forlifedesignusa.com/collections/all-products/products/brew-in-mug-extra-fine-tea-infuser-with-lid-single-pack">Extra-fine tea infusers</a> - Some teas are jsut going to be made of smaller particles. An extra-fine infuser is agreat way to not need to chew your drink. I use mine basically exclusively for the japanese sencha that is more shredded than mos tof my other loose teas.</li>
<li>Hario teaware - Hario’s teaware is made of borosilicate glass, which is heat resistant and beautifully clear. I use this <a href="https://www.hario-usa.com/products/maru-chacha-kyusu-tea-pot">ChaCha Kyusu Maru Tea Pot</a> all the time. I don’t know why they call it a Kyusu when basically all other kysus have the perpendicular handle.</li>
<li>Teaware.house - A great place to find all kinds of teaware. I have a couple pieces from here that I absolutely love. <em>(Edit 5/2025: It looks like Yunnan Sourcing has bought out Teaware.house!)</em></li>
</ul>
<p>Beyond all of these, teware is really ubiquitous. Local pottery galleries are almost guaranteed to have interesting cups or mugs for sale. You might even know someone who can throw a classic tea cup or matcha bowl together for you.</p>
<h1 id="wrapping-up" tabindex="-1">Wrapping up <a class="heading-anchor" href="#wrapping-up"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Well over three thousand words later, I hope I was able to give you a little bit more context and some resources for what to look for and how to get started. It’s both an incredibly deep topic and also kind of rediculous to turn into a hobby, but I think there’s a tea out there for everyone and it really isn’t very hard to get started or eventually improve your methods. I hope you have nothing but an excellent time exploring your own taste and preferences in tea.</p>
<h1 id="hang-on-what-about-sleepytime-mate-rooibos" tabindex="-1">Hang on what about sleepytime? Mate? Rooibos? <a class="heading-anchor" href="#hang-on-what-about-sleepytime-mate-rooibos"><span aria-hidden="true" data-pagefind-ignore>#</span><span class="visually-hidden" data-pagefind-ignore>Permalink to this heading</span></a></h1>
<p>Okay, look. I know I said I’d only talk about real tea here. I’m really not trying to gatekeep or anything. Tea is already such a broad topic that I cannot in good faith address everything with the same depth. Here’s the short version:</p>
<p>Sleepytime tea is made by Celestial Seasonings. It’s chamomile. Chamomile isn’t tea. It’s a different plant entirely. Sleepytime and most other teas made by Celestial seasonings are actually Herbal Teas, basically herbs that can be brewed like tea, but aren’t real tea. Herbals can have wildly varied flavors, brewing instructions, and are naturally caffiene free.</p>
<p>Rooibos is becoming more popular pretty rapidly. This comes from a plant native to southern Africa. It has an earthy flavor reminiscent of tobacco, apparently.</p>
<p>Yerba Mate is a high-caffiene drink from South America brewed from a plant related to holly. It tends to be vegetal and grassy in flavor.</p>
<p>See? None of these are Tea really.</p>
<p>P.S. Like what you like. It’s cool.</p>
]]></description>
      </item>
    
  </channel>
</rss>
