feat(seo): announce robosystems.ai's new URLs to IndexNow - #418
Conversation
Bing has crawled nothing under /docs three days after the docs launched. Its Site Explorer folder tree for this site holds research, pages and blog and no docs node, and the newest crawl date on any root page is 15 Sep, while its sitemap read on 9/19 saw 295 URLs against a live file of 375. The sitemap is the passive half; IndexNow is the half that pushes, and one POST reaches Bing — and through it Copilot and DuckDuckGo — plus Yandex, Seznam, Naver and Yep in minutes. Google ignores it. The work is in the shared indexnow-ping action; here it is a key file, a schedule and the host. The schedule is deliberate rather than a deploy hook: this site's pages come from three places, and only one of them is a deploy of this app. The guides and technical docs publish from the robosystems repo to S3 and arrive through an hourly revalidate, and the API and GraphQL references follow the live spec the same way. Diffing the live sitemap catches all three; a hook would catch one. The key is public by design — the same value is served at the host root, which is how IndexNow verifies we own the host — so it is a repository variable, not a secret, and the file is committed rather than templated. The filename and the contents are the same string in two places, so a test asserts they match: nothing at runtime notices when they drift, the submissions just start failing validation while the workflow stays green.
|
Change classification: normal — platform or application code changed. A normal change carries a documented automated review on this pull request before merge, in place of a second human approver. The |
|
@claude please review this PR |
|
Claude finished @jfrench9's task in 1m 24s —— View job Review
This is a clean, well-scoped change — three files, no surprises, and the PR description does the hard work of explaining why each piece exists. What's solid:
Minor, non-blocking notes:
Nothing here blocks merge. Nice attention to the "silent failure" mode with the filename/content test — that's the right thing to guard in CI rather than discover three hours after a deploy. Note: I wasn't able to execute the test suite or fetch |
Why
Bing has crawled nothing under
/docs, three days after the docs launched. Its Site Explorer folder tree for this site holdsresearch,pagesandblog— nodocsnode — and the newest crawl date on any root page is 15 Sep. Its sitemap was read on 9/19 at 295 URLs against a live file of 375.The sitemap is the passive half: it says what exists and waits. IndexNow is the half that pushes — one POST and Bing, and through it Copilot and DuckDuckGo, plus Yandex, Seznam, Naver and Yep know within minutes. Google ignores the protocol.
What's here
The work is in the shared action. This is a key file, a schedule and the host.
The schedule is deliberate, not a deploy hook. This site's pages come from three places and only one is a deploy of this app: the guides and technical docs publish from the robosystems repo to S3 and arrive through an hourly revalidate, and the API and GraphQL references follow the live spec the same way. A
workflow_runhook on Deploy Production would catch one of the three. Diffing the live sitemap every three hours catches all of them, and a run with nothing new submits nothing.The key is public by design — the same value is served at the host root, which is how IndexNow verifies we own the host. So it is a repository variable (
INDEXNOW_KEY, already set), not a secret, and the file is committed rather than templated.public/<key>.txtships in the image; the Dockerfile already copiespublic/.A test asserts the filename and the contents match. They are the same string in two places and nothing at runtime notices when they drift — the submissions just start failing key validation while the workflow stays green. The action checks the served file before submitting; this checks the file we ship, so a typo fails in CI rather than three hours after a deploy.
Verified
POST https://api.indexnow.org/indexnowwith this host and key returns HTTP 202 — accepted, key validation pending, which is correct for a key not yet served. It validates once this deploys.npm run test:allgreen: 71 files, 583 tests, format, lint, typecheck, cf-lint.After merge
The first run has no snapshot, so it announces all 375 URLs — which is the intent right now. Every run after that sends only what appeared. Worth watching the first scheduled run's summary to confirm the key verifies.
Not done here: the other four hosts. Each needs its own key, since the key file proves ownership of the host serving it, so porting is a key file plus this workflow per repo.
🤖 Generated with Claude Code