diff --git a/scripts/gen_landing.py b/scripts/gen_landing.py
index 0c9ca0a..6b10cc3 100755
--- a/scripts/gen_landing.py
+++ b/scripts/gen_landing.py
@@ -24,7 +24,8 @@
# record's `source_date_epoch`, else an em dash — never a filesystem timestamp — so
# a second render of the same inputs is byte-identical (a NOOP republish never
# manufactures a commit) — except that the page footer carries the render year, so
-# the first render of each new year rewrites every page once.
+# the first render of each new year rewrites every page once. The footer's
+# `Site updated` time is the newest package Published epoch, so it moves only on a publish.
#
# Stdlib only + the `zstd` binary (to read a .pkg's +COMPACT_MANIFEST). Dev-only
# tooling — not shipped in release archives (those contain only src/).
@@ -537,9 +538,20 @@ def _site_header(root: str) -> str:
)
-def _site_footer(root: str) -> str:
+def _site_footer(root: str, updated: float | None = None) -> str:
"""The main site's footer. The year is the render year: the one render after
- New Year changes the page, every other re-render stays byte-identical."""
+ New Year changes the page, every other re-render stays byte-identical.
+ ``updated`` is the newest package publish epoch in the tree (issue #3485), never the
+ render clock, so a re-render without a publish stays byte-identical."""
+ # Same text and datetime format as the main site's footer (site/dist), so both sites match.
+ site_updated = (
+ " · Site updated "
+ + f'"
+ if updated is not None
+ else ""
+ )
year = datetime.now(timezone.utc).year
return (
'