<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Hosted by TMQ</title>
    <link>https://hosted.fyi</link>
    <description>A personal technical blog by TMQ about systems, projects, guides, and practical notes from building things on the internet.</description>
    <language>en-AU</language>
    <lastBuildDate>Fri, 03 Jul 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://hosted.fyi/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hosted by TMQ website</title>
      <link>https://hosted.fyi/projects/hosted-by-tmq-website</link>
      <guid isPermaLink="true">https://hosted.fyi/projects/hosted-by-tmq-website</guid>
      <description>A personal blog that doubles as a proving ground for shared content helpers, feeds, search, reader controls, and Payload publishing.</description>
      <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>TMQ</dc:creator>
      <category>websites</category>
      <category>platform</category>
      <category>personal-site</category>
      <category>monorepo</category>
      <content:encoded><![CDATA[<p>This site is intentionally personal, but it is not a snowflake. It uses the same platform pieces as the client sites: route manifests, media manifests, Payload snapshots, SvelteKit static output, DaisyUI themes, and deployment orchestration.</p>
<h2>What it is testing</h2>
<ul><li>Blog, project, and system collections in the shared content model</li><li>Full-content RSS and Atom feeds from the static snapshot</li><li>Instant fuzzy search without a server endpoint</li><li>Reusable code blocks, author badges, and reader preferences</li><li>Build-once promotion from a checksum-verified remote release bundle</li></ul>
<pre><code class="language-ts">export const contentCollections = [
  &#39;blog&#39;,
  &#39;projects&#39;,
  &#39;systems&#39;,
] as const;</code></pre>
<p><a href="https://hosted.fyi">Visit hosted.fyi</a> - The canonical public home for Hosted by TMQ.</p>]]></content:encoded>
    </item>
    <item>
      <title>Static sites with a CMS are not a contradiction</title>
      <link>https://hosted.fyi/blog/static-sites-with-a-cms</link>
      <guid isPermaLink="true">https://hosted.fyi/blog/static-sites-with-a-cms</guid>
      <description>Static output and a real CMS can coexist nicely. The trick is treating the CMS as the publishing system, not the public runtime.</description>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>TMQ</dc:creator>
      <category>websites</category>
      <category>payload</category>
      <category>static-sites</category>
      <category>sveltekit</category>
      <category>cms</category>
      <category>cdn</category>
      <content:encoded><![CDATA[<p>A static site does not have to mean writing every page by hand or teaching editors Git. It means the public thing people visit is already built, cacheable, and boring in the best possible way.</p>
<p>The CMS still matters. Payload is where entries are drafted, reviewed, and published. The public website only sees a validated snapshot after publish. That small separation removes a lot of runtime drama.</p>
<h2>The publishing shape</h2>
<ul><li>Payload owns content, editorial metadata, and publish state</li><li>A signed publish hook asks the Website Manager to rebuild the site</li><li>SvelteKit turns the current snapshot into static HTML, feeds, and search JSON</li><li>The release is pushed to storage and served through BunnyCDN</li></ul>
<pre><code class="language-ts">export function contentEntryPath(entry) {
  return `/${entry.collection}/${entry.slug}`;
}

// /blog/static-sites-with-a-cms</code></pre>
<aside><strong>The important part</strong><p>The CMS is still the source of truth. It just does not sit on the hot path for anonymous readers.</p></aside>
<h2>Why I like this default</h2>
<p>It keeps the fun parts of a CMS, like clean authoring and publish workflows, while making the public site cheap to host and easy to cache. There are still places where live rendering is useful, but a technical blog is usually not one of them.</p>
<blockquote><p>The best production system is often the one that has fewer opportunities to be interesting at 2am.</p><footer>TMQ</footer></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>NixOS rebuilds with a soft landing</title>
      <link>https://hosted.fyi/blog/nixos-rebuilds-with-a-soft-landing</link>
      <guid isPermaLink="true">https://hosted.fyi/blog/nixos-rebuilds-with-a-soft-landing</guid>
      <description>I like NixOS because it gives me sharp tools. I like safe rebuild habits because sharp tools still have edges.</description>
      <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
      <dc:creator>TMQ</dc:creator>
      <category>systems</category>
      <category>nixos</category>
      <category>vps</category>
      <category>ops</category>
      <content:encoded><![CDATA[<p>NixOS makes server state pleasantly explicit, which is a nice change from the classic &quot;I edited five files and now the machine remembers my sins&quot; style of operations.</p>
<p>The habit I keep reaching for on VPS hosts is simple: apply the new config temporarily, verify the services that matter, then make it permanent only once the host looks healthy.</p>
<pre><code class="language-bash">sudo nixos-rebuild test
systemctl --failed
curl -fsS https://example.test/health
sudo nixos-rebuild switch</code></pre>
<aside><strong>Do not skip verification</strong><p>A clean build does not prove your reverse proxy, firewall, DNS, or container stack still behaves the way you think it does.</p></aside>
<h2>What this buys you</h2>
<ul><li>A reboot can fall back to the previous boot config if the test change was bad</li><li>You get to inspect systemd failures before committing the change</li><li>The runbook stays boring enough to repeat under pressure</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Client hosting platform</title>
      <link>https://hosted.fyi/systems/client-hosting-platform</link>
      <guid isPermaLink="true">https://hosted.fyi/systems/client-hosting-platform</guid>
      <description>Two VPS hosts, Caddy, BunnyCDN, Payload, Umami, Komodo, and a preference for boring release swaps.</description>
      <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
      <dc:creator>TMQ</dc:creator>
      <category>hosting</category>
      <category>systems</category>
      <category>vps</category>
      <category>cdn</category>
      <category>observability</category>
      <content:encoded><![CDATA[<p>The platform is split into a public web host and an internal services host. The public host serves static files through Caddy, while Payload, Umami, and deployment orchestration live away from public reader traffic.</p>
<h2>Current shape</h2>
<ul><li>client-web-01 serves static releases and reverse-proxy front doors</li><li>internal-01 runs Payload, Umami, Komodo, and supporting services</li><li>BunnyCDN handles DNS and global CDN delivery</li><li>Releases use build artifacts, rsync, symlink swaps, and cache purge</li></ul>
<aside><strong>Sanitized notes</strong><p>Public system pages should describe the shape and decisions, not secrets, private hostnames, or operational details that make future-me wince.</p></aside>
<h2>Things I still want to improve</h2>
<ul><li>Tighter rebuild queue visibility</li><li>A nicer approval packet for content-only changes</li><li>More automatic checks around cache headers and stale release cleanup</li></ul>]]></content:encoded>
    </item>
  </channel>
</rss>