← back to Thesetdecorator
TSD SEO: noindex,nofollow on 5 verified-internal tool pages (DTD verdict A)
97279e578623352a847a84f612d1c7e5ad5f03ec · 2026-06-03 10:02:37 -0700 · Steve
art-review, logo-agent, logo-variants, sent-to-exa, popout — each confirmed
unlinked from any other page AND absent from the 3124-URL sitemap. Adds
<meta name=robots content=noindex,nofollow> after viewport via idempotent
scripts/noindex-internal-pages.py. Public pages untouched. Static files —
rides the queued deploy.
Files touched
M public/art-review.htmlM public/logo-agent.htmlM public/logo-variants.htmlM public/popout.htmlM public/sent-to-exa.htmlA scripts/noindex-internal-pages.py
Diff
commit 97279e578623352a847a84f612d1c7e5ad5f03ec
Author: Steve <steve@designerwallcoverings.com>
Date: Wed Jun 3 10:02:37 2026 -0700
TSD SEO: noindex,nofollow on 5 verified-internal tool pages (DTD verdict A)
art-review, logo-agent, logo-variants, sent-to-exa, popout — each confirmed
unlinked from any other page AND absent from the 3124-URL sitemap. Adds
<meta name=robots content=noindex,nofollow> after viewport via idempotent
scripts/noindex-internal-pages.py. Public pages untouched. Static files —
rides the queued deploy.
---
public/art-review.html | 1 +
public/logo-agent.html | 1 +
public/logo-variants.html | 1 +
public/popout.html | 1 +
public/sent-to-exa.html | 1 +
scripts/noindex-internal-pages.py | 43 +++++++++++++++++++++++++++++++++++++++
6 files changed, 48 insertions(+)
diff --git a/public/art-review.html b/public/art-review.html
index 96e926f..a23c8df 100644
--- a/public/art-review.html
+++ b/public/art-review.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
+ <meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
diff --git a/public/logo-agent.html b/public/logo-agent.html
index 4d2caf5..6ab7902 100644
--- a/public/logo-agent.html
+++ b/public/logo-agent.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
+ <meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
diff --git a/public/logo-variants.html b/public/logo-variants.html
index 146aa82..c57f500 100644
--- a/public/logo-variants.html
+++ b/public/logo-variants.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
diff --git a/public/popout.html b/public/popout.html
index d9e52b0..a934f8c 100644
--- a/public/popout.html
+++ b/public/popout.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
diff --git a/public/sent-to-exa.html b/public/sent-to-exa.html
index ce4b01c..127572e 100644
--- a/public/sent-to-exa.html
+++ b/public/sent-to-exa.html
@@ -3,6 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta name="robots" content="noindex,nofollow">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
diff --git a/scripts/noindex-internal-pages.py b/scripts/noindex-internal-pages.py
new file mode 100644
index 0000000..f4b91e4
--- /dev/null
+++ b/scripts/noindex-internal-pages.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+"""Idempotent noindex for TSD's verified-internal admin/utility pages (DTD verdict A).
+
+These 5 pages are operational tools — NOT linked from any other page AND absent
+from the dynamically-generated 3124-URL sitemap. They had no robots meta, so they
+were indexable by default. Add <meta name="robots" content="noindex,nofollow">
+right after the viewport meta so accidental discovery (referrers, logs, external
+mentions) doesn't put internal tools in Google's index.
+
+Scope is deliberately the 5 confirmed-internal pages only — public pages
+(job-board, submit, etc.) are untouched. Idempotent (skips pages already noindex);
+reversible (single meta line per page).
+ python3 scripts/noindex-internal-pages.py
+"""
+import os, re, glob
+
+PUB = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "public")
+
+INTERNAL = ["art-review.html", "logo-agent.html", "logo-variants.html",
+ "sent-to-exa.html", "popout.html"]
+
+META = ' <meta name="robots" content="noindex,nofollow">\n'
+VIEWPORT_RE = re.compile(r'^[ \t]*<meta[^>]*name=["\']?viewport["\']?[^>]*>[ \t]*\n', re.IGNORECASE | re.MULTILINE)
+HASROBOTS_RE = re.compile(r'<meta[^>]*name=["\']?robots["\']?', re.IGNORECASE)
+
+changed, skipped, noanchor, missing = [], [], [], []
+for name in INTERNAL:
+ path = os.path.join(PUB, name)
+ if not os.path.exists(path):
+ missing.append(name); continue
+ html = open(path, encoding="utf-8").read()
+ if HASROBOTS_RE.search(html):
+ skipped.append(name); continue
+ m = VIEWPORT_RE.search(html)
+ if not m:
+ noanchor.append(name); continue
+ open(path, "w", encoding="utf-8").write(html[:m.end()] + META + html[m.end():])
+ changed.append(name)
+
+print(f"changed ({len(changed)}): {', '.join(changed) or '-'}")
+print(f"skipped/already ({len(skipped)}): {', '.join(skipped) or '-'}")
+if noanchor: print(f"NO viewport anchor: {', '.join(noanchor)}")
+if missing: print(f"MISSING: {', '.join(missing)}")
← 9ebedbd backlog: loop #5 (interior breadcrumbs) + catalog ItemList d
·
back to Thesetdecorator
·
backlog: loop #6 (noindex internal pages) + consolidate depl 43bec6d →