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