From 3ae81530bc64093f598039d8ff21b287f9fb0894 Mon Sep 17 00:00:00 2001 From: Kane Hsieh Date: Tue, 11 Aug 2026 12:09:13 -0700 Subject: [PATCH] Keep the static mirror out of search results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Google was generating sitelinks to /about/, /team/, and portfolio pages under the root.vc result, which undercuts the terminal being the front door. Emits `noindex, follow` on every mirror page and on welcome.htm, and trims sitemap.xml to the homepage alone — listing a noindex URL in a sitemap asks Google to index something the page itself forbids, and that contradiction is what surfaced the sitelinks. Deliberately not a robots.txt Disallow: noindex is a search-indexing directive, so crawlers may still fetch and read these pages. GPTBot, ClaudeBot, PerplexityBot and llms.txt consumers keep getting the full content, while root.vc stays the only result Google shows. Co-Authored-By: Claude Sonnet 5 --- scripts/build-pages.js | 20 ++++++++---- tests/build-pages.test.js | 66 ++++++++++++++++++++++++++++++++++----- welcome.htm | 4 +++ 3 files changed, 76 insertions(+), 14 deletions(-) diff --git a/scripts/build-pages.js b/scripts/build-pages.js index 7679fe12..d0c16bb9 100644 --- a/scripts/build-pages.js +++ b/scripts/build-pages.js @@ -152,6 +152,13 @@ function renderPrompt(command) { ); } +// Every mirror page is emitted noindex. root.vc should be the only result +// Google shows: the terminal is the front door, and sitelinks to /about/ and +// /team/ give the trick away. noindex is a search-INDEXING directive, not a +// fetch permission — crawlers may still read the page, so GPTBot, ClaudeBot and +// PerplexityBot keep getting the full content. That is the whole reason this is +// not a robots.txt Disallow, which would hide the mirror from them too. +// "follow" keeps link equity flowing back to the homepage. function layout({ title, description, pathname, command, body, graph }) { const canonical = absUrl(pathname); const jsonLd = jsonLdScript({ "@context": "https://schema.org", "@graph": graph }); @@ -163,6 +170,7 @@ function layout({ title, description, pathname, command, body, graph }) { ${esc(title)} + @@ -947,14 +955,14 @@ function buildPages(config = loadConfig()) { files.push(renderPerson(config, slug)); }); - // Sitemap covers the terminal, the GeoCities page, and every generated page. + // The sitemap lists ONLY the homepage. Every mirror page is noindex, and + // listing a noindex URL in a sitemap asks Google to index something the page + // itself forbids — that contradiction is what produced sitelinks to /about/, + // /team/, and the rest under the root.vc result. Crawlers still reach the + // mirror via the