Skip to content

fix(seo): robots.txt, noindex, JSON-LD, sitemap drift check, keywords, README badges#358

Merged
duyet merged 6 commits into
mainfrom
claude/w11-seo-readme
Jul 17, 2026
Merged

fix(seo): robots.txt, noindex, JSON-LD, sitemap drift check, keywords, README badges#358
duyet merged 6 commits into
mainfrom
claude/w11-seo-readme

Conversation

@duyet

@duyet duyet commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add robots.txt with Disallow: /dashboard, /oauth, and a Sitemap: pointer — previously the SPA fallback silently served index.html for /robots.txt.
  • Add a noindex prop (default true) to RootLayout.astro, which is exclusively used by DashboardLayout.astro (every dashboard/* route + oauth/consent), so <meta name="robots" content="noindex, nofollow"> now covers all auth-gated app shells.
  • Add SoftwareApplication + Organization JSON-LD to the marketing homepage (index.astro).
  • Add <lastmod> to sitemap.xml and a new scripts/check-sitemap.mjs (wired into ci.yml) that fails CI if a public marketing page under src/pages/ has no matching sitemap entry.
  • Add keywords to packages/sdk/package.json (+ patch bump to 0.1.4 so publish-sdk.yml ships it) and keywords/classifiers to packages/python-sdk/pyproject.toml (bumped to 0.1.2 — note there's no automated PyPI publish workflow in this repo, so that bump only takes effect on the next manual publish).
  • Add CI/npm/PyPI badges to README.md alongside the existing License/PRs-welcome badges.

Closes #307, #308, #310, #311, #313, #314

Skipped (need real image assets, out of scope for this PR):

Test plan

  • bunx biome check packages/api/src/ — pre-existing failure in validation.ts confirmed unrelated (no diff vs main for that file)
  • bunx tsc --noEmit -p packages/api/tsconfig.json — passes
  • bun scripts/check-sitemap.mjs — passes, confirms all 3 marketing routes covered
  • Dashboard build intentionally skipped per project convention (OOM risk in parallel agents) — to be verified after merge

duyet and others added 6 commits July 17, 2026 08:53
The Workers asset binding's SPA fallback silently served index.html for
/robots.txt since the file never existed, giving crawlers no crawl
directives and hiding the sitemap location.

Closes #307

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
RootLayout (used only by DashboardLayout, which every dashboard/* route
and oauth/consent render) had no robots meta tag, so Clerk-gated app
shells could be indexed and shown as blank/broken search results.

Closes #308

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
Add SoftwareApplication and Organization schema.org JSON-LD to the
marketing homepage, making the site eligible for rich results.

Closes #310

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
Add <lastmod> to the hand-maintained sitemap.xml, and add
scripts/check-sitemap.mjs (wired into ci.yml) to fail the build if a
new public marketing page is added under src/pages without a matching
sitemap entry.

Closes #314

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
Add npm keywords to @agentstate/sdk and PyPI keywords/classifiers to
the Python package so both surface in registry search (npmjs.com,
pypi.org) for terms like "agent memory" and "langgraph checkpoint".
Bump the TS SDK patch version so publish-sdk.yml actually ships it.

Closes #311

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
Surface the existing ci.yml status plus the published @agentstate/sdk
and agentstate PyPI versions as badges alongside the existing
License/PRs-welcome row.

Closes #313

Co-Authored-By: Duyet Le <me@duyet.net>
Co-Authored-By: duyetbot <bot@duyet.net>
@gemini-code-assist

Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @duyet, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@duyet, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 49 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 72d955cd-5808-417c-a591-e0050abbbe70

📥 Commits

Reviewing files that changed from the base of the PR and between aaf05ac and e34f305.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • .github/workflows/ci.yml
  • README.md
  • packages/dashboard/public/robots.txt
  • packages/dashboard/public/sitemap.xml
  • packages/dashboard/src/layouts/RootLayout.astro
  • packages/dashboard/src/pages/index.astro
  • packages/python-sdk/pyproject.toml
  • packages/sdk/package.json
  • scripts/check-sitemap.mjs
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/w11-seo-readme

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@duyet
duyet merged commit 2657e5d into main Jul 17, 2026
6 checks passed
@duyet
duyet deleted the claude/w11-seo-readme branch July 17, 2026 03:40
duyet added a commit that referenced this pull request Jul 17, 2026
PR #356 restored the comparison page (compare.astro) but the sitemap
drift check added in #358 fails CI because /compare is missing from
sitemap.xml. Add the entry so main + dependents go green.

Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

seo: no robots.txt — missing static file is masked by SPA 200 fallback

1 participant