One-liner
The site has no robots.txt and no sitemap. Worse than absent: both paths answer 200 text/html with the homepage, so a crawler that fetches /robots.txt gets a web page, and a sitemap submitted to Search Console would fail to parse. 403 doc pages have nothing telling a search engine they exist.
Measured (production, 2026-08-25)
$ curl -s -o /dev/null -w "%{http_code} %{content_type}\n" https://objectstack.ai/robots.txt
200 text/html; charset=utf-8
$ curl -s -o /dev/null -w "%{http_code} %{content_type}\n" https://objectstack.ai/sitemap.xml
200 text/html; charset=utf-8
$ curl -s https://objectstack.ai/robots.txt | head -c 60
<!DOCTYPE html><html data-dpl-id="dpl_3Yii…
apps/docs/app/ contains no robots.ts and no sitemap.ts; apps/docs/public/ holds only logo.svg and hero-cover-dark.png.
Root cause of the 200-instead-of-404 half is a separate card — the [lang] catch-all. Fixing this one does not fix that one, and vice versa.
Expected
apps/docs/app/robots.ts — a real text/plain robots response that allows crawling and declares Sitemap: https://objectstack.ai/sitemap.xml.apps/docs/app/sitemap.ts — every indexable URL: /, /docs/** (403 pages, from source.getPages()), and the blog. lastModified should come from a real signal (git mtime of the source .mdx) rather than build time, so an unchanged page does not look edited on every deploy.- Both must use the canonical origin
https://objectstack.ai, taken from one shared constant, not hardcoded twice.
Acceptance
Source
Found in an SEO review of the docs site (apps/docs) run on 2026-08-25, measured against the local dev server and against production. The canonical origin is https://objectstack.ai — maintainer ruling recorded in #10659:
这个仓的文档站规范 URL 是 https://objectstack.ai
One-liner
The site has no
robots.txtand no sitemap. Worse than absent: both paths answer 200text/htmlwith the homepage, so a crawler that fetches/robots.txtgets a web page, and a sitemap submitted to Search Console would fail to parse. 403 doc pages have nothing telling a search engine they exist.Measured (production, 2026-08-25)
apps/docs/app/contains norobots.tsand nositemap.ts;apps/docs/public/holds onlylogo.svgandhero-cover-dark.png.Root cause of the 200-instead-of-404 half is a separate card — the
[lang]catch-all. Fixing this one does not fix that one, and vice versa.Expected
apps/docs/app/robots.ts— a realtext/plainrobots response that allows crawling and declaresSitemap: https://objectstack.ai/sitemap.xml.apps/docs/app/sitemap.ts— every indexable URL:/,/docs/**(403 pages, fromsource.getPages()), and the blog.lastModifiedshould come from a real signal (git mtime of the source.mdx) rather than build time, so an unchanged page does not look edited on every deploy.https://objectstack.ai, taken from one shared constant, not hardcoded twice.Acceptance
curl -sI https://objectstack.ai/robots.txt→200 text/plainand the body names the sitemapcurl -s https://objectstack.ai/sitemap.xml | head -1→ an XML declaration, not HTMLfind content/docs -name '*.mdx' | wc -lplus the non-docs routesobjectstack.aiSource
Found in an SEO review of the docs site (
apps/docs) run on 2026-08-25, measured against the local dev server and against production. The canonical origin ishttps://objectstack.ai— maintainer ruling recorded in #10659: