[object Object]

← 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

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 →