<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:image="http://www.google.com/schemas/sitemaps/image/1.1">
  <!-- One page, so one entry. The short links are aliases that canonicalise
       back here and are deliberately left out. -->
  <url>
    <loc>https://bensonshen.com/</loc>
    <lastmod>2026-08-20</lastmod>
    <changefreq>monthly</changefreq>
    <priority>1.0</priority>
    <!-- The headshot, declared so Google discovers it as an image *of this
         page* rather than waiting to notice it while rendering. That
         association is what a result thumbnail is drawn from.

         The URL is the square derived by tools/build-images.mjs, which is the
         same file the page's <img> src points at - a sitemap should name an
         image a crawler can also find on the page, not a second one only it
         is told about.

         Only the portrait is listed. The OG cards under /images/og/ are also
         images of this page, but listing them would offer the crawler a wide
         banner as a candidate thumbnail, and a banner cropped to a square
         thumbnail is a slice of its middle. One candidate, and it is the one
         that survives the crop.

         <image:loc> is the whole element: Google dropped support for
         image:caption, image:title, image:license and image:geo_location in
         2022, so the alt text in the markup and the ImageObject in the page's
         structured data are where that description lives now. -->
    <image:image>
      <image:loc>https://bensonshen.com/images/benson-shen.jpg</image:loc>
    </image:image>
  </url>
</urlset>
