<?xml version="1.0" encoding="UTF-8"?>
<!--
  goodhand.ai sitemap — every URL below is a route that actually renders public
  content with no login (checked against src/App.jsx, 2026-09-22):
    /                    LandingPage
    /for/<trade>         TradeLandingPage, one per key in src/lib/trade.js TRADES
    /privacy /terms /dpa /accessibility   the legal pages
    /help                the how-to guide (HelpPage publicMode)
    /demo                the seeded, no-login demo

  Deliberately NOT listed: /login, /signup, /preview-signup, /reset-password
  (functional, not content — nothing for a search result to land a stranger
  on), /admin (staff-only, disallowed in robots.txt), and the per-token public
  pages /d/<token>, /q/<token>, /book/<token>, /f/<token> (each one is a single
  customer's private document/booking/form link, never meant to be discovered
  by a crawler).

  supabase/tests/seo_and_dormant_paths_units.mjs checks every TRADES key from
  src/lib/trade.js has a /for/<trade> entry here — a trade added there without
  a line here fails that suite instead of silently missing from search.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://goodhand.ai/</loc></url>
  <url><loc>https://goodhand.ai/for/photography</loc></url>
  <url><loc>https://goodhand.ai/for/contractor</loc></url>
  <url><loc>https://goodhand.ai/for/roofing</loc></url>
  <url><loc>https://goodhand.ai/for/builder</loc></url>
  <url><loc>https://goodhand.ai/for/landscaping</loc></url>
  <url><loc>https://goodhand.ai/for/cleaning</loc></url>
  <url><loc>https://goodhand.ai/for/events</loc></url>
  <url><loc>https://goodhand.ai/for/other</loc></url>
  <url><loc>https://goodhand.ai/privacy</loc></url>
  <url><loc>https://goodhand.ai/terms</loc></url>
  <url><loc>https://goodhand.ai/dpa</loc></url>
  <url><loc>https://goodhand.ai/accessibility</loc></url>
  <url><loc>https://goodhand.ai/help</loc></url>
  <url><loc>https://goodhand.ai/demo</loc></url>
</urlset>
