<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ssg.tradik.com</title>
  <link href="https://ssg.tradik.com/" rel="alternate"/>
  <link href="https://ssg.tradik.com/feed.xml" rel="self"/>
  <id>https://ssg.tradik.com/</id>
  <updated>2026-09-14T17:56:15Z</updated>
  <entry>
    <title>The Build Said Nothing</title>
    <link href="https://ssg.tradik.com/blog/the-build-said-nothing/"/>
    <id>https://ssg.tradik.com/blog/the-build-said-nothing/</id>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>1.8.62 fixes fourteen things that never errored: pages dropped without a word, a 404 in the wrong language, a header that refused geolocation.</summary>
  </entry>
  <entry>
    <title>The Client Wants to Fix a Typo</title>
    <link href="https://ssg.tradik.com/blog/the-client-wants-to-fix-a-typo/"/>
    <id>https://ssg.tradik.com/blog/the-client-wants-to-fix-a-typo/</id>
    <published>2026-09-10T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>1.8.60 is about the work an agency does between builds: letting a client fix their own headline, and a GTM install that was only ever half there.</summary>
  </entry>
  <entry>
    <title>The Paragraph You Clicked Is Not in the File</title>
    <link href="https://ssg.tradik.com/blog/the-paragraph-you-clicked-is-not-in-the-file/"/>
    <id>https://ssg.tradik.com/blog/the-paragraph-you-clicked-is-not-in-the-file/</id>
    <published>2026-09-10T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Click-to-edit is easy to build and hard to make safe. Here is the rule that decides which paragraph a click means, and why the editor sometimes refuses to guess.</summary>
  </entry>
  <entry>
    <title>What Breaks If I Change This?</title>
    <link href="https://ssg.tradik.com/blog/what-breaks-if-i-change-this/"/>
    <id>https://ssg.tradik.com/blog/what-breaks-if-i-change-this/</id>
    <published>2026-09-10T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>We built an incremental build for 1.8.60. It made a five-thousand-page site five per cent faster. Here is why we shipped it anyway, and what it is actually for.</summary>
  </entry>
  <entry>
    <title>One Sitemap Per Site Does Not Scale to Forty Clients</title>
    <link href="https://ssg.tradik.com/blog/one-sitemap-per-site-does-not-scale-to-forty-clients/"/>
    <id>https://ssg.tradik.com/blog/one-sitemap-per-site-does-not-scale-to-forty-clients/</id>
    <published>2026-09-08T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>An agency has a different relationship with sitemap.xml than a site owner. Split sitemaps answer &#39;is it indexed&#39; per section, without forty dashboards.</summary>
  </entry>
  <entry>
    <title>The Build Was Green and the Site Was Wrong</title>
    <link href="https://ssg.tradik.com/blog/the-build-was-green-and-the-site-was-wrong/"/>
    <id>https://ssg.tradik.com/blog/the-build-was-green-and-the-site-was-wrong/</id>
    <published>2026-09-08T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Almost every fix in four releases came from one place: a third-party crawler, weeks after a build that reported success. What those failures had in common.</summary>
  </entry>
  <entry>
    <title>Every January, Every Footer Is Wrong</title>
    <link href="https://ssg.tradik.com/blog/why-a-static-site-cannot-tell-you-the-year/"/>
    <id>https://ssg.tradik.com/blog/why-a-static-site-cannot-tell-you-the-year/</id>
    <published>2026-08-24T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>A generator that reads the clock cannot promise the same bytes twice. Which is why the copyright year in your footer is a harder problem than it looks.</summary>
  </entry>
  <entry>
    <title>Your AI Agent Shouldn&#39;t Read 5,000 Tokens to Change One CSS Value</title>
    <link href="https://ssg.tradik.com/blog/ai-agent-should-not-read-5000-tokens-for-one-css-value/"/>
    <id>https://ssg.tradik.com/blog/ai-agent-should-not-read-5000-tokens-for-one-css-value/</id>
    <published>2026-08-21T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Giving an agent access to your project is half the problem. If changing one CSS value means rewriting a whole file, its context goes on learning nothing.</summary>
  </entry>
  <entry>
    <title>Your Local Preview Should Not Lie to You</title>
    <link href="https://ssg.tradik.com/blog/local-preview-should-not-lie/"/>
    <id>https://ssg.tradik.com/blog/local-preview-should-not-lie/</id>
    <published>2026-08-21T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>SSG&#39;s local preview applies generated redirects and headers, reloads them after builds, and keeps browser caching from hiding files while they are edited.</summary>
  </entry>
  <entry>
    <title>Migrating From WordPress Is Easy. Keeping Its URLs Is Not.</title>
    <link href="https://ssg.tradik.com/blog/migrating-from-wordpress-keeping-urls/"/>
    <id>https://ssg.tradik.com/blog/migrating-from-wordpress-keeping-urls/</id>
    <published>2026-08-21T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>A WordPress migration must preserve more than posts: original URLs, category and date archives, menus, comments and language structure all affect old links.</summary>
  </entry>
  <entry>
    <title>Your MCP Server Can Edit Your Website. Who Is Allowed to Talk to It?</title>
    <link href="https://ssg.tradik.com/blog/who-is-allowed-to-talk-to-your-mcp-server/"/>
    <id>https://ssg.tradik.com/blog/who-is-allowed-to-talk-to-your-mcp-server/</id>
    <published>2026-08-21T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>An MCP server that edits templates and opens pull requests is not just another dev endpoint. The moment it listens on HTTP, authentication is not optional.</summary>
  </entry>
  <entry>
    <title>Multilingual Without Losing Track of the Page</title>
    <link href="https://ssg.tradik.com/blog/multilingual-without-losing-the-page/"/>
    <id>https://ssg.tradik.com/blog/multilingual-without-losing-the-page/</id>
    <published>2026-08-09T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Translating the words is the easy half. The hard half is that /o-nas/ and /en/about/ are the same page, and nothing in a file tree says so.</summary>
  </entry>
  <entry>
    <title>Building a Planet: One Feed From Three Sites, Yours Included</title>
    <link href="https://ssg.tradik.com/blog/building-a-planet/"/>
    <id>https://ssg.tradik.com/blog/building-a-planet/</id>
    <published>2026-08-07T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Three feeds into one took a config block. The interesting part was the four decisions under it: whose format wins, what to drop, what a dark source means.</summary>
  </entry>
  <entry>
    <title>I Went Looking for CPU Tricks and Found a Quadratic Loop</title>
    <link href="https://ssg.tradik.com/blog/making-builds-faster/"/>
    <id>https://ssg.tradik.com/blog/making-builds-faster/</id>
    <published>2026-08-03T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>The plan was SIMD and PGO. The profiler said two thirds of the build was syscalls from listing one directory per post. Fixing that made it 5.25x faster.</summary>
  </entry>
  <entry>
    <title>AI in Your Content, at Build Time — Not in the Browser</title>
    <link href="https://ssg.tradik.com/blog/ai-in-content/"/>
    <id>https://ssg.tradik.com/blog/ai-in-content/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Ask an AI a question from inside a Markdown file and bake the answer into the page — once, at build time, cached. No key in the browser, no spinner.</summary>
  </entry>
  <entry>
    <title>Tell the Designer What You Want: the ssg mcp Development Server</title>
    <link href="https://ssg.tradik.com/blog/mcp-development-server/"/>
    <id>https://ssg.tradik.com/blog/mcp-development-server/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>ssg mcp turns your AI assistant into two coworkers: a designer that edits templates and a content manager for Markdown. Each knows what it may not touch.</summary>
  </entry>
  <entry>
    <title>Related Posts, From a Line of Template to Semantic Search</title>
    <link href="https://ssg.tradik.com/blog/related-posts/"/>
    <id>https://ssg.tradik.com/blog/related-posts/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Five related articles is one template line, one config block, or a small pipeline — depending on whether you want keyword overlap or actual meaning.</summary>
  </entry>
  <entry>
    <title>SSG 1.8.16: Content That Thinks, Announces Itself, and Links Itself</title>
    <link href="https://ssg.tradik.com/blog/release-1-8-16/"/>
    <id>https://ssg.tradik.com/blog/release-1-8-16/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>1.8.16 is about the edges of publishing: build-time AI answers, announcements that never double-post, related articles, and an MCP development server.</summary>
  </entry>
  <entry>
    <title>How to Use the [ai …] Shortcode: A Practical Walkthrough</title>
    <link href="https://ssg.tradik.com/blog/using-ai-shortcode/"/>
    <id>https://ssg.tradik.com/blog/using-ai-shortcode/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Step by step: configure a model, keep the key out of your repo, drop your first [ai …] into a post, and commit the cache so CI needs no key at all.</summary>
  </entry>
  <entry>
    <title>How to Announce Your Posts Without Ever Double-Posting</title>
    <link href="https://ssg.tradik.com/blog/using-notifications/"/>
    <id>https://ssg.tradik.com/blog/using-notifications/</id>
    <published>2026-08-02T00:00:00Z</published>
    <updated>2026-09-14T17:56:15Z</updated>
    <summary>Announcing a post exactly once, from a build that runs a hundred times. Wiring a destination, gating it behind --notify, and letting the state file work.</summary>
  </entry>
</feed>
