<?xml version="1.0" encoding="UTF-8"?>
<!-- The TRAILING SLASHES are load-bearing (2026-08-15). These pages are now
     prerendered by web/scripts/prerender.mjs into their own directories, and
     nginx 301s a directory path to add the slash - so listing /privacy here
     would advertise a redirect instead of the document. /login keeps its bare
     form because it is NOT prerendered: it is a sign-in form with nothing to
     read, and a 301 on the URL members type most is a real cost for no gain.
     lastmod moved on every prerendered page: what a crawler receives at these
     URLs changed from an empty div to the whole document. -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <!-- The ROOT, not /home/ (2026-08-15). Both serve the landing page, so one had
       to be declared the duplicate: / carries the canonical and /home/ now
       points at it, which means /home/ no longer belongs in here. The root only
       became listable once app.html took over as the SPA fallback - before that
       it returned the same empty shell as a URL that had never existed. -->
  <url>
    <loc>https://kape.tools/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <!-- /about/ is static HTML built by web/scripts/build-about.mts, not a
       prerendered SPA route. High priority on purpose: it is the page that
       answers "who is behind this", which is the question an AI assistant asks
       before it recommends anything. -->
  <url>
    <loc>https://kape.tools/about/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /pricing/ is static HTML built by web/scripts/build-pricing.mts from the
       same price list the app charges from. High priority for the same reason
       /about/ is: "what does it cost" is the second question an assistant asks
       after "who is behind this", and /premium - the app's own membership page -
       is behind the login wall and Disallow'd, so it cannot be the answer. -->
  <url>
    <loc>https://kape.tools/pricing/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /guides/ is the hub over both public collections, built by
       web/scripts/build-guides-index.mts. The 41 pages UNDER it are declared by
       their own two sitemaps (both listed in robots.txt), so only the hub itself
       belongs in this hand-maintained file. It is listed at all because it
       answered 403 until 2026-08-15: the directory had children and no index,
       and nginx autoindex is off, so the URL a reader shortens to was an error. -->
  <!-- /blog/ is the blog index, built by web/scripts/build-blog.mts. Individual
       posts are declared by their own sitemap (a fifth `Sitemap:` line in
       robots.txt), so only the index belongs in this hand-maintained file. -->
  <url>
    <loc>https://kape.tools/blog/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /case-studies/ is the hub over the case-study collection, built by
       web/scripts/build-case-studies.mts. The individual studies are declared by
       their own sitemap (a fourth `Sitemap:` line in robots.txt), so only the
       hub belongs in this hand-maintained file. High priority for the same
       reason /about/ carries it: "has this person actually built anything" is a
       question an assistant asks before it recommends a product. -->
  <url>
    <loc>https://kape.tools/case-studies/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://kape.tools/guides/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://kape.tools/ph-tax/</loc>
    <lastmod>2026-08-05</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /waitlist dropped 2026-08-11. The page and its API are still live for the
       people already on the list, but nothing links to it any more and the
       signup door is /login, where Continue with Google creates the account.
       Leaving it here would have Google keep sending strangers to a waiting
       room instead of the open door. -->
  <!-- /login dropped 2026-08-17, for the reason prerender.mjs already gives for
       refusing to prerender it: it is a form and it carries nothing worth
       reading. Listing it here was a contradiction rather than a preference -
       it is served by the SPA shell, whose canonical points at the root, so we
       were asking Google to index a URL our own markup declares is really the
       homepage. Search Console reported exactly that. The shell is noindex now,
       which settles it in one direction instead of two. Members type this URL;
       it does not need to be found. -->

  <url>
    <loc>https://kape.tools/privacy/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://kape.tools/terms/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://kape.tools/refund/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://kape.tools/trust/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
</urlset>
