Skip to content

Expand search and answer-engine discovery - #8339

Merged
lawrencecchen merged 10 commits into
mainfrom
feat-search-discovery-aeo
Jul 17, 2026
Merged

lawrencecchen merged 10 commits into
mainfrom
feat-search-discovery-aeo

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jul 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary:

  • make Next.js rendering assets crawlable and explicitly allow search-oriented AI crawlers
  • publish an RSS feed with homepage autodiscovery and remove stale Base variants from llms.txt
  • submit recently modified sitemap URLs to IndexNow once after each successful production deployment

Why:

  • DuckDuckGo relies heavily on Bing, so the existing Bing and IndexNow path covers it
  • Yandex supports both sitemap discovery and IndexNow
  • explicit crawler groups make ChatGPT, Claude, and Perplexity search access auditable

Tests:

  • bun test tests/seo.test.ts tests/agent-page-variants.test.ts tests/search-discovery.test.ts
  • bun run typecheck
  • bunx eslint on changed web files
  • live local checks for /, auth handlers, /robots.txt, /llms.txt, /feed.xml, and /api/cron/indexnow

Dogfood tag: aeoseo


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Expand search and answer‑engine discovery with localized RSS feeds, open crawl access, and IndexNow submissions on a daily cron and after production deploys. The root feed mirrors the default locale for consistent canonical URLs and metadata; improves indexing across Bing/DuckDuckGo and Yandex.

  • New Features

    • Robots: explicitly allow OAI/ChatGPT, Claude, and Perplexity bots; keep all pages crawlable; do not block /_next.
    • RSS: publish /feed.xml (default locale) and /<locale>/feed.xml; add a localized <link rel="alternate" type="application/rss+xml"> in <head> with translated labels; set Content-Language; per‑locale canonical blog URLs.
    • IndexNow: authenticated endpoint submits recently modified sitemap URLs; runs daily and after production deploys via GitHub Actions; 10s timeout; max 10k URLs; 48h lookback anchored to the newest sitemap change and ignores future‑dated entries; resilient error handling.
    • Content cleanup: remove stale /docs/base from llms.txt; add an “Updates” link to the RSS feed.
    • Tests: cover robots rules, localized RSS output, IndexNow payload/selection/timeout/size bounds, and unauthorized trigger handling.
  • Migration

    • Set CRON_SECRET for the /api/cron/indexnow endpoint in Vercel. Configure a GitHub repository secret INDEXNOW_TRIGGER_SECRET with the same value for the workflow trigger.
    • Ensure the IndexNow key file is hosted at https://cmux.com/82cc8125a8624a4db9e07502db0b7d46.txt.

Written for commit b21a24a. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added locale-aware RSS feeds (global and per-locale) with locale-correct headers and an RSS alternate link in the page header.
    • Implemented IndexNow end-to-end via a secured cron endpoint and scheduled submissions for recently updated URLs.
    • Updated RSS/robots behavior for improved SEO and localized feed metadata.
  • Bug Fixes
    • Removed outdated /docs/base variant links from agent-readable outputs.
  • Refactor
    • Centralized i18n message loading with reusable deep-merge logic.
  • Tests
    • Expanded coverage for RSS generation, IndexNow payload/submission, sitemap recency windows, agent variants, SEO/robots, and search discovery.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The changes add localized RSS feeds and discovery links, introduce scheduled IndexNow submission for recently modified sitemap URLs, centralize message loading, update crawler permissions, and adjust agent-readable page metadata.

Changes

Search discovery

