<?xml version="1.0" encoding="UTF-8"?>
<!-- ⚠️ ONLY PUBLIC SCREENS BELONG HERE, and that list is short on purpose.
     Since 2026-08-20 the app uses real paths instead of `#/…` routes, so a
     screen can finally be fetched and indexed as itself — which is what added
     /new and /plans below.
     🚫 NEVER LIST /m/<code> OR /link/<code>. A meeting code is the key to the
     room; those screens carry `noindex` at runtime (src/lib/pagemeta.ts) and
     putting one in a sitemap would be handing Google the very thing that tag
     exists to withhold. 🚫 /mine and /cohosts are per-account screens behind a
     sign-in — there is nothing there for a crawler to see.
     ⚠️ THE LEGAL PAGES HAVE NO `.html` HERE. They are still the static files
     privacy.html / terms.html / about.html in public/, but Cloudflare Pages
     serves them at the extensionless address and 308s the `.html` form to it —
     so listing `.html` sent every crawler through a needless redirect and made
     each page's own canonical tag point at an address that bounces. -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://opalmeet.com/</loc>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://opalmeet.com/new</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://opalmeet.com/plans</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://opalmeet.com/about</loc>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://opalmeet.com/privacy</loc>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://opalmeet.com/terms</loc>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
</urlset>
