<?xml version="1.0" encoding="UTF-8"?>
<!-- Hand-maintained. There is no build step on this site, so when a page is
     added to site/ it is added here too, or it does not exist as far as a
     crawler is concerned. Paths are extensionless because vercel.json sets
     cleanUrls: true, and they must match the <link rel="canonical"> in each
     page exactly — a sitemap that disagrees with a canonical is worse than no
     sitemap. -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://postlad.com/</loc>
    <lastmod>2026-09-04</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <!-- PLAN.md §9f item 6. The guides index. Priority sits between the landing
       page and the guides themselves: it is a hub, and the individual guides
       are what a search is actually looking for. -->
  <url>
    <loc>https://postlad.com/guides</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /thingspeak-alternative and /arduino-cloud-alternative were removed on
       2026-08-08 and now 301 to /guides (see vercel.json "redirects"). A URL
       that redirects must not be in a sitemap, so they are gone from here
       rather than left pointing at the redirect. -->
  <!-- SPEC.md §8.1 / §13 M4. Priority alongside the guides index: it is one of
       the two pages somebody reads before deciding, and its numbers change when
       a plan does — which is what `test/pricing.test.ts` exists to catch. -->
  <url>
    <loc>https://postlad.com/pricing</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/esp32-send-data-to-cloud</loc>
    <lastmod>2026-09-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/free-iot-dashboard-for-students</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://postlad.com/project-room-monitor</loc>
    <lastmod>2026-08-22</lastmod>
  </url>
  <url>
    <loc>https://postlad.com/raspberry-pi-data-logger</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://postlad.com/arduino-data-logger-online</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/raspberry-pi-pico-w-cloud-data-logger</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/wokwi-esp32-cloud-dashboard</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/esp8266-dht22-cloud-dashboard</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/esp32-water-tank-level-monitor</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/migrate-thingspeak-csv-to-postlad</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <!-- The M-B pages. /thingspeak-sketch-to-postlad is the write-path migration
       (the /update alias) and carries the "thingspeak alternative" intent, so it
       sits at the same priority as the tutorials rather than at the CSV page's.
       Note the deleted /thingspeak-alternative still 301s to /guides in
       vercel.json — these are different URLs on purpose. -->
  <url>
    <loc>https://postlad.com/thingspeak-sketch-to-postlad</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://postlad.com/replacing-a-shut-down-iot-platform</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://postlad.com/store-and-forward-after-an-outage</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- SPEC.md §11.3. Indexable on purpose: "is Postlad down" is a query people
       type into a search engine during exactly the minute they cannot reach us,
       and the page that answers it is deliberately not hosted on the thing they
       cannot reach. -->
  <url>
    <loc>https://postlad.com/status</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>always</changefreq>
    <priority>0.4</priority>
  </url>
  <!-- Indexable, and low priority, which is the right pair for both of these:
       nobody searches for them, but a search engine and a payment provider both
       expect to be able to find them, and a legal page that 404s for a crawler
       is the same as one that does not exist. -->
  <url>
    <loc>https://postlad.com/privacy</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://postlad.com/terms</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <!-- The accessibility statement. Same low priority as the two legal pages
       above and for the same reason, with one difference that matters: a
       university procurement officer goes looking for this page before a
       purchase, so it resolves at the obvious address and is indexable
       rather than sitting behind an emailed PDF. -->
  <url>
    <loc>https://postlad.com/accessibility</loc>
    <lastmod>2026-08-22</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
</urlset>
