<?xml version="1.0" encoding="UTF-8"?>
<!--
  Hand-curated sitemap. Every <loc> here MUST resolve to a live
  indexable page on the public site AND that page's own
  `<link rel="canonical">` must point back at the same URL.

  Sources of truth:
    - PageRoute templates in app/pages/ (auto-registered by xun).
    - Blog posts under blog/*.md (auto-registered by xun's Content
      engine — flat namespace; section prefixes like
      `/blog/install/<slug>` from the previous version of this file
      are broken because the posts live flat under blog/).

  Trailing-slash policy: the public site is moving toward
  trailing-slash canonicals, but the routes are landing at
  different cadences, so the sitemap mirrors what ACTUALLY serves
  200 today:
    - `/` and `/blog/`           → trailing slash canonical (the
                                   redirect from /blog is being
                                   deployed; /blog/ already serves).
    - `/blog/<slug>` (no slash)  → Content engine registers posts
                                   at /blog/<slug> exactly. A
                                   sitemap entry with a trailing
                                   slash 404s.
    - `/dash`, `/dash/login`     → no trailing slash (exact-match
                                   routes registered in routes.go).

  Hash fragments (#about etc.) and section landing pages that don't
  exist (/blog/install, /blog/quickstart, /blog/usage) are
  deliberately omitted — search engines treat fragments as the same
  URL as the bare path, so listing them produces duplicate-URL noise
  rather than useful crawl targets.

  When a new blog post is added: append a <url> entry below with
  the same slug that ends up in blog/<slug>.md (no trailing slash).
  When one is removed: delete its <url> entry. A test in
  cmd/app/sitemap_test.go cross-checks these URLs against the
  on-disk blog directory so a stale entry fails CI instead of
  silently 404-ing in the wild.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://nightme.dev/</loc>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/</loc>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/welcome-to-nightme</loc>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/install-on-macos-linux</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/install-on-windows</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/bind-feishu</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/first-agent-session</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/run-agents-in-parallel</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/gtw-one-shot-fixes</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://nightme.dev/blog/gtw-config</loc>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
</urlset>
