<?xml version="1.0" encoding="UTF-8"?>
<!--
  Sitemap for understandball.com.

  ⛔ ONE URL, AND AS OF 2026-09-28 THAT IS A CHOICE PENDING WORK, NOT A FACT ABOUT THE APP.
  This file used to say the site "never touches the URL — there is no router, no pushState".
  That stopped being true when A6 shipped: `frontend/src/nav/route.js` is a router, the shell
  pushes state, and there are now 72 addressable views (6 sports x 2 lenses x 6 tabs), each with
  its own canonical URL from `canonicalFor`. Listing them is #930's job — the derived generator
  lives there — and until it lands this file deliberately lists only `/`, which is honest but
  thin rather than complete.

  The only other server-visible path is `/s/<code>`, the per-trade share shim.
  It is deliberately absent: the code space is unbounded, every one of those
  URLs redirects into this same page, and each already declares this page as its
  canonical. Listing them would be asking Google to index infinite duplicates.

  No <lastmod>, <changefreq>, or <priority>. Google ignores the latter two
  outright, and a <lastmod> that nobody remembers to bump is a date that lies —
  worse than no date, because a consistently-stale lastmod teaches crawlers to
  distrust the field. Add it back only alongside something that keeps it true.

  If the canonical host ever changes, this file, public/robots.txt and the
  <link rel="canonical"> in index.html must all move together. There is a test
  that fails if they drift: frontend/src/seo/siteOrigin.test.js.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://understandball.com/</loc>
  </url>
</urlset>
