# FatPitches — marketing pages are crawlable; the authenticated app is not. # # Two lines, because the app owns exactly two prefixes (shared/appPaths.ts). # This used to enumerate /app, /admin, /api and /login while the SPA also served # /settings, /screener, /portfolio and /allocator at 200 — four authenticated # routes crawlable in production, because the list here drifted from the list in # the router and nothing failed loudly. A prefix cannot drift from itself. # # The PUBLIC pages the SPA renders — /is-it-cheap/ and the position-size # calculator — are deliberately NOT disallowed: they are indexable marketing # surfaces that happen to be React, which is why they live outside /app. User-agent: * Disallow: /app Disallow: /api # AI training and answer-engine crawlers. These pages are written to be READ by # an investor deciding a position size, not harvested into a corpus. # # THE TRADE-OFF, stated so it is a decision and not a default: this costs the # referral traffic answer engines now send, and it is the opposite bet to the # "explore MCP for Claude/ChatGPT" line in the strategy notes phase 3. Both are # reversible — deleting a block here re-opens the door the same day. Google's # ordinary search crawler (Googlebot) is deliberately NOT blocked; only # Google-Extended, which governs AI training and nothing about ranking. # User-agent: GPTBot # Disallow: / # User-agent: OAI-SearchBot # Disallow: / # User-agent: ChatGPT-User # Disallow: / # User-agent: ClaudeBot # Disallow: / # User-agent: Claude-Web # Disallow: / # User-agent: anthropic-ai # Disallow: / # User-agent: PerplexityBot # Disallow: / # User-agent: CCBot # Disallow: / # User-agent: Bytespider # Disallow: / # User-agent: Google-Extended # Disallow: / # User-agent: Applebot-Extended # Disallow: / # User-agent: meta-externalagent # Disallow: / Sitemap: https://fatpitches.com/sitemap-index.xml # Per-ticker /is-it-cheap/ pages. Listed separately because the set is decided in # the database (admin-curated), so Astro's build-time sitemap integration cannot # know about it — this one is generated per request from the enabled rows. Sitemap: https://fatpitches.com/sitemap-share-pages.xml # Per-ticker /sizing/ position-sizing pages. Listed separately for the same reason as # the line above, though the set is decided by DATA rather than by an admin: a ticker # gets a page exactly when the nightly refresher can compute a downside floor for it # (api/routes/sizing-pages.ts). Sitemap: https://fatpitches.com/sitemap-sizing.xml # Articles. Unlike the two above, this one IS built by Astro — posts are a content # collection now (landing/src/content.config.ts, fed by scripts/blog-fetch.ts), so # the URLs are known at build time. It stays a separate file rather than joining # sitemap-index.xml because it is a custom endpoint, which also keeps sitemap-0.xml # free of blog URLs so the two deployables never both claim the same article. Sitemap: https://fatpitches.com/sitemap-blog.xml