# PatchDesign.AI - robots.txt # # !! WHAT SHIPS IS NOT WHAT IS IN THIS FILE. !! # Cloudflare's managed robots.txt is currently ON for this zone, so the edge # PREPENDS a "# BEGIN Cloudflare Managed content" block ahead of everything # below. That block Disallows GPTBot, ClaudeBot, Google-Extended, Amazonbot, # Applebot-Extended, meta-externalagent, CCBot and Bytespider, and stamps # "Content-Signal: search=yes,ai-train=no,use=reference" on User-agent: *. # Every one of those bots is then Allowed again further down this file, so the # served file contradicts itself and the outcome depends on each crawler's # tie-breaking. RFC 9309 says merge duplicate groups and prefer Allow on an # equal-length tie, which is how Google behaves, but nothing guarantees the # rest do. Verified 2026-08-24: nothing is blocked at the network layer - every # one of those user agents gets a 200 - so this is advisory conflict only. # # The fix is NOT in this file. Turn the feature off at: # Cloudflare dashboard > patchdesign.ai zone > Overview > Control AI Crawlers # > turn off managed robots.txt (and "Display Content Signals Policy") # Leave it off. Re-enabling it silently re-introduces the contradiction above. # shirt-tucker.com does not have it enabled, which is why the two zones differ. User-agent: * Disallow: /embed Disallow: /api/ # /my-designs, /admin and /dashboard are NOT listed here on purpose # (Aug 19 2026). They used to be, and all three ended up in Google's index # anyway — GSC's "Indexed, though blocked by robots.txt", 3 pages, last # crawled Aug 5 / Jun 12 / Jun 26. That state is worse than either # alternative: Google keeps the URL, can't read the page, and invents the # snippet. # # The cause is that noindex only works if the crawler is allowed to FETCH the # page and see it. A Disallow actively PREVENTS deindexing. So the three are # crawlable here and carry noindex,follow instead — emitted into the served # HTML by prerender.mjs and again by useSEO after hydration, because Googlebot # renders JS and whichever runs last is what counts. # # Do not "tidy" these back into the list. If a surface must never be fetched, # the answer is auth, not robots.txt — every one of these already requires a # secret, a token, or a signed-in session to show anything. # Token-gated / transactional surfaces — no index value, often error # without a valid signed token. (May 29 2026 SEO sweep.) Note: /org-design # and /org-signup are intentionally NOT blocked — they're public funnel # landings we want indexed. /org/ (trailing slash) blocks only the private # org dashboards, not those. Disallow: /order Disallow: /pay Disallow: /produce Disallow: /ship Disallow: /queue Disallow: /track Disallow: /artwork Disallow: /my-orders Disallow: /transcript Disallow: /org/ Disallow: /org-approve # /unsubscribe is the email preference center. It's not prerendered, so the # served shell carries the site-wide index,follow meta until React swaps in # noindex — this line is the crawler-side guarantee that never depends on JS. Disallow: /unsubscribe Sitemap: https://patchdesign.ai/sitemap.xml Sitemap: https://patchdesign.ai/image-sitemap.xml # ─────────────────────────────────────────────────────────── # AI crawlers & answer engines — ALLOW (we WANT to be in AI chats) # These bots power ChatGPT / Claude / Perplexity / Gemini search # ─────────────────────────────────────────────────────────── User-agent: GPTBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: OAI-SearchBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: ChatGPT-User Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: ClaudeBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Claude-Web Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: anthropic-ai Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: PerplexityBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Perplexity-User Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Google-Extended Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Applebot-Extended Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Amazonbot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: DuckAssistBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Meta-ExternalAgent Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ # ─────────────────────────────────────────────────────────── # Social-link-preview scrapers — explicitly ALLOW so OG meta # tags are reachable when users paste our URL into chat apps, # Facebook/LinkedIn/Twitter posts, Slack, WhatsApp, etc. These # bots need read access to /; without an explicit rule they # fall under the User-agent:* catchall, but FB has been known # to interpret the FacebookBot Disallow below as applying to # facebookexternalhit too (returned 403 Forbidden in the FB # Sharing Debugger). The explicit rules remove the ambiguity. # Apr 28 2026. # ─────────────────────────────────────────────────────────── User-agent: facebookexternalhit Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: facebookcatalog Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Twitterbot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: LinkedInBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Slackbot-LinkExpanding Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Slackbot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: WhatsApp Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: TelegramBot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: Discordbot Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ User-agent: SkypeUriPreview Allow: / Disallow: /my-designs Disallow: /embed Disallow: /admin Disallow: /dashboard Disallow: /api/ # ─────────────────────────────────────────────────────────── # Bulk scrapers — block (no benefit, high bandwidth cost) # ─────────────────────────────────────────────────────────── User-agent: CCBot Disallow: / User-agent: Bytespider Disallow: / User-agent: Diffbot Disallow: / User-agent: Omgili Disallow: / User-agent: FacebookBot Disallow: / User-agent: SemrushBot Disallow: / User-agent: AhrefsBot Disallow: / User-agent: MJ12bot Disallow: /