Skip to content

Add SEO/AEO metadata: titles, robots, sitemap, JSON-LD - #97

Merged
skuhlmann merged 1 commit into
deployfrom
suede11
Jul 21, 2026
Merged

Add SEO/AEO metadata: titles, robots, sitemap, JSON-LD#97
skuhlmann merged 1 commit into
deployfrom
suede11

Conversation

@Suede0619

@Suede0619 Suede0619 commented Jul 21, 2026

Copy link
Copy Markdown
Member

Ships the recommendations from the brand SEO/AEO report.

What changed

  • Per-page metadata. Home and /join now have unique, plain-language titles and descriptions instead of the sitewide generic "Raid Guild" / "Elite Raiders Conquering the Web3 Realm" — which named no service anyone would search for.
  • metadataBase set (fixes OG image resolution; also clears the build warning).
  • JSON-LD Organization on the homepage (name, url, logo, foundingDate 2019, sameAs GitHub/X/Discord).
  • robots.ts/robots.txt — was a 404; now points at the sitemap.
  • sitemap.ts/sitemap.xml/ and /join.
  • Canonicals on both pages.

llms.txt already shipped in #96; left untouched.

Verified

bun run build clean; dev server confirms unique <title>, description, canonical, JSON-LD on both pages, and /robots.txt + /sitemap.xml render correctly.

Summary by CodeRabbit

  • New Features
    • Added enhanced metadata and social sharing information for the home and join pages.
    • Added structured organization information to improve search engine visibility.
    • Added robots and sitemap endpoints for improved site discovery and indexing.
    • Enabled dynamic rendering for the home page.

Implements the recommendations in the brand SEO/AEO report.

- layout.tsx: metadataBase (fixes OG image resolution), a real default
  title + template, description, canonical, OG/Twitter defaults —
  replacing the generic sitewide "Raid Guild" / "Elite Raiders" tags.
- Home (page.tsx): JSON-LD Organization block (name, url, logo,
  foundingDate 2019, sameAs GitHub/X/Discord).
- Join (join/page.tsx): unique title, description, canonical, OG.
- robots.ts -> /robots.txt (was 404) pointing at the sitemap.
- sitemap.ts -> /sitemap.xml (/ and /join).

