# ScreenMocks — https://www.screenmocks.com # # Everything is crawlable on purpose. Every indexable route is prerendered to # static HTML at build time (scripts/prerender.mjs), so the raw HTML carries # each page's real head and content; the signed-in app is still client-rendered # and Googlebot has to execute the JS bundles to see it. Vite serves those from # /assets/ — the same prefix as the signed-in /assets route — so a # "Disallow: /assets" would block the app from rendering at all. # # The signed-in surfaces (/projects, /favorites, /assets, /settings, /admin) are # kept out of the index with a `noindex, follow` meta tag instead, written per # route by src/seo/seo.ts. That is the correct tool here: a page blocked in # robots.txt is never fetched, so its noindex is never read, and it can still be # indexed URL-only from an inbound link. User-agent: * Allow: / Disallow: /api/ # AI crawlers are welcome. A condensed, link-first summary of the whole site # lives at /llms.txt, with the full text at /llms-full.txt. # # ScreenMocks also runs a remote MCP server. The page describing it is # /mcp; the machine-readable manifest (endpoint, transport, authentication and # every tool) is at /mcp.json and /.well-known/mcp.json. Both are generated by # scripts/gen-seo.mjs from the real tool list, never hand-written. User-agent: GPTBot Allow: / User-agent: OAI-SearchBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: ClaudeBot Allow: / User-agent: Claude-User Allow: / User-agent: Claude-SearchBot Allow: / User-agent: PerplexityBot Allow: / User-agent: Google-Extended Allow: / User-agent: Applebot-Extended Allow: / Sitemap: https://www.screenmocks.com/sitemap.xml # Articles published into the blog after the last deploy. sitemap.xml is # generated at build time from the posts in the bundle, so it structurally # cannot list them; this one is served live from the store that holds them # (functions/src/blogIngest.ts, routed by vercel.json). Sitemap: https://www.screenmocks.com/blog-sitemap.xml