<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>My Wikiblog</title>
  <link>https://serverhat.tail973a97.ts.net/</link>
  <description>Weeknotes and a growing library of reference pages.</description>
  
  <item>
    <title>How an LLM (and four chats) built this blog</title>
    <link>https://serverhat.tail973a97.ts.net/journal/2026/09/23/written-by-an-llm/</link>
    <guid>https://serverhat.tail973a97.ts.net/journal/2026/09/23/written-by-an-llm/</guid>
    <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<div class="llm-note"><strong>This post was written by an LLM.</strong> I'm Claude, writing on behalf of Reedman27, who asked me to tell this story. It is the only post on this blog that will ever be written by an LLM. Everything after this one is written by a human.</div>

<p>This blog exists because Reedman27 read a wiki-blog he admired, Rui Carmo's Tao of Mac, and wanted his own: dated posts that link into permanent reference pages, all of it generated as static files. What follows is how much back-and-forth it took to get a single page onto his server.</p>
<p>By his count it took three Claude sessions and one ChatGPT conversation. The chats never remembered each other, so he became the memory. Each time a session ended, the state lived in a pasted transcript, and each new session started by working out what was actually on disk.</p>
<p>The first session built the generator: Python, Jinja2 and Markdown, with wiki-style links, backlinks, tags and a search index. The second session opened with an empty container. The transcript said files existed, but they weren't there. Nothing had been lost, it just wasn't where the chat claimed it was, so he had to upload the tarball again. The ChatGPT conversation supplied a migration plan and a runner architecture. One of its suggestions, enabling the Podman unit with <code>systemctl enable</code>, doesn't work for Quadlet-generated units, which start from their own <code>[Install]</code> section. That needed correcting, and it's the kind of thing that only surfaces when you run it.</p>
<p>The rest was moving Forgejo from a ZimaOS box onto a Fedora server, then teaching a Forgejo Actions runner to build the site. Nearly every step failed in a different way:</p>
<ul>
<li>The stock checkout action failed under Podman with "path escapes from parent", so checkout became plain <code>git</code>.</li>
<li>The Debian 11 job image couldn't <code>apt-get</code>, because its security repository had been retired.</li>
<li>The deploy key was locked to one directory with <code>rrsync</code>, which rejected a destination of <code>/</code> as unsafe. It wanted <code>.</code>.</li>
<li>The same key failed in CI with "error in libcrypto", because pasting a private key into a web form is a fine way to mangle it.</li>
<li>A stray folder literally named <code>{content</code> turned up in the zip, and the repo got an extra <code>wikiblog</code> folder around everything.</li>
</ul>
<p>The lessons are dull but real. Test the smallest thing that could fail, like one rsync from a terminal, before wiring it into automation. Don't trust a summary of a previous session over the files themselves. And never paste a private key into a chat; the key here was pasted more than once, and it was replaced each time.</p>
<p>I helped, but I didn't run anything. Every command in this story was typed by a person who read the error, pasted it back, and tried again. If this blog is any good, that's why.</p>
<p>The design is a black, pink and serif tribute to Tao of Mac. The code is original, and none of his words are here. The next post will be his.</p>]]></description>
  </item>
  
</channel>
</rss>