llms.txt already shipped separately (#96); left as-is.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 21, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: website.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The changes update site and join-page SEO metadata, add Organization structured data to the homepage, force dynamic homepage rendering, and add robots and sitemap metadata routes for the RaidGuild site.

Changes

SEO and discovery

Layer / File(s) Summary
Site and join-page metadata
src/app/layout.tsx, src/app/join/page.tsx
Site-wide and join-page metadata now define RaidGuild titles, descriptions, canonical URLs, and social preview fields.
Homepage rendering and Organization schema
src/app/page.tsx
The homepage uses forced dynamic rendering and emits Organization JSON-LD data.
Robots and sitemap routes
src/app/robots.ts, src/app/sitemap.ts
Robots metadata permits crawling and references the sitemap; the sitemap lists the home and join pages.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: skuhlmann

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main SEO/AEO metadata additions, including titles, robots, sitemap, and JSON-LD.
✨ 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 suede11

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.

@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

🧹 Nitpick comments (2)
src/app/join/page.tsx (1)

17-23: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use a relative URL for Open Graph.

Since metadataBase is configured in the root layout, you can use a relative URL here to remain consistent with how alternates.canonical is configured. Next.js will automatically resolve it to the full absolute URL.

🛠️ Proposed refactor
   openGraph: {
     title: "Join a RaidGuild Cohort — 4-Week Web3 Proving Ground",
     description:
       "A free monthly cohort for intermediate+ developers, designers, and operators. Build a real Web3 project with experienced guild members.",
-    url: "https://www.raidguild.org/join",
+    url: "/join",
     type: "website",
   },
🤖 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/join/page.tsx` around lines 17 - 23, Update the openGraph.url value
in the page metadata to use the relative join path instead of the absolute
domain URL, relying on the root layout’s metadataBase for resolution and keeping
it consistent with alternates.canonical.
src/app/sitemap.ts (1)

5-19: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Avoid using the current time for lastModified.

Using new Date() causes the sitemap to report the build or request time as the modification date for all pages. Search engines recommend updating lastModified only when the underlying content has actually changed, and they may begin to ignore this field if it updates continuously without meaningful modifications.

Consider omitting lastModified entirely for these mostly static routes, or hardcoding the date of the last meaningful update.

🛠️ Proposed refactor
-  const lastModified = new Date();
-
   return [
     {
       url: `${base}/`,
-      lastModified,
       changeFrequency: "weekly",
       priority: 1,
     },
     {
       url: `${base}/join`,
-      lastModified,
       changeFrequency: "weekly",
       priority: 0.8,
     },
   ];
🤖 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/sitemap.ts` around lines 5 - 19, Remove the dynamic `new Date()`
assignment from the sitemap route entries and omit `lastModified` for these
mostly static pages, or replace it with a fixed date representing the last
meaningful content update. Keep the existing URLs and other sitemap metadata
unchanged.
🤖 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/layout.tsx`:
- Line 16: Remove the root-level alternates.canonical definition from the layout
metadata so it is not inherited by other pages. Add homepage-specific Metadata
in the page module and set its alternates.canonical to "/" there.

---

Nitpick comments:
In `@src/app/join/page.tsx`:
- Around line 17-23: Update the openGraph.url value in the page metadata to use
the relative join path instead of the absolute domain URL, relying on the root
layout’s metadataBase for resolution and keeping it consistent with
alternates.canonical.

In `@src/app/sitemap.ts`:
- Around line 5-19: Remove the dynamic `new Date()` assignment from the sitemap
route entries and omit `lastModified` for these mostly static pages, or replace
it with a fixed date representing the last meaningful content update. Keep the
existing URLs and other sitemap metadata unchanged.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 901953b2-460e-4c99-9fe5-d058231f4b37

📥 Commits

Reviewing files that changed from the base of the PR and between b80cdaa and 633c6e7.

📒 Files selected for processing (5)
  • src/app/join/page.tsx
  • src/app/layout.tsx
  • src/app/page.tsx
  • src/app/robots.ts
  • src/app/sitemap.ts

Comment thread src/app/layout.tsx
},
description:
"A builder-owned collective shipping smart contracts, dApps, AI systems, and DAO tooling since 2019. Clients include Gitcoin, Gnosis, Pocket Network, and Unlock Protocol.",
alternates: { canonical: "/" },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove the root-level canonical URL.

Defining canonical: "/" in the root layout sets this as the default canonical URL for all pages that do not explicitly override it. This causes search engines to mistakenly treat any non-overridden pages as duplicates of the homepage.

It is recommended to remove this from the root layout and instead define it directly in the homepage's src/app/page.tsx metadata.

🕷️ Proposed fix for `layout.tsx`
-  alternates: { canonical: "/" },
🕷️ Proposed follow-up for `src/app/page.tsx`

You can apply the canonical URL explicitly to the homepage by adding this to src/app/page.tsx:

import type { Metadata } from "next";

export const metadata: Metadata = {
  alternates: { canonical: "/" },
};
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
alternates: { canonical: "/" },
🤖 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/layout.tsx` at line 16, Remove the root-level alternates.canonical
definition from the layout metadata so it is not inherited by other pages. Add
homepage-specific Metadata in the page module and set its alternates.canonical
to "/" there.

@skuhlmann
skuhlmann changed the base branch from main to deploy July 21, 2026 15:02
@skuhlmann
skuhlmann merged commit 3f5de58 into deploy Jul 21, 2026
1 of 2 checks passed
@skuhlmann
skuhlmann deleted the suede11 branch July 21, 2026 15:44
skuhlmann added a commit that referenced this pull request Jul 21, 2026
* Add SEO/AEO metadata: per-page titles, robots, sitemap, JSON-LD (#97)

Implements the recommendations in the brand SEO/AEO report.

- layout.tsx: metadataBase (fixes OG image resolution), a real default
  title + template, description, canonical, OG/Twitter defaults —
  replacing the generic sitewide "Raid Guild" / "Elite Raiders" tags.
- Home (page.tsx): JSON-LD Organization block (name, url, logo,
  foundingDate 2019, sameAs GitHub/X/Discord).
- Join (join/page.tsx): unique title, description, canonical, OG.
- robots.ts -> /robots.txt (was 404) pointing at the sitemap.
- sitemap.ts -> /sitemap.xml (/ and /join).

llms.txt already shipped separately (#96); left as-is.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* Remove the root-level canonical URL

---------

Co-authored-by: Suede <101133311+Suede0619@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Suede0619 added a commit that referenced this pull request Jul 21, 2026
- join/page.tsx: openGraph.url now relative ("/join"), resolved via
  metadataBase for consistency with alternates.canonical.
- sitemap.ts: drop lastModified. new Date() reported build/request
  time on every request for mostly-static routes, which crawlers may
  learn to ignore if it changes with no real content update.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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.

2 participants