<?xml version="1.0" encoding="UTF-8"?>
<!--
  Hand-maintained. One rule decides what belongs here: an address may be listed
  only if the document it serves canonicalises onto itself.

  Today that leaves exactly one. index.html carries a single static canonical,
  and it names /calculator. A client that runs no JavaScript therefore reads
  "canonical: /calculator" on every route, so /profile and /calibrate would be
  announcing addresses that disown themselves. Google renders and sees them
  canonicalise onto themselves; GPTBot, ClaudeBot and PerplexityBot do not.
  Announcing an address that is canonicalised one way when raw and another way
  when rendered is how a page ends up as "duplicate, Google chose a different
  canonical".

  They come back once the routes carry content of their own, and only
  prerendering would give them that (point 7 in docs/seo-geo.md). The static
  content block of point 5 does not: it lives in the one index.html and so
  stands under every route alike.

  Deliberately absent for a different reason: /saved, /materials and /settings.
  All three render per-device state held in IndexedDB, so a search visitor
  would land on an empty list.

  Also absent: the four static legal pages under /impressum/, /imprint/,
  /datenschutz/ and /privacy/. They carry robots noindex, follow. A sitemap
  lists what should be indexed; a noindex entry in it is a signal conflict.

  No lastmod: the content changes with every deploy, and a date written by
  hand here would be wrong by the next one. An absent lastmod is honest, a
  stale one is not.

  src/index-html.spec.ts holds the rule above against index.html.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://abkant.de/calculator</loc>
  </url>
</urlset>
