Skip to content

SEO · what gets indexed

The crawl surface

One sitemap, grouped by content type, generated from the same data the pages render — 645 URLs in this build, one per catalog record, one per studio-log entry, and the hub pages that are neither. 8 surfaces are kept out, and this page lists them with a reason instead of hiding the rule in a config file.

In the sitemap

Open /sitemap.xml →
In the sitemap — data table
GroupPagesExampleNote
Components289/components/prism-switchone URL per asset, dated from its published field
Prompts116/prompts/dark-saas-pricing-launchone URL per asset, dated from its published field
Essays91/learn/hero-that-breathes-in-20-minone URL per guide, dated from updated
Backgrounds1/backgroundsone page, one anchor each — 33 backgrounds
Studio log34/changelog/2026-09-12-bank-3-closes-at-500-500one URL per entry, dated from the entry
Everything else100/brand/launchhub, brand, perf, pro, integrations, community and tool pages

The catalog groups and the studio log are derived from the records themselves, so publishing an asset adds its URL without anyone editing a file here. The last row is the list in src/lib/crawl.ts — the pages a stranger can land on that are not a catalog record.

Kept out of the index

Each row is excluded twice, and the two halves do different jobs: a Disallow rule in robots.txt asks a crawler not to fetch the URL, and a robots: index: false tag on the page itself is what keeps it out of the index. Until this batch the second half was missing on five of these surfaces, which is the trap the table exists to expose.

/adminrobots.txtnoindex

A local demo console. Nothing there is content, and an indexed admin would be an invitation.

/searchrobots.txtnoindex

Result pages are queries, not pages: thousands of near-identical permutations with no standalone value.

/savedrobots.txtnoindex

Your saved list is browser-local — a crawler would index an empty page and call it content.

/saved/stackrobots.txtnoindex

A recipe link is meant to be shared between people, not harvested; the route is noindex as well.

/habitsrobots.txtnoindex

Streaks and check-ins are empty without local storage.

/embed/robots.txtprefix rule

Embeds are for other people's iframes, and would compete with the real detail pages.

/api/exports/robots.txtprefix rule

Files and JSON are for tools, not for the index.

/digestrobots.txtnoindex

The weekly digest is dated and duplicated by the components and prompts it points at.

Why publish the exclusion list

A noindex rule is invisible by design, which makes it easy to apply too broadly and never notice. Printing the list next to the reason turns it into a decision someone can disagree with — and the counts above make it obvious when a group is missing entirely, which is the failure mode that actually costs traffic. That is not hypothetical here: the audit that produced this batch found the studio log, the brand pages, /perf/*, /pro/*, /integrations/*, /community/* and two tool pages rendered indexable and absent from the sitemap, because the sitemap was written by hand and nothing compared it with the build. The harness now walks every built page and fails if an indexable one is unlisted, or if an excluded one has no noindex tag.

Structured data has its own register on /quality/schema, including the types this site refuses to emit.