feat(seo): site-wide SEO — metadata, sitemap, robots, OG images, JSON-LD#10
Conversation
Technical SEO foundation across the site: - robots.ts and sitemap.ts (marketing + discover + blog posts) with the authenticated app, auth flows, API and preview routes excluded. - metadataBase from NEXT_PUBLIC_APP_URL so canonical/OG URLs are absolute. - Shared buildPageMetadata helper (title, description, canonical, Open Graph, Twitter) used by the home page, all marketing pages, blog articles, and the discovery pages. - Home page metadata (previously missing). - Organization + WebSite JSON-LD site-wide; BlogPosting JSON-LD on articles. - Dynamic Open Graph images via next/og: site default, per-pillar (discover), and per-article (blog). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reached
More reviews will be available in 36 minutes and 17 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more credits in the billing tab to continue. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (15)
📝 WalkthroughWalkthroughThis PR establishes complete SEO infrastructure for the Boundless application by introducing shared site constants, metadata builders, OG image rendering utilities, structured data components, crawler routes, and per-page metadata exports across all discover and public pages. ChangesSEO & Open Graph Image System
Sequence DiagramsequenceDiagram
participant Browser
participant RootLayout
participant BuildPageMetadata
participant RenderOgImage
participant JsonLd
Browser->>RootLayout: Request page
RootLayout->>BuildPageMetadata: Generate metadata
BuildPageMetadata->>Browser: Return page metadata + canonicals + OG tags
RootLayout->>JsonLd: Render schema
JsonLd->>Browser: Inject Organization/WebSite schemas
Browser->>RenderOgImage: Request /opengraph-image
RenderOgImage->>Browser: Return branded OG image (1200x630)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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 `@src/app/`(public)/page.tsx:
- Line 19: The homepage title string currently uses an em dash; update the
user-facing title in page.tsx (the metadata/title or exported title value on the
page component) to replace the em dash with an allowed separator such as "|" or
":" (e.g., "Boundless | Hackathons, Bounties, Grants & Crowdfunding on Stellar")
so it complies with the no-em-dash copy rule.
In `@src/app/robots.ts`:
- Line 27: Replace manual string concatenation with URL resolution: in the
robots.ts sitemap property (currently using `${SITE_URL}/sitemap.xml`) and in
src/app/sitemap.ts where individual entry URLs are built, use new
URL('sitemap.xml', SITE_URL) and new URL(pathOrFilename, SITE_URL) respectively
so URLs are constructed via the URL constructor to avoid trailing-slash and
edge-case bugs; locate the sitemap property in robots.ts and the sitemap
entry-building logic in sitemap.ts and update those call sites to use new
URL(..., SITE_URL).
In `@src/app/sitemap.ts`:
- Around line 7-10: The parseDate function is using new Date(value) which is
implementation-defined for non-ISO strings; update handling so parsing is
deterministic: either require/convert post.publishedDate to an ISO format (e.g.,
YYYY-MM-DD or full ISO 8601) before calling parseDate, or change parseDate to
parse the known human format explicitly (e.g., split "DD Month YYYY" and
construct a Date using UTC components) and return fallback only on truly invalid
input; locate the parseDate function and its caller lastModified:
parseDate(post.publishedDate, now) to implement the chosen deterministic parsing
strategy and ensure consistent Date construction across environments.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 8d91dca5-552c-4275-bd78-7f7e2082677f
📒 Files selected for processing (27)
src/app/(discover)/bounties/opengraph-image.tsxsrc/app/(discover)/bounties/page.tsxsrc/app/(discover)/crowdfunding/opengraph-image.tsxsrc/app/(discover)/crowdfunding/page.tsxsrc/app/(discover)/explore/opengraph-image.tsxsrc/app/(discover)/explore/page.tsxsrc/app/(discover)/grants/opengraph-image.tsxsrc/app/(discover)/grants/page.tsxsrc/app/(discover)/hackathons/opengraph-image.tsxsrc/app/(discover)/hackathons/page.tsxsrc/app/(discover)/seo.tssrc/app/(public)/about/page.tsxsrc/app/(public)/blog/[slug]/opengraph-image.tsxsrc/app/(public)/blog/[slug]/page.tsxsrc/app/(public)/blog/page.tsxsrc/app/(public)/brand-kit/page.tsxsrc/app/(public)/careers/page.tsxsrc/app/(public)/faq/page.tsxsrc/app/(public)/page.tsxsrc/app/layout.tsxsrc/app/opengraph-image.tsxsrc/app/robots.tssrc/app/sitemap.tssrc/components/seo/json-ld.tsxsrc/lib/og-image.tsxsrc/lib/seo.tssrc/lib/site.ts
| '/get-started-modal-preview', | ||
| ], | ||
| }, | ||
| sitemap: `${SITE_URL}/sitemap.xml`, |
There was a problem hiding this comment.
Shared root cause: manual SITE_URL concatenation in src/app/robots.ts and src/app/sitemap.ts can generate malformed URLs.
Both src/app/robots.ts (sitemap URL) and src/app/sitemap.ts (entry URLs) concatenate strings instead of resolving with URL. Switching both call sites to new URL(..., SITE_URL) removes trailing-slash edge cases consistently.
🤖 Prompt for 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.
In `@src/app/robots.ts` at line 27, Replace manual string concatenation with URL
resolution: in the robots.ts sitemap property (currently using
`${SITE_URL}/sitemap.xml`) and in src/app/sitemap.ts where individual entry URLs
are built, use new URL('sitemap.xml', SITE_URL) and new URL(pathOrFilename,
SITE_URL) respectively so URLs are constructed via the URL constructor to avoid
trailing-slash and edge-case bugs; locate the sitemap property in robots.ts and
the sitemap entry-building logic in sitemap.ts and update those call sites to
use new URL(..., SITE_URL).
…page OG - Bake the brand font (Plus Jakarta Sans, bundled .woff) into all generated Open Graph images via next/og. - Add a raster PNG brand logo at /logo.png and use it as the Organization logo in JSON-LD (search engines prefer raster). - Add app icons (icon, apple-icon) and a web app manifest. - Add per-page Open Graph images for the marketing pages (home/discover/blog already had their own) so each gets a distinct share preview instead of the site default. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…dates - Home title uses "|" instead of an em dash (house copy rule). - Build sitemap/robots URLs with new URL(..., SITE_URL) to avoid trailing-slash edge cases. - Parse the "DD Month YYYY" blog date explicitly in UTC instead of relying on implementation-defined new Date(string). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Technical SEO foundation across the site:
Summary by CodeRabbit
Release Notes
New Features
Refactor