{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "TK's Web Quest",
  "home_page_url": "https://tk-web.quest",
  "feed_url": "https://tk-web.quest/feed.json",
  "description": "Tk's Web Quest is a personal website being made by hand, one log entry at a time.",
  "authors": [
    {
      "name": "TK",
      "url": "https://tk-web.quest"
    }
  ],
  "items": [
    {
      "id": "https://tk-web.quest/blog/the-process-is-the-juice/",
      "url": "https://tk-web.quest/blog/the-process-is-the-juice/",
      "title": "The Process is the Juice",
      "summary": "Having a Forever Project",
      "content_html": "<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>\n<blockquote>\n<p>Is all this work really worth it?</p>\n</blockquote>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>Trust the process.</p>\n",
      "date_published": "2026-10-02T00:00:00.000Z",
      "tags": [
        "tk-web",
        "self-hosting",
        "truenas",
        "homeserver",
        "tech"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/readable-rss/",
      "url": "https://tk-web.quest/blog/readable-rss/",
      "title": "Readable RSS",
      "summary": "I'm a dirty liar, but what else is new?",
      "content_html": "<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>\n<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>\n<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>\n<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>\n<p>This is what the html portion of the xsl looks like.</p>\n<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>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>header</span><span class=\"token punctuation\">></span></span>\n    <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>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span><span class=\"token punctuation\">></span></span>\n        <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>\n          <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>\n        <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>\n        TK's Web Quest\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <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>\n      <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>\n      <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>\n      <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>\n      <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>\n      <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>\n      <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>\n      <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>\n      <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>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>header</span><span class=\"token punctuation\">></span></span>\n  <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>\n    <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>\n      <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>\n        <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>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span><span class=\"token punctuation\">></span></span>\n              <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>\n                <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>\n              <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>\n              Home\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>\n            RSS Feed\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n      <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>\n        <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>\n          <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>\n            feed-info.txt\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n          <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>\n            <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>\n            <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>\n            <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>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        <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>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n          // ABOUT RSS\n        <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>\n          TK's Web Quest RSS Feed\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <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>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>\n            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!\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n          <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>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>\n              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. \n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <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>\n          <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>\n          <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>\n            feed.xml\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n          <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>\n            <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>\n            <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>\n            <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>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>span</span><span class=\"token punctuation\">></span></span>\n        <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>\n          Recent Entries\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <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>\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span>\n            Entries from the blog, sorted by date (newest first)\n          <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n        <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>\n          <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>\n            <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>\n              <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>\n                <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>\n                <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>\n              <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span>\n              <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>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span><span class=\"token punctuation\">></span></span>\n                  <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>\n                    <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>\n                  <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>\n                  <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>\n                <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span>\n              <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h3</span><span class=\"token punctuation\">></span></span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>article</span><span class=\"token punctuation\">></span></span>\n          <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>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>           \n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span></code></pre>\n<p>As you can see, it's very standard html. There's a couple of tags that probably look unusual though.</p>\n<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>\n  <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>\n    <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>\n  <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>\n  <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>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span></code></pre>\n<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>\n<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>\n<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>\n<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>\n<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>\n",
      "date_published": "2026-10-01T00:00:00.000Z",
      "tags": [
        "tk-web",
        "rss",
        "indie-web"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/notebooks/",
      "url": "https://tk-web.quest/blog/notebooks/",
      "title": "Notebooks",
      "summary": "My current process and experience with keeping a notebook.",
      "content_html": "<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>\n<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>\n<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>\n<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>\n<ul>\n<li>The notebook must be physical, with real paper.</li>\n<li>The notebook must have more than 48 pages.</li>\n<li>The notebook must be able to fit in a pocket in most of my clothes.</li>\n<li>I should be able to write in the notebook without a completely solid surface.</li>\n<li>The pen must be comfortable to use.</li>\n<li>I must have a way to physically bind the pen to the notebook so they travel together.</li>\n<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>\n<li>The materials must be either refillable or cheap to replace</li>\n</ul>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<ul>\n<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>\n<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>\n<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>\n<li>When a project gets its own task list and todo elsewhere, copy things out of the notebook to it regularly.</li>\n<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>\n<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>\n<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>\n<li>Don't worry about wasted pages or space. The paper is cheap. There will always be more.</li>\n<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>\n</ul>\n<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>\n<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>\n<p>Do you carry a notebook? How has that practice been going for you?</p>\n",
      "date_published": "2026-09-30T00:00:00.000Z",
      "tags": [
        "writing"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/the-last-infrastructure-update-for-a-while/",
      "url": "https://tk-web.quest/blog/the-last-infrastructure-update-for-a-while/",
      "title": "The last infrastructure update for a while",
      "summary": "A few small notes on infrastructure improvement for TK-web",
      "content_html": "<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n",
      "date_published": "2026-09-27T00:00:00.000Z",
      "tags": [
        "tk-web",
        "self-hosting",
        "vps",
        "pangolin"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/the-quest-returns-on-11ty/",
      "url": "https://tk-web.quest/blog/the-quest-returns-on-11ty/",
      "title": "The Quest Returns on 11ty!",
      "summary": "A brief overview of the changes to TK's Web Quest",
      "content_html": "<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>\n<p>But I didn't stop working.</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p><img src=\"screenshot-2026-09-25-130040.png\" alt=\"A screenshot of The Worst Webring's page\" title=\"Now even ringier!\"></p>\n<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>\n<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>\n<p>Finally, game pages have gotten some upgrades. You can now play my Pico-8 games directly from the blog more easily!</p>\n<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>\n<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>\n",
      "date_published": "2026-09-25T00:00:00.000Z",
      "tags": [
        "tk-web",
        "self-hosting",
        "tech",
        "11ty",
        "hugo"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/the-fall-colors-come-to-colorado/",
      "url": "https://tk-web.quest/blog/the-fall-colors-come-to-colorado/",
      "title": "The Fall Colors Come to Colorado",
      "summary": "A collection of photos from a drive up Guanella Pass",
      "content_html": "<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n",
      "date_published": "2026-09-25T00:00:00.000Z",
      "tags": [
        "photography",
        "nature",
        "autumn"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/reckoning-with-myself/",
      "url": "https://tk-web.quest/blog/reckoning-with-myself/",
      "title": "Reckoning with myself",
      "summary": "When building a site goes nowhere",
      "content_html": "<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>\n<p>I’m done building it all myself with no assistance.</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n",
      "date_published": "2026-09-15T00:00:00.000Z",
      "tags": [
        "tk-web",
        "hugo",
        "11ty",
        "writing"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/tools-and-resources-for-ps-bazooka/",
      "url": "https://tk-web.quest/blog/tools-and-resources-for-ps-bazooka/",
      "title": "Tools and Resources for PS Bazooka",
      "summary": "What you might need to complete PS Bazooka",
      "content_html": "<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>\n<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>\n<ul>\n<li>\n<p>A QR code scanner. These are built into most phone cameras now.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>A tool for retrieving steganographically hidden information in images. OpenStego is free, open source and multiplatform.</p>\n</li>\n<li>\n<p>A tool to retrieve steganographically hidden information in audio. REAPER (free trial) and Audacity (free, open source) can both do this.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>7-Zip, which is required to open a multi-part archive that is encrypted.</p>\n</li>\n</ul>\n",
      "date_published": "2026-07-31T00:00:00.000Z",
      "tags": [
        "game-jam",
        "the-worst-game-jam",
        "video-games",
        "ps-bazooka"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/next-games-project-devlog-the-preparation/",
      "url": "https://tk-web.quest/blog/next-games-project-devlog-the-preparation/",
      "title": "Next Games Project Devlog: The Preparation",
      "summary": "Putting the pieces together to make PS Bazooka",
      "content_html": "<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>\n<blockquote>\n<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>\n</blockquote>\n<hr>\n<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>\n<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>\n<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>\n<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>\n<pre><code>                         /=&gt; Branch A =&gt; Key 1 =\\\nStart =&gt; Intro Puzzles =|=&gt; Branch B ==&gt; Key 2 ==|=&gt; Finale Puzzles =&gt; End\n                         \\=&gt; Branch C =&gt; Key 3 =/\n</code></pre>\n<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>\n<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>\n<ul>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>Multi-part key: A key to a puzzle that requires multiple pieces in order to function.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n</ul>\n<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>\n<p>Alright, so I've done some research, time for findings so that I can plan this thing:</p>\n<ul>\n<li>\n<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>\n</li>\n<li>\n<p>There's an open source image steganography utility out there that is multiplatform. OpenStego. This will be perfect for the image steganography.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>Ultimate DOOM Builder supposedly runs on linux. Might be worth a look.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>DOOM had a console. I bet the doom level builder will let me utilize it.</p>\n</li>\n<li>\n<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>\n</li>\n<li>\n<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>\n</li>\n<li>\n<p>I'd love to utilize a timestamp for the podcast episode that the jam is based on for at least one clue.</p>\n</li>\n<li>\n<p>With TK-web's current setup, web server exploration and &quot;corrupt&quot; fake pages shouldn't be too bad to add.</p>\n</li>\n</ul>\n",
      "date_published": "2026-07-31T00:00:00.000Z",
      "tags": [
        "video-games",
        "game-jam",
        "the-worst-game-jam",
        "ps-bazooka",
        "pico-8",
        "doom-wad",
        "writing",
        "devlog",
        "game-development"
      ]
    },
    {
      "id": "https://tk-web.quest/blog/crosscode-review/",
      "url": "https://tk-web.quest/blog/crosscode-review/",
      "title": "CrossCode Review",
      "summary": "Why didn't I play this sooner?",
      "content_html": "<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>\n<blockquote>\n<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>\n<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>\n<p>While I don't overtly spoil major beats of the game, I won't be marking any spoilers ahead, so be warned.</p>\n</blockquote>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n",
      "date_published": "2026-07-09T00:00:00.000Z",
      "tags": [
        "review",
        "video-games"
      ]
    }
  ]
}