User-agent: * Allow: / # Dynamic SPA routes — app shell, no per-route content, ephemeral state. # Keep crawlers off them so they don't: # - Burn crawl budget rendering the same app shell over and over # - Index a room/game URL whose content depended on transient socket state # - Treat /lobby as a near-duplicate of / (both render the same OG defaults) # # Per-route belt-and-suspenders also lives in src/router/index.js — the # router injects on every # route marked meta.noindex. robots.txt blocks crawl; the meta tag blocks # index even if a link is followed in from elsewhere. "follow" (not # nofollow) keeps link equity flowing to the indexable surfaces (/, /games/...). # # /join/ is intentionally NOT blocked at the robots.txt layer — # WhatsApp / FB / Twitter unfurl bots ignore robots.txt anyway, and the # per-game OG preview only fires when they fetch the URL. The route-level # noindex still keeps Googlebot from indexing the page if it does crawl in. Disallow: /lobby Disallow: /room/ Disallow: /game/ Disallow: /sar-pe-filmy Disallow: /login # Admin surfaces — never indexable. The admin handlers (server/lib/admin-auth.js, # server/lib/stats-dashboard.js) also ship # inline, so this is belt-and-suspenders. Disallow: /admin # Indexable surfaces: # / — homepage (prerendered) # /games// — per-game marketing pages (hand-authored OG + # structured data + FAQ schema) # /legal/ — privacy + terms # All listed in the sitemap. Sitemap: https://desiparty.games/sitemap.xml