<?xml version="1.0" encoding="UTF-8"?>
<!--
  Hand-authored, like data/. There is no build step here and no generator anywhere in this repo —
  both data generators were deleted after drifting a schema behind the files they claimed to own —
  so this file is the source of truth and tools/sitemap_test.py is the reader that fails when it
  and the app disagree.

  What is deliberately absent:
    - <changefreq> and <priority>: Google ignores both outright. Writing them would be decoration
      that implies the crawler is being steered when it is not.
    - /index.html as its own entry: on Vercel the filesystem is evaluated before rewrites, so a
      root index.html means `/` serves it and vercel.json's `/` -> /signin.html rewrite never
      fires. `/` and /index.html are one page; it is listed once, as `/`. (The dev server does
      apply that rewrite, so locally `/` is signin.html — a real dev/prod divergence, noted in
      CLAUDE.md.)
    - signin.html: a single-task page with one exit, and not the site's front door in production.
      Public and indexable if someone links it, just not advertised.
    - field.html and lesson.html, for every field: both now require a session. A signed-out
      visitor — a crawler included — is redirected to signin.html before either page renders, so
      advertising them would point Googlebot at a route it can never reach and split the signal
      for a page that has no indexable content of its own. Organic *was* listed here, on the
      grounds that it is the one field with topics; the sign-in gate is what took it out, not the
      data. If the gate is ever lifted, put it back: it is the only real content page on the site.
      (lesson.html has a second, older reason too — every lesson's `blocks` array is still empty,
      so each URL would be the same empty shell.)
    - profile.html, password.html, delete-account.html: signed-in tasks. A crawler gets the
      signed-out shell, which is not a page anyone searched for. robots.txt disallows them too.
    - 404.html: it is the error response, not a destination.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://chemlingo.net/</loc>
    <lastmod>2026-08-18</lastmod>
  </url>
  <url>
    <loc>https://chemlingo.net/exams.html</loc>
    <lastmod>2026-08-16</lastmod>
  </url>
  <url>
    <loc>https://chemlingo.net/plans.html</loc>
    <lastmod>2026-08-16</lastmod>
  </url>
</urlset>