Layer / File(s) Summary
RSS feed generation and exposure
web/app/[locale]/components/blog-posts.ts, web/app/lib/blog-feed.ts, web/app/lib/localized-blog-feed.ts, web/app/[locale]/feed.xml/route.ts, web/app/feed.xml/route.ts, web/app/layout.tsx, web/i18n/*, web/tests/search-discovery.test.ts
Exports the BlogPost type, centralizes locale message loading, generates escaped localized RSS 2.0 XML, serves default and non-default locale feeds, links feeds from the layout, and tests feed output.
IndexNow selection and scheduled submission
web/app/lib/indexnow.ts, web/app/api/cron/indexnow/route.ts, web/vercel.json, web/tests/search-discovery.test.ts
Filters recently modified sitemap URLs, builds and submits IndexNow payloads, authorizes the cron route, handles empty and failed submissions, and schedules the route.
Crawler and agent-readable metadata
web/app/robots.ts, web/tests/seo.test.ts, web/app/lib/agent-page-paths.ts, web/tests/agent-page-variants.test.ts
Allows named crawlers and wildcard access, removes the base docs variant, advertises the RSS updates feed, and verifies the resulting metadata.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Cron
  participant IndexNowRoute
  participant Sitemap
  participant IndexNowHelpers
  participant IndexNowEndpoint
  Cron->>IndexNowRoute: Authorized GET request
  IndexNowRoute->>Sitemap: Select recently modified URLs
  IndexNowRoute->>IndexNowHelpers: Build and submit payload
  IndexNowHelpers->>IndexNowEndpoint: POST IndexNow JSON
  IndexNowEndpoint-->>IndexNowRoute: Return submission status
Loading

Possibly related PRs


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 2 warnings)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error web/app/lib/indexnow.ts:16-31 scans the sitemap 4 times and spreads entries into Math.max, making recentlyModifiedUrls unsafe for up to 50k URLs. Rewrite recentlyModifiedUrls as a single pass that tracks the newest valid timestamp and collects qualifying URLs without spread or repeated full scans.
Cmux Full Internationalization ❌ Error FAIL: buildLlmsText() adds hardcoded English - Updates: and the locale RSS route returns a literal "Not found"; both bypass locale messages. Translate the llms bullet and 404 response via next-intl (or a locale-specific error path) and add matching entries for every supported locale.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description includes summary and tests, but misses several required template sections like Demo Video, Review Trigger, and Checklist. Add the missing template sections: Why, Demo Video link or attachment, Review Trigger block, and the Checklist items; keep Summary and Testing.
✅ Passed checks (21 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The diff only changes TypeScript files; no Swift production code was introduced or modified, so actor-isolation rules aren’t implicated.
Cmux Swift Blocking Runtime ✅ Passed No Swift files changed in the PR diff; the modified files are TypeScript only, so the Swift blocking-runtime rule is not applicable.
Cmux Browser Automation Off-Main ✅ Passed PASS: PR only changes web RSS/IndexNow files and tests; no browser automation commands, WebKit/AppKit hops, or routing policy changes are touched.
Cmux Expensive Synchronous Load ✅ Passed The PR diff only changes TypeScript test/app files; no Swift code or Swift agent-history load paths are introduced.
Cmux Cache Substitution Correctness ✅ Passed No persistence/history/undo/snapshot path replaces a fresh read with cached data; the new code reads sitemap/messages directly.
Cmux No Hacky Sleeps ✅ Passed No fixed sleeps or polling were added; the only timing change is AbortSignal.timeout, a bounded cancellation-aware timeout with test coverage.
Cmux Swift Concurrency ✅ Passed The diff touches only web TypeScript files; no Swift code or concurrency patterns were introduced or expanded.
Cmux Swift @Concurrent ✅ Passed PASS: The PR diff only changes TypeScript web files; no Swift files or concurrency annotations are involved, so the Swift-specific rule is not applicable.
Cmux Swift Package Boundaries ✅ Passed PASS: The PR diff contains no Swift files or Package.swift changes, so the Swift package-boundary rule is not applicable.
Cmux Swiftpm Lockfiles ✅ Passed The PR only changes web/app/lib/indexnow.ts and web/tests/search-discovery.test.ts; no SwiftPM/Xcode/.gitignore/workflow/dependency files are touched.
Cmux Swift Logging ✅ Passed The PR diff only changes web/TypeScript files; no Swift runtime code or Swift logging calls were added or modified.
Cmux User-Facing Error Privacy ✅ Passed The new API responses are generic (unauthorized/indexnow_submit_failed/Not found) and don't expose vendor names, secrets, or upstream details.
Cmux Swiftui State Layout ✅ Passed The PR only changes web/TypeScript files; no SwiftUI sources or state/layout patterns are touched.
Cmux Architecture Rethink ✅ Passed The diff only touches TypeScript files; no Swift code or applicable Swift architecture rule is present.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No Swift files or window/controller changes are in the PR diff, so the auxiliary-window close-shortcut rule is not applicable.
Cmux Source Artifacts ✅ Passed The only changed paths are a source module and a test file; no logs, caches, build outputs, scratch dirs, or other artifacts were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed PR diff contains only web/TypeScript and test files; no Swift production Sources/ changes, so the no-test-debug-seam rule is not applicable.
Cmux No Ambient Global State ✅ Passed PR diff touches only web TypeScript/JSON files; no Swift sources or ambient global-state Swift patterns are present, so the rule is not applicable.
Title check ✅ Passed The title matches the PR's main theme: expanding crawl/search discovery via feeds, robots, and IndexNow.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-search-discovery-aeo

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.

@greptile-apps

greptile-apps Bot commented Jul 17, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires up three search-engine discovery improvements: locale-aware RSS feeds served at /feed.xml and /<locale>/feed.xml, updated robots.txt rules that explicitly allow AI crawlers (ChatGPT, Claude, Perplexity) and drop the /_next/ disallow, and an IndexNow cron endpoint that submits recently-modified sitemap URLs after each successful production deployment. The deepMergeMessages helper is extracted from request.ts into a shared messages.ts so the RSS builder can load locale-merged messages outside the Next.js server request cycle.

  • RSS feeds: buildLocalizedBlogRssFeed loads merged locale messages via the new loadMessages helper, translates post titles and summaries, and delegates to buildBlogRssFeed. The root /feed.xml mirrors the default locale; per-locale routes exclude the default locale and set dynamicParams = false so only supported locales are statically generated.
  • IndexNow: recentlyModifiedUrls anchors the 48-hour lookback window to the newest sitemap date rather than now, so delayed deployments still capture the right set of changes. submitIndexNowUrls guards against the 10,000-URL API limit and attaches a 10-second AbortSignal.timeout.
  • i18n: The RSS autodiscovery <link> title in layout.tsx is now routed through getTranslations({ namespace: "blog" }) with the blog.layoutTitle key, which is present in all 20 locale message files.

Confidence Score: 5/5

Safe to merge. All three new surfaces (RSS routes, IndexNow cron, robots.ts) are additive and independently covered by tests; the refactored deepMergeMessages extraction is a straight code move with no behavioral change.

The RSS builder correctly escapes XML special characters in all user-provided text fields. The IndexNow selection logic is anchored to sitemap dates rather than wall-clock time, which is intentional and covered by tests including a delayed-deployment scenario. The i18n autodiscovery title is properly routed through getTranslations. The two-variable naming scheme (CRON_SECRET in Vercel, INDEXNOW_TRIGGER_SECRET in GitHub Actions) is documented explicitly in the migration notes as needing the same value, so the system functions correctly when configured as instructed.

No files require special attention. The migration notes require two secrets to be configured (CRON_SECRET in Vercel and INDEXNOW_TRIGGER_SECRET in GitHub) with matching values before the post-deployment trigger works end-to-end.

Important Files Changed

Filename Overview
.github/workflows/indexnow.yml New GitHub Actions workflow that triggers IndexNow submission after a successful production deployment. Uses INDEXNOW_TRIGGER_SECRET (GitHub secret) that must be set to the same value as Vercel's CRON_SECRET per migration notes.
web/app/api/cron/indexnow/route.ts New POST endpoint that validates via CRON_SECRET (Vercel env var), calls recentlyModifiedUrls to get a list of recently-changed sitemap entries, and submits them to IndexNow. Error path is handled with 502 and console logging.
web/app/lib/indexnow.ts Implements recentlyModifiedUrls (anchors lookback window to the newest sitemap date rather than now) and submitIndexNowUrls (fetches IndexNow API with AbortSignal.timeout). Logic is well-tested and edge cases are covered.
web/app/lib/blog-feed.ts New RSS feed builder with proper XML escaping for titles/descriptions. URL fields (link, guid, atom:link href) are not XML-escaped but are safe in practice since they contain only URL-safe characters.
web/app/lib/localized-blog-feed.ts Builds locale-aware RSS feeds by loading messages via the new loadMessages helper, translating post titles/summaries, and delegating to buildBlogRssFeed. Falls back to English for missing translation keys via the deep-merge logic.
web/app/layout.tsx Adds localized RSS autodiscovery link in the root layout using getTranslations to pull the title from the blog.layoutTitle i18n key, with per-locale feed URL routing.
web/app/robots.ts Removes /_next/ disallow rule and adds explicit allow rules for OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, and PerplexityBot crawlers.
web/i18n/messages.ts Extracts the deepMergeMessages and loadMessages helpers from request.ts into a standalone module so they can be reused by the RSS feed builder without Next.js server dependencies.
web/tests/search-discovery.test.ts New test suite covering RSS channel validity, locale-specific feed output, recentlyModifiedUrls selection and anchoring logic, IndexNow payload structure, and unauthorized cron trigger rejection.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant GHA as GitHub Actions
    participant Cron as /api/cron/indexnow
    participant Lib as indexnow.ts
    participant SM as sitemap()
    participant API as api.indexnow.org

    GHA->>Cron: POST (Authorization header)
    Cron->>Cron: validate CRON_SECRET
    Cron->>SM: sitemap()
    SM-->>Cron: SitemapEntry[]
    Cron->>Lib: recentlyModifiedUrls(entries, now)
    Lib-->>Cron: string[] (anchored to newest date minus 48h)
    alt "urls.length == 0"
        Cron-->>GHA: 200 ok submitted 0
    else "urls.length > 0"
        Cron->>Lib: submitIndexNowUrls(urls)
        Lib->>API: POST /indexnow (AbortSignal 10s)
        API-->>Lib: HTTP status
        Lib-->>Cron: status code
        Cron-->>GHA: 200 ok submitted N
    end
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant GHA as GitHub Actions
    participant Cron as /api/cron/indexnow
    participant Lib as indexnow.ts
    participant SM as sitemap()
    participant API as api.indexnow.org

    GHA->>Cron: POST (Authorization header)
    Cron->>Cron: validate CRON_SECRET
    Cron->>SM: sitemap()
    SM-->>Cron: SitemapEntry[]
    Cron->>Lib: recentlyModifiedUrls(entries, now)
    Lib-->>Cron: string[] (anchored to newest date minus 48h)
    alt "urls.length == 0"
        Cron-->>GHA: 200 ok submitted 0
    else "urls.length > 0"
        Cron->>Lib: submitIndexNowUrls(urls)
        Lib->>API: POST /indexnow (AbortSignal 10s)
        API-->>Lib: HTTP status
        Lib-->>Cron: status code
        Cron-->>GHA: 200 ok submitted N
    end
Loading

Reviews (7): Last reviewed commit: "fix(web): bound IndexNow sitemap selecti..." | Re-trigger Greptile

Comment thread web/app/layout.tsx Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/layout.tsx`:
- Around line 38-45: Update the metadata export in the layout to define the RSS
alternate through the Metadata API’s alternates.types configuration, then remove
the manual head element and link. Preserve the existing metadata while using the
application/rss+xml key and the current feed URL.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 395b3341-5ec7-4517-bef5-fdf49cd9e3da

📥 Commits

Reviewing files that changed from the base of the PR and between e7c83de and 4ac0fd3.

📒 Files selected for processing (12)
  • web/app/[locale]/components/blog-posts.ts
  • web/app/api/cron/indexnow/route.ts
  • web/app/feed.xml/route.ts
  • web/app/layout.tsx
  • web/app/lib/agent-page-paths.ts
  • web/app/lib/blog-feed.ts
  • web/app/lib/indexnow.ts
  • web/app/robots.ts
  • web/tests/agent-page-variants.test.ts
  • web/tests/search-discovery.test.ts
  • web/tests/seo.test.ts
  • web/vercel.json

Comment thread web/app/layout.tsx

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/layout.tsx`:
- Line 44: Update the title construction near blogTranslations("layoutTitle") to
localize the RSS suffix through the translation catalog, using a localized
rssLabel/rssSuffix message or a fully localized alternate title. Preserve the
existing layout title while ensuring non-English pages never append the
hardcoded English “RSS”.

In `@web/app/lib/blog-feed.ts`:
- Line 2: Update buildBlogRssFeed and its callers, including the feed.xml route,
so RSS titles and entries use the requested locale’s messages and catalog data
instead of always importing englishMessages. If the feed remains English-only,
remove localized-feed promotion and clearly scope the route accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b6b592a2-ecd4-4564-ab76-98ddb23cc6c6

📥 Commits

Reviewing files that changed from the base of the PR and between 4ac0fd3 and 3bf75f1.

📒 Files selected for processing (2)
  • web/app/layout.tsx
  • web/app/lib/blog-feed.ts

Comment thread web/app/layout.tsx Outdated
Comment thread web/app/lib/blog-feed.ts Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/feed.xml/route.ts`:
- Around line 1-13: Update the GET function in the root feed route to pass
routing.defaultLocale to buildLocalizedBlogRssFeed instead of the hardcoded
"en", and import routing from the existing routing configuration so the
generated content and self-links follow the configured default locale.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 55c56101-cf77-4a31-9358-a18c958680eb

📥 Commits

Reviewing files that changed from the base of the PR and between 3bf75f1 and 8e717c5.

📒 Files selected for processing (8)
  • web/app/[locale]/feed.xml/route.ts
  • web/app/feed.xml/route.ts
  • web/app/layout.tsx
  • web/app/lib/blog-feed.ts
  • web/app/lib/localized-blog-feed.ts
  • web/i18n/messages.ts
  • web/i18n/request.ts
  • web/tests/search-discovery.test.ts

Comment thread web/app/feed.xml/route.ts

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/app/lib/indexnow.ts`:
- Around line 16-31: Update the modifiedEntries processing to avoid Math.max
spread and reduce repeated collection passes: use one pass over entries to
retain eligible entries while tracking newestModification incrementally, then a
second pass to select URLs within the computed lookback window. Preserve the
existing date validity, latest cutoff, URL conversion, and empty-collection
behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 925b608e-338f-476f-9d99-98166d088db8

📥 Commits

Reviewing files that changed from the base of the PR and between a1047df and f11e2dc.

📒 Files selected for processing (2)
  • web/app/lib/indexnow.ts
  • web/tests/search-discovery.test.ts

Comment thread web/app/lib/indexnow.ts Outdated
Comment thread web/app/api/cron/indexnow/route.ts
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Live Vercel preview: https://cmux-hpgh9kmse-manaflow.vercel.app

Validated on the hosted deployment:

Both feeds parse as XML; English has 19 items, Japanese has 16; localized autodiscovery and canonical feed URLs are correct; crawler groups and sitemap are present; stale Base variants are absent; unauthenticated IndexNow POST returns 401.

@lawrencecchen
lawrencecchen merged commit 97c737e into main Jul 17, 2026
12 checks passed
@lawrencecchen
lawrencecchen deleted the feat-search-discovery-aeo branch July 17, 2026 23:08
@lawrencecchen
lawrencecchen restored the feat-search-discovery-aeo branch July 18, 2026 10:24
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.

1 participant