<?xml version="1.0" encoding="UTF-8"?>
<!--
  ZNetLab sitemap.

  The canonical host appears here and in robots.txt and in each page's
  <link rel="canonical">. Change all of them together or half the site will
  point at a domain that is not this one.

  THREE THINGS THIS FILE USED TO GET WRONG, kept here so they are not
  reintroduced:

  1. The namespace was `sitemap.org` — singular. It is `sitemaps.org`, and
     with the wrong one the whole file is not a sitemap at all: Search
     Console rejects it as an unsupported format and none of these URLs are
     ever read.

  2. Five entries were fragments — /learn/#labs, /learn/#articles and so on.
     A crawler strips the fragment, so all five were duplicates of /learn/
     and /, diluting the file and telling Google nothing. Fragments belong
     in navigation, not in a sitemap.

  3. /learn/lab.html was listed at priority 0.9 while being behind a hard
     login redirect. Everything Google could ever fetch there was the sign-in
     page, so the one thing that entry could achieve was getting a login
     page indexed as the simulator. It was removed for that reason.

     The gate is back — the simulator requires sign-in (require-login.js on
     learn/lab.html) — so the entry is removed again, and the page carries
     noindex. If the gate is ever lifted, both come back together.

  The lab platform (/lab/) is deliberately absent: an application behind a
  sign-in with nothing to read.

  `priority` is relative within this site only. It is a hint, not a ranking.

  WHAT IS NOT IN THIS FILE AND IS IN THE SITEMAP ANYWAY. /read/ and every
  published article, blog post, answered question and lab under it are added
  by the server as this file is served — see READING.sitemapXml() in
  server/reading.js and the sitemap branch of serveSite(). They are not
  written here because what is published changes when a moderator presses
  Approve, not when somebody deploys, and a hand-written list would be stale
  the first time anybody published anything. Fetch /sitemap.xml to see the
  real one; this file is the static half of it.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

  <!-- The one page that should rank for the product itself. -->
  <url>
    <loc>https://znetlab.com/</loc>
    <lastmod>2026-08-31</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- The teaching site. Still one page, but its sections now have real
       addresses — /learn/articles/ rather than /learn/#articles — so each
       one is a URL a crawler can fetch, and point 2 above no longer
       applies to them: these are paths, not fragments. The items inside
       them live under them (/learn/articles/<slug>/) and are not listed
       one by one here; /read/ is the index for published items and the
       reading pages carry their own canonical links. -->
  <url>
    <loc>https://znetlab.com/learn/</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- Contact. A page of the site now rather than a section of the teaching
       half, which is also why it can be in here at all: /learn/#contact was
       a fragment and a crawler strips it. -->
  <url>
    <loc>https://znetlab.com/contact</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://znetlab.com/learn/guided-labs/</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://znetlab.com/learn/articles/</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://znetlab.com/learn/blogs/</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/learn/forums/</loc>
    <lastmod>2026-10-11</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.7</priority>
  </url>

  <!-- Documentation: how to build a lab, and how an administrator loads
       images. Genuinely searched for, so genuinely worth indexing. -->
  <url>
    <loc>https://znetlab.com/guide</loc>
    <lastmod>2026-08-31</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://znetlab.com/community-guide</loc>
    <lastmod>2026-10-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/plans</loc>
    <lastmod>2026-08-31</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <!-- The comparison page. High priority on purpose: it is the page that
       answers the question most people actually arrive with — which of these
       four tools to use — and the only one that names the other three. -->
  <url>
    <loc>https://znetlab.com/compare</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <!-- The two index pages, added together because they are each other's
       halves: one for people, one for crawlers.

       THE HTML ONE IS LISTED AND THE XML ONE IS NOT. A sitemap that lists
       itself is a loop, and Search Console reads this file directly from
       robots.txt — it does not need to be told about it. sitemap.html is a
       page like any other: it has prose, it explains what each address is
       for, and it is the strongest internal-linking page on the site, which
       is exactly what a crawler should be able to find.

       LISTED EXTENSIONLESS, like every other entry. /sitemap.html answers
       with a 301 to /sitemap — that is this site's rule for every page —
       and a sitemap full of addresses that redirect is a sitemap that
       spends a crawler's budget on hops. -->
  <url>
    <loc>https://znetlab.com/sitemap</loc>
    <lastmod>2026-10-03</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.4</priority>
  </url>

  <!-- The policy map. A hub rather than a policy: one row per question people
       ask, each linking to the section of Terms or Privacy that answers it.
       Listed above the three documents it indexes, because it is the page
       somebody searching "znetlab refund policy" should land on. -->
  <url>
    <loc>https://znetlab.com/policies</loc>
    <lastmod>2026-10-03</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>

  <!-- The legal pages: terms, privacy, and third-party licences. Linked from
       every footer; listed so a crawler finds them without following one. -->
  <url>
    <loc>https://znetlab.com/terms</loc>
    <lastmod>2026-09-24</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://znetlab.com/privacy</loc>
    <lastmod>2026-09-24</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://znetlab.com/licenses</loc>
    <lastmod>2026-09-24</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.2</priority>
  </url>

  <url>
    <loc>https://znetlab.com/read/</loc>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-junos-and-ios-in-one-ospf-area</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-the-qos-policy-that-will-not-attach</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-inside-outside-and-a-dmz</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-dns-and-http-across-a-routed-network</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-three-cables-one-link</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-ipv6-two-segments-one-router</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-redistribution-with-two-doors</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-ospf-underlay-ibgp-overlay</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-branch-nat-and-an-inbound-acl</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-a-redundant-triangle-without-a-loop</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-vlans-and-router-on-a-stick</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/lab-two-lans-two-static-routes</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/nat-configured-but-no-translations</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/trunk-up-but-vlan-20-will-not-pass</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/etherchannel-will-not-bundle</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/ospf-neighbours-stuck-exstart</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/ping-works-ssh-hangs-over-the-vpn</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/reading-a-capture-without-drowning</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/its-a-dns-problem-usually-isnt</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/the-lab-taught-me-more-than-the-exam</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/three-commands-before-i-believe-anything</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/i-stopped-memorising-subnet-tables</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/mtu-black-holes-ping-works-ssh-hangs</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/spanning-tree-root-ports-and-loops</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/redistribution-between-eigrp-and-ospf</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/access-lists-order-and-the-implicit-deny</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/nat-overload-and-the-return-packet</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/a-static-route-read-field-by-field</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/ospf-adjacency-and-where-it-stops</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/trunks-and-the-native-vlan</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/what-a-switch-does-with-a-frame</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://znetlab.com/read/subnetting-without-the-magic-number</loc>
    <lastmod>2026-10-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>
