<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">

  <!-- Homepage / marketing landing -->
  <url>
    <loc>https://blackboard.fi/</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://blackboard.fi/" />
    <xhtml:link rel="alternate" hreflang="ja" href="https://blackboard.fi/?lang=ja" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://blackboard.fi/" />
    <lastmod>2026-06-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- Public marketing resources. Trailing slash URLs are canonicalized by
       route metadata; the React app renders these pages. -->
  <!-- Blog INDEX only. Individual published articles (/blog/<slug>/) are
       enumerated by the backend-served dynamic sitemap, which reflects a
       publish/unpublish immediately without a frontend rebuild. It is served
       same-host at https://blackboard.fi/blog/sitemap.xml (the edge prerender
       proxies it to /api/blog/sitemap.xml) and is listed in robots.txt. -->
  <url>
    <loc>https://blackboard.fi/blog/</loc>
    <lastmod>2026-06-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://blackboard.fi/guide/</loc>
    <lastmod>2026-06-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.7</priority>
  </url>

  <!-- Legal -->
  <url>
    <loc>https://blackboard.fi/terms/</loc>
    <lastmod>2026-06-10</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://blackboard.fi/privacy/</loc>
    <lastmod>2026-06-10</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <!-- App-only and private account surfaces are intentionally excluded until
       their direct URLs return 200 without relying on client-side navigation. -->

</urlset>
