diff --git a/ASSETS.md b/ASSETS.md
index 0dd30fe..6d4c4a8 100644
--- a/ASSETS.md
+++ b/ASSETS.md
@@ -75,6 +75,25 @@ direction — since the current site shows almost everyone except him in that ro
| `assets/img/media-glamour.jpg` | Speak (`media` credits) | Poster frame for Glamour's styling competition *Dress to Kill* (16:9). Source video: https://www.youtube.com/watch?v=_KzZ2pqT_6g |
| `assets/img/about-portrait.jpg` | About | A strong editorial portrait of Quentin. |
+## The Archives page
+
+`/archives` is the portfolio, driven by `content/archives.yaml` (`sections[].images`),
+not by fixed slots: each entry is a `{ src, alt, cap }` pointing at any file under
+`public/assets/img/`. Most of them currently live in `assets/img/gallery/`.
+
+- **Budget 5 to 10 photos per section**, chosen for name recognition first, then
+ for how dynamic the image is. Past that, adding means replacing.
+- **Name the person in `alt` and `cap` when the shoot is a named client.** That, plus
+ the `clients.names` line on the page, is what makes a search for that name reach
+ the site. Get the spelling exactly right.
+- Sections: `celebrity`, `editorial`, `commercial`, `red-carpet`. A section with no
+ images is skipped on the page, so one can be defined before its photos exist.
+- **Run `python3 tools/optimize_images.py` after adding files.** It now covers the
+ `gallery/` subfolder, and without it the new photos ship as single oversized JPEGs.
+- **Rights:** only publish photos the owner has the rights to. Press-agency comps
+ (Getty, WireImage, Shutterstock) carry visible watermarks and are licensed for
+ review, not publication. Ask for the clean licensed file instead of shipping one.
+
## Video — the speaking reel
The Speak page has a play-button poster linking to `contact.html` as a placeholder.
Replace it with the real two-minute reel cut from the **Tommy Hilfiger interview**,
diff --git a/CLAUDE.md b/CLAUDE.md
index 3867889..c2fcd74 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -159,6 +159,40 @@ category keys and shoot slugs in sync with the YAML (CI checks the keys). Never
shoots from different categories into one set: Celebrity men and Celebrity women are
separate categories, as they were on the old site.
+Note the Work page no longer carries the old archive tile strip; it links to The
+Archives instead. `galleries` still backs the Work case-study lightbox buttons.
+
+## The Archives page
+
+`/archives` ([src/pages/archives.astro](src/pages/archives.astro),
+`content/archives.yaml`) is the portfolio: `sections` of `{ key, title, intro,
+images[] }`, one section per area of work (Celebrity, Editorial, Commercial, Red
+carpet). It is the owner's front door for portfolio material, so it is the first
+place new work should land.
+
+- **Every photo is a real `
` on the page.** That is the point of the page, and
+ it is also the only reliable way image search sees the portfolio (the Work
+ lightbox builds its DOM from JSON, which no crawler executes).
+- **A section with no photos is skipped**, so an area of work can be defined in the
+ YAML before its images exist without shipping an empty grid.
+- **The lightbox is reused unchanged.** Each section is emitted as a one-shoot
+ category in `
+
+
+
diff --git a/src/pages/sitemap.xml.ts b/src/pages/sitemap.xml.ts
new file mode 100644
index 0000000..b26774e
--- /dev/null
+++ b/src/pages/sitemap.xml.ts
@@ -0,0 +1,86 @@
+/**
+ * sitemap.xml, generated at build time.
+ *
+ * Two jobs:
+ * 1. List the six pages (what the hand-written public/sitemap.xml used to do).
+ * 2. Declare every photo each page shows, as entries, so Google
+ * Images can find them.
+ *
+ * (2) is the reason this is generated rather than hand-written. Most of the
+ * portfolio photos are only ever inserted into the DOM by the lightbox, from
+ * the JSON in