Repository navigation
improvement(seo): fix soft 404s, per-integration freshness, and docs markdown for AI crawlers - #9006
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
There was a problem hiding this comment.
All reported issues were addressed across 48 files
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
|
a819827 to
8bf9725
Compare
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
All reported issues were addressed across 57 files
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
…markdown for AI crawlers
… pages no longer use
…tiable, and harden the crawler suite
8bf9725 to
d6e1969
Compare
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
Summary
Technical SEO / GEO fixes for www.sim.ai and docs.sim.ai, found by crawling both sites the way search and AI crawlers do. No content was rewritten.
www.sim.ai
/integrations/*,/library/*,/blog/*,/models/*, and author slugs return 200 with contradictoryindex, follow+noindexmetas. fix(landing): return 404 for unknown library, blog, integration, model, and author slugs #8587'sdynamicParams = falseonly works when the route is prerendered. The production image is built with a placeholderNEXT_PUBLIC_APP_URL, so it takes theRuntimePublicEnvScriptpath and renders every route dynamically. There, theloading.tsxSuspense boundary commits a 200 before the page'snotFound()runs. fix(landing): return 404 for unknown library, blog, integration, model, and author slugs #8587 was verified on a hosted-URL build, which hid this.loading.tsxfrom the slug segments.(index)route group, so the index pages keep them.(landing)/CLAUDE.md./integrations/google_drive, linked with docs-style slugs) 308 to the hyphenated page.updatedAtstamped every integration's sitemaplastmod, JSON-LDdateModified, and visible "Last updated" line. Every regen moved all 272 dates even when one entry changed.integrations.jsonentry carries its ownupdatedAt, whichscripts/generate-docs.tskeeps until that entry's content changes./integrationshub./pricing, which now declares the canonical#softwarenode.#software, the solutions/platform pages, comparisons, blog/library publishers, and the docs publisher now reference#organization/#softwareinstead of minting separate entities.datePublished.Vary: User-Agentthat Next always overwrote.docs.sim.ai
/llms.mdx/*and.mdx. They now serve the same markdown as the page's "Copy page" action. They stay out ofllms-full.txt, at ~40 KB of resolved schema each.llms-full.txtgoes from 23.4 MB to 12.6 MB. The processed-markdown serializer padded every table cell to its column's widest cell (one timezone enum padded the whole Plane page to 3 MB), and that padding is now collapsed. No content was removed.Accept: text/markdownreturned HTML: the proxy pattern was/docs/*path, but docs live at the root./<page>.mdURLs (they currently return 500 on main and 404 on staging).<link rel="alternate" type="text/markdown">.lastmod. Vercel clones--depth=10andsource.config.tscorrectly refuses to date pages from a shallow clone, so the docs sitemap shipped with no dates. The build now fetches commit history first (--filter=blob:none, commits and trees only). It runs only on Vercel, and on failure it logs and ships undated, as today./introduction.Not included (decisions, not code): publishing the draft customer stories, pricing/enterprise FAQ copy, and edge caching for the dynamic marketing pages.
Type of Change
Testing
scripts/test-landing-seo-e2e.ts. It crawls the app as a crawler does (statuses, robots, sitemap, JSON-LD, links), with 10 checks, and writes a JSON report. It runs in thee2e-mobilejob against the production-mode build (next starton the placeholder-URL build, so every route is dynamic, matching production). It only issues GETs, so it can also be pointed at a deployed origin.bun run check:docsreports the backfilledintegrations.jsonunchanged. Mutating one block's description and regenerating re-dated only that entry (plus the catalog date); the other 271 kept theirs.llms-full:generatelocally:countTableRows..md, redirects, and sitemap dates are to be verified on this PR's Vercel preview.Checklist