feat(seo): serve the IndexNow key file on grabcaramel.com - #235
Open
BSalaeddin wants to merge 1 commit into
Open
BSalaeddin wants to merge 1 commit into
BSalaeddin wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Serve an IndexNow host-ownership key file on grabcaramel.com:
apps/caramel-app/src/lib/seo/indexnow.ts—INDEXNOW_KEY(d5c0ad54cc4dc724a423fa3e9d273f7f),INDEXNOW_KEY_PATH, andindexNowKeyResponse()(body = the key verbatim,text/plain; charset=utf-8,Cache-Control: public, max-age=86400). Doc comment covers what IndexNow is, why the key is intentionally public (it only proves control of the host), and that submission is done by the SEO owner via the fleet seo-mcp (indexing_submit method=index_now), never from the app.apps/caramel-app/src/app/d5c0ad54cc4dc724a423fa3e9d273f7f.txt/route.ts— the literal<key>.txtroute folder (same family assrc/app/llms.txt/route.ts; deliberately notwithRoute, which owns/api). Serveshttps://grabcaramel.com/d5c0ad54cc4dc724a423fa3e9d273f7f.txt.apps/caramel-app/tests/unit/indexnow-key-file.test.ts— CI pin: key matches IndexNow's[A-Za-z0-9-]{8,128}shape; asrc/app/<INDEXNOW_KEY>.txt/route.tsfolder exists, is the ONLY hex-key.txtroute (no stale twin after a rotation), and imports the constant; the response is 200 /text/plain; charset=utf-8/max-age=86400with the key as the whole body;INDEXNOW_KEY_PATH === /<key>.txt.apps/caramel-app/e2e/seo-regression.spec.ts— one new ungated (deployment-safe) test:GET /<key>.txt→ 200,text/plain, trimmed body ===INDEXNOW_KEY. Imports the constant relatively (../src/lib/seo/indexnow) — the module is alias-free and env-free on purpose, since Playwright specs do not resolve the@/alias.No change to
robots.ts(the path is not disallowed) and the key is NOT added to the sitemap.Why
IndexNow is the legitimate push channel (Bing, Yandex, Seznam, Naver) for the 4,000+ per-store
/coupons/<store>pages that Google/Bing are slow to discover organically. The protocol validates a submission by fetchinghttps://<host>/<key>.txtand comparing the body to the submitted key, so the site must serve that file before any URL can be pushed. Context:C:\Users\alaed\Documents\Github\caramel-artifact\seo-2026-09-11(SEO program artifact dir). Reference shape: BioFlow PR #241.This PR submits nothing to any engine. It only serves the ownership proof. Fresh key generated for this project (
node -e "crypto.randomBytes(16).toString('hex')"); never reused from another project.Verification done (local, worktree
C:\wt-caramel-indexnow)Dotted App Router folder segment confirmed to serve (no
public/fallback needed).next dev -p 58000with the CI dummy.env, then:Server log:
GET /d5c0ad54cc4dc724a423fa3e9d273f7f.txt 200 in 3.5s. Server stopped afterwards (port 58000 listeners after kill: 0).Gates (turbo ones with
--force, since the turbo cache is shared across worktrees):Noise ruled out, not hand-waved:
three-lazy-boundaryanduserInitialfirst showedTest timed out in 5000msunder load; rerun with my files present they pass in 1.2s, and a control with my files stashed behaves identically (raw walk+read ofsrc= 250ms). Full-repopnpm test --forceadditionally reds 7 tests inapps/caramel-extension, which this branch does not touch (git diff origin/main -- apps/caramel-extensionis empty) — pre-existing/environmental by construction, and out of this PR's gate (pnpm --filter caramel-app test).What CI covers
tests/unit/indexnow-key-file.test.tspins folder name ↔ constant ↔ body on every PR.e2e/seo-regression.spec.tsfetches the live path in both e2e contexts (hermetice2e-prand deployede2e-push), so a deploy that stops serving the file goes red.Owner note
After this deploys, the SEO owner submits URL changes via the fleet seo-mcp (
indexing_submit method=index_now, keyd5c0ad54cc4dc724a423fa3e9d273f7f, key locationhttps://grabcaramel.com/d5c0ad54cc4dc724a423fa3e9d273f7f.txt). Nothing is submitted by this PR. Do not merge on my behalf.🤖 Generated with Claude Code