<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <!-- These are hand-maintained. The lastmod dates say when the PAGE last changed in a way
       a reader would notice, not when the file was touched, so do not bump them for a typo.
       They sat at 2026-07-07 for a month while the pages changed underneath them, which tells a
       crawler there is nothing new to come back for.

       EVERY URL LISTED HERE MUST ANSWER 200 AT THE URL WRITTEN, AND MUST BE THE ONE ITS OWN
       CANONICAL NAMES. A sitemap entry that redirects, or that points at a page claiming a
       different URL as canonical, is a contradiction rather than a hint, and it is the shape of
       the bug this file was part of: it listed /home while every page on the site also claimed
       /home as its canonical. app/tests/test_seo.py checks both properties now. -->
  <!-- The homepage is the APEX, changed 2026-08-15 from /home, which now 301s here. See the
       reasoning in render.yaml and in src/lib/seo.ts. -->
  <url>
    <loc>https://kloti.co/</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://kloti.co/faq</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <!-- Pricing. Listed from 2026-08-15, when it became a real prerendered page: before that the
       URL served the app shell and then rendered nothing, because no React route matched it. -->
  <url>
    <loc>https://kloti.co/plans</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <!-- The public gallery. Listed from 2026-08-08: it is a real public page with a lot of unique
       imagery, and it was previously excluded only because every SPA route claimed to be a
       duplicate of /home and there was no point pointing a crawler at it. Prerendered as its own
       file from 2026-08-15, so the tags are in the served HTML rather than applied by script. -->
  <url>
    <loc>https://kloti.co/explore</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.6</priority>
  </url>
  <!-- Slate, the free editor. Highest priority of any page here except the homepage, and that is
       the point of it: a free tool needing no signup is the one page on this site a stranger has a
       reason to link to, and links are what a new domain otherwise cannot get.

       Absent from 2026-08-10 to 2026-08-17, while it was slice 1 of six. Restored in one action
       with the nav link, the footer link and the noindex in src/lib/seo.ts, which is what F-AJ
       asked for: the four were removed together so that they could only come back together.

       Weekly rather than monthly because this is the page still being built out, slice by slice.
       The lastmod is the last day the tool changed in a way a visitor would notice, not today: the
       links around it moved, the page did not. -->
  <url>
    <loc>https://kloti.co/slate</loc>
    <lastmod>2026-08-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://kloti.co/terms.html</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://kloti.co/privacy.html</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.3</priority>
  </url>
  <!-- BEGIN blog (generated by app/tools/build_blog.py, do not hand-edit) -->
  <url>
    <loc>https://kloti.co/blog</loc>
    <lastmod>2026-08-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/category/craft</loc>
    <lastmod>2026-08-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/category/selling</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/shooting-a-menu-that-keeps-changing</loc>
    <lastmod>2026-08-10</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/a-ring-is-a-mirror</loc>
    <lastmod>2026-08-10</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/a-house-look-for-work-that-is-never-the-same-twice</loc>
    <lastmod>2026-08-10</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/why-your-product-poster-looks-unfinished</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/which-image-goes-where</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/nobody-can-tell-how-big-it-is</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://kloti.co/blog/why-ai-product-photos-look-fake</loc>
    <lastmod>2026-07-30</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <!-- END blog -->
</urlset>
