diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml
index 1455f4188..6439901fa 100644
--- a/.github/workflows/links.yml
+++ b/.github/workflows/links.yml
@@ -46,6 +46,21 @@ jobs:
- name: Validate HTML (html-validate)
run: npm run lint-html
+ - name: Strip standard.site link tags before link check
+ # The spec-required tags (one
+ # per post, plus the homepage publication tag) carry AT Protocol URIs.
+ # lychee can't parse the at:// scheme — the colons in did:plc:… read as an
+ # invalid port — so it emits a hard parse error that no --exclude,
+ # --scheme, --remap, or .lycheeignore rule can suppress (they all run
+ # after URL parsing). These tags are verification infrastructure, not
+ # content links, so we drop them from this throwaway build before
+ # checking. Production output is unaffected: links.yml builds its own
+ # dist-astro and never deploys it. Runs after lint-html so the real
+ # markup is validated first.
+ run: |
+ find dist-astro -name '*.html' -print0 \
+ | xargs -0 sed -i -E 's#]*rel="site\.standard\.(document|publication)"[^>]*>##g'
+
- name: Restore lychee cache
uses: actions/cache@v5
with:
diff --git a/.lycheeignore b/.lycheeignore
index 7dd6fcb2e..fc65f9215 100644
--- a/.lycheeignore
+++ b/.lycheeignore
@@ -19,10 +19,11 @@
^https?://127\.0\.0\.1
^https?://example\.(com|org|net)
-# AT Protocol URIs (at://did:plc:.../...) — emitted as standard.site
-# rel="site.standard.document"/"site.standard.publication" link tags. The
-# at:// scheme isn't resolvable over HTTP, so lychee can't (and shouldn't) check it.
-^at://
+# Note: standard.site rel="site.standard.document"/"site.standard.publication"
+# link tags carry at:// AT Protocol URIs that lychee can't parse (the colons in
+# did:plc:… read as an invalid port), so it errors before any ignore rule applies.
+# A regex here can't suppress them; the links.yml "Strip standard.site link tags"
+# step removes those tags from the throwaway build before lychee runs instead.
# Intentionally-broken demo links in posts that document 404 behavior.
# Pattern matches both raw root-relative form and the file:// form lychee