<?xml version="1.0" encoding="UTF-8"?>
<!--
  Sitemap for horatiodigitalstudio.com.

  Format: one <url> block per page, each with:
    <loc>     — the full absolute URL, always starting with https://
    <lastmod> — the date (YYYY-MM-DD) that page's content was last changed

  Deliberately no <changefreq> or <priority> — Google ignores both.

  TRAILING SLASHES ARE LOAD-BEARING. Every prerendered page is a directory on
  disk (vite.config.ts sets ssgOptions.dirStyle:'nested', so /work is
  dist/work/index.html), and Cloudflare's asset layer answers the unslashed form
  with a 307 to the slashed one — confirmed by request, not assumed. This file
  previously listed /work, /build, /contact and /blog without the slash, so
  every URL it advertised was a redirect to the URL that actually exists. These
  now match both the live URLs and the <link rel="canonical"> each page emits
  (see src/components/Seo.tsx); the three have to agree, and if one moves the
  other two move with it.

  To add a new page later, copy this block and edit it:

    <url>
      <loc>https://horatiodigitalstudio.com/path-to-page/</loc>
      <lastmod>YYYY-MM-DD</lastmod>
    </url>

  Only add URLs for pages that actually exist and are live.

  lastmod means the last time the page's CONTENT changed — what a reader would
  notice — not the last time its file was touched. A site-wide plumbing change
  that edits every page (adding meta tags, renaming a CSS class) is not a
  content change and must not reset these dates: a sitemap that claims
  everything changed today, every time anything is deployed, teaches crawlers
  to ignore the field. The dates below come from each page's own last
  substantive commit.

  Two things deliberately never listed here:
    - Individual /blog/<slug> posts. They live in Postgres and change without a
      rebuild, so this static file cannot know them; /blog/'s own listing page is
      what makes them discoverable. (Note those URLs take NO trailing slash —
      they are served by the Worker at 200 rather than prerendered as
      directories, which is why they differ from every entry below.)
    - /blog/preview/<token>. Private, unguessable review links for unpublished
      drafts — the page itself is noindex, and publishing a token in a sitemap
      would defeat the only thing keeping those drafts private.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <!-- Testimonial placeholder commented out, page titles corrected. -->
  <url>
    <loc>https://horatiodigitalstudio.com/</loc>
    <lastmod>2026-07-31</lastmod>
  </url>
  <!-- New copy for the meridian1st exhibit; titles corrected. -->
  <url>
    <loc>https://horatiodigitalstudio.com/work/</loc>
    <lastmod>2026-07-31</lastmod>
  </url>
  <!-- Added with the Concept 5 promotion and unchanged since. -->
  <url>
    <loc>https://horatiodigitalstudio.com/build/</loc>
    <lastmod>2026-07-28</lastmod>
  </url>
  <!-- Real contact form wired up at the Concept 5 promotion. -->
  <url>
    <loc>https://horatiodigitalstudio.com/contact/</loc>
    <lastmod>2026-07-28</lastmod>
  </url>
  <!-- Went live against tRPC/Postgres; the index itself is unchanged since. -->
  <url>
    <loc>https://horatiodigitalstudio.com/blog/</loc>
    <lastmod>2026-07-29</lastmod>
  </url>
</urlset>
