<?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/">
<channel>
<title>TileDown Updates</title>
<link>/</link>
<description>Development notes for the TileDown static site generator.</description>
<language>en-US</language>
<atom:link href="/feed.xml" rel="self" type="application/rss+xml"/>
<item>
<title>Markdown as Canonical Source</title>
<link>/posts/markdown-canonical-source/</link>
<guid isPermaLink="true">/posts/markdown-canonical-source/</guid>
<pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate>
<description>TileDown keeps Markdown on disk as the source of truth while deriving typed output.</description>
<content:encoded><![CDATA[<h1>Markdown as Canonical Source</h1>
<p>TileDown treats Markdown as the author-owned format. The parser reads front
matter, CommonMark blocks, and typed tile directives into a structured model.</p>
<p>The formatter can then rewrite a document to one canonical profile:</p>
<pre><code class="language-sh">swift run tiledown fmt --check source.md
swift run tiledown fmt --write source.md</code></pre>
<p>That keeps the source stable enough for reviews and future visual editing while
still being a plain text format.</p>]]></content:encoded>
</item>
<item>
<title>Browser-Visible Tiles</title>
<link>/posts/browser-visible-tiles/</link>
<guid isPermaLink="true">/posts/browser-visible-tiles/</guid>
<pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
<description>Some TileDown behavior only proves itself inside a browser.</description>
<content:encoded><![CDATA[<h1>Browser-Visible Tiles</h1>
<p>Swift unit tests cover the parser, model, renderer, and output contracts. They do
not fully prove generated browser behavior.</p>
<p>The project now has a Playwright gate that builds a fixture site, serves it
locally, and checks behavior in Chromium: image loading, tables, theme switching,
draft exclusion, feeds, and local tile JavaScript.</p>
<div class="td-callout">
<p class="td-callout-title">Browser gate</p>
<p class="td-callout-body">The same fixture runs locally and in the Linux CI job.</p>
</div>]]></content:encoded>
</item>
<item>
<title>Linux-First Builds</title>
<link>/posts/linux-first-builds/</link>
<guid isPermaLink="true">/posts/linux-first-builds/</guid>
<pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate>
<description>The engine targets macOS and Linux, so generated browser behavior is checked on Linux too.</description>
<content:encoded><![CDATA[<h1>Linux-First Builds</h1>
<p>TileKit targets macOS and Linux. The Linux path matters because the generator is
an engine and CLI, not just a local macOS tool.</p>
<p>The repository runs Swift build and tests in a Linux container. The browser gate
also runs on Linux, so generated-site behavior is checked where the public Pages
build is produced.</p>
<p>Local Linux runs can use Docker, Colima, Lima, or a native Linux machine.</p>]]></content:encoded>
</item>
<item>
<title>Slug Overrides and References</title>
<link>/posts/reference-routing/</link>
<guid isPermaLink="true">/posts/reference-routing/</guid>
<pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
<description>A source folder can publish at a different slug while references still resolve.</description>
<content:encoded><![CDATA[<h1>Slug Overrides and References</h1>
<p>This post lives in <code>posts/custom-source-url/</code>, but its front matter publishes it
at <code>/posts/reference-routing/</code>.</p>
<p>The same build resolves internal references. For example, this link points to the
feature tour through a <code>page:</code> reference: <a href="/features/">Feature Tour</a>.</p>
<p>External links can also go through generated redirect shims, such as
<a href="/out/design/">the design notes</a>.</p>]]></content:encoded>
</item>
<item>
<title>Service Contracts Are Next</title>
<link>/posts/service-contracts/</link>
<guid isPermaLink="true">/posts/service-contracts/</guid>
<pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
<description>The service-form internals are tested, but the CLI still needs configuration loading.</description>
<content:encoded><![CDATA[<h1>Service Contracts Are Next</h1>
<p>The engine already has service contracts and service-form rendering tests. A
service-form tile can bind to a typed operation contract, render browser-safe
HTML, and avoid leaking server credentials.</p>
<p>The CLI does not yet load service bindings from <code>tiledown.yml</code>, so this public
site does not render a live service form. That is intentional: the missing work
is configuration and deployment plumbing, not a hidden demo path.</p>]]></content:encoded>
</item>
</channel>
</rss>
