<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://studyfor5.com/</loc>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/pricing</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/about</loc>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <!--
    Blog. KEEP IN SYNC with the POSTS array in site/src/app/blog/posts.ts:
    every post needs a <loc> here or prerender.mjs never snapshots it, and a
    crawler gets the empty React shell instead of the article.

    <lastmod> appears ONLY in this block, and only because these are the pages
    whose change dates are actually known: each post's is its `updated` date,
    or its `published` date if it has never been revised, and /blog's is the
    newest post on it. Google ignores lastmod across a whole sitemap once it
    catches it being wrong, so a made-up date on the static pages would cost
    more than the honest ones here are worth. Update a post's date here in the
    same change that sets `updated` in posts.ts.
  -->
  <url>
    <loc>https://studyfor5.com/blog</loc>
    <lastmod>2026-10-15</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/blog/ap-chem-atomic-radius-periodic-trends</loc>
    <lastmod>2026-10-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/blog/ap-chem-percent-composition-mixture</loc>
    <lastmod>2026-10-07</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/blog/ap-chem-mass-to-mass-stoichiometry</loc>
    <lastmod>2026-09-30</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/blog/why-choose-studyfor5-for-ap-chemistry-prep</loc>
    <lastmod>2026-09-21</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/diagnostic</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/terms</loc>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/privacy</loc>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course</loc>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/practice-exams</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/practice-frqs</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/ap-chemistry-score-calculator</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/ap-calculus-ab-score-calculator</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/ap-calculus-ab-exam</loc>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/ap-chemistry-exam</loc>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!--
    Unit pages. One <loc> per unit that has lessons of its own — which is the
    same condition RobotsMeta's unitHasLessons() uses to say `index`, and the
    two MUST agree: firebase.json rewrites `**` to /index.html, so a unit URL
    that claims to be indexable and is not in this file is served the
    prerendered AP Chemistry HOMEPAGE at HTTP 200. That is duplicate content
    under a URL we told Google to trust, and it is how seven empty Calc unit
    pages got indexed in October.

    This file is hand-maintained by design and is an INPUT to prerender.mjs, so
    it cannot derive the list itself. support/scripts/check-hosting-redirects.mjs
    fails the deploy if anything indexable is missing from here — add the unit's
    line in the same change that adds its first lesson.

    AP Calculus AB has unit 1 only. Its other seven units are registered in
    app/data/units.ts and have no lessons yet, so they say noindex and are
    deliberately absent.
  -->
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/1</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/2</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/3</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/4</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/5</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/6</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/7</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/8</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-chemistry/unit/9</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-calculus-ab/unit/1</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://studyfor5.com/course/ap-calculus-ab/unit/2</loc>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>
