Skip to content

feat(seo): add robots.txt, sitemap, JSON-LD, and enhanced metadata#965

Merged
Kitenite merged 4 commits into
mainfrom
kiet-ho/sherbet
Jan 27, 2026
Merged

feat(seo): add robots.txt, sitemap, JSON-LD, and enhanced metadata#965
Kitenite merged 4 commits into
mainfrom
kiet-ho/sherbet

Conversation

@Kitenite
Copy link
Copy Markdown
Collaborator

@Kitenite Kitenite commented Jan 26, 2026

Summary

Comprehensive SEO implementation for marketing and docs sites:

  • robots.txt - Crawl directives for both sites
  • sitemap.xml - Dynamic sitemaps (marketing includes blog posts)
  • JSON-LD structured data - Organization, SoftwareApplication, Article, Website schemas
  • Open Graph & Twitter Cards - Full social sharing metadata
  • RSS feed - /feed.xml for blog subscribers
  • OG image generation - Dynamic opengraph-image.tsx
  • PWA manifest - manifest.json for app-like behavior

Marketing Site Changes

File Change
src/app/robots.ts New
src/app/sitemap.ts New
src/app/layout.tsx Enhanced metadata
src/app/opengraph-image.tsx New
src/app/feed.xml/route.ts New
src/app/blog/[slug]/page.tsx Article JSON-LD + canonical
src/components/JsonLd/ New
public/manifest.json New

Docs Site Changes

File Change
src/app/robots.ts New
src/app/sitemap.ts New
src/app/layout.tsx Enhanced metadata

Test plan

  • Visit /robots.txt on both sites - should return crawl rules
  • Visit /sitemap.xml on both sites - should list all pages
  • Visit /feed.xml on marketing site - should return RSS feed
  • Check OG tags with Facebook Debugger
  • Validate JSON-LD with Google Rich Results Test
  • Verify blog post pages include Article structured data

Summary by CodeRabbit

  • New Features

    • RSS feed for blog posts
    • Open Graph image generator for social previews
    • JSON-LD structured data components for SEO
    • PWA manifest for app install
  • Improvements

    • Expanded SEO/social metadata (Open Graph, Twitter, canonical alternates)
    • Sitemap and robots endpoints (site map generation; selective noindex rules)
    • Consistent metadata image handling for docs and marketing pages

✏️ Tip: You can customize this high-level summary in your review settings.

Marketing site (superset.sh):
- Add robots.ts with crawl directives
- Add sitemap.ts with dynamic blog post URLs
- Update layout.tsx with full Open Graph, Twitter Cards, keywords
- Add JSON-LD structured data (Organization, SoftwareApplication, Article, Website)
- Add opengraph-image.tsx for dynamic OG image generation
- Add RSS feed at /feed.xml
- Add manifest.json for PWA support
- Update blog posts with Article JSON-LD and canonical URLs

Docs site (docs.superset.sh):
- Add robots.ts with crawl directives
- Add sitemap.ts from Fumadocs source
- Update layout.tsx with metadataBase and full metadata
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jan 26, 2026

Warning

Rate limit exceeded

@Kitenite has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 16 minutes and 29 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📝 Walkthrough

Walkthrough

Adds SEO, indexing controls, and content-distribution endpoints: metadata enrichment (Open Graph/Twitter/JSON‑LD), robots.txt and sitemap routes, RSS feed, Open Graph image generator, PWA manifest, and noindex headers for LLM-generated outputs.

Changes

Cohort / File(s) Change Summary
Docs page metadata
apps/docs/src/app/(docs)/[[...slug]]/page.tsx
Precomputes page image URL, uses it consistently for openGraph.images and twitter.images, and adds alternates.canonical.
Docs & marketing root metadata
apps/docs/src/app/layout.tsx, apps/marketing/src/app/layout.tsx
Replace simple title with full Metadata objects: metadataBase, structured title/template, description, keywords, authors/creator, openGraph, twitter, robots, and apple icons; marketing layout also renders JSON‑LD components in head.
LLM content routes
apps/docs/src/app/llms-full.txt/route.ts, apps/docs/src/app/llms.mdx/[[...slug]]/route.ts
Add X-Robots-Tag: noindex, nofollow and explicit Content-Type for plain/text route to prevent indexing.
Robots routes
apps/docs/src/app/robots.ts, apps/marketing/src/app/robots.ts
New Next.js MetadataRoute robots.ts files exporting robots rules (disallow /api/, /_next/, and LLM routes) and sitemap URL.
Sitemap generators
apps/docs/src/app/sitemap.ts, apps/marketing/src/app/sitemap.ts
New sitemap endpoints returning MetadataRoute.Sitemap arrays built from project pages and blog posts with lastModified, changeFrequency, and priority.
RSS feed
apps/marketing/src/app/feed.xml/route.ts
New GET route generating RSS 2.0 feed from blog posts with XML escaping and caching headers; responds with application/xml.
JSON‑LD helpers
apps/marketing/src/components/JsonLd/JsonLd.tsx, apps/marketing/src/components/JsonLd/index.ts
New Organization, SoftwareApplication, Article, and Website JSON‑LD components (script LD+JSON outputs) and re-exports.
Open Graph image
apps/marketing/src/app/opengraph-image.tsx
New edge-runtime OG image generator exporting runtime/alt/size/contentType and an Image component that returns an ImageResponse rendering branded SVG/JX graphic.
PWA manifest
apps/marketing/public/manifest.json
Add web app manifest with name/short_name, colors, display, start_url, and a 192×192 icon.

Sequence Diagram(s)

sequenceDiagram
  participant C as Crawler / Client
  participant R as Next.js Route (robots/sitemap/feed)
  participant S as Pages Source (getPages/getBlogPosts)
  participant CDN as CDN / Cache

  rect rgba(200,200,255,0.5)
    C->>R: GET /robots.txt
    R-->>C: robots.txt (disallow rules, sitemap URL)
  end

  rect rgba(200,255,200,0.5)
    C->>R: GET /sitemap.xml
    R->>S: fetch pages/posts
    S-->>R: pages list
    R-->>C: sitemap XML (entries with lastModified, priority)
    R->>CDN: set cache headers
  end

  rect rgba(255,220,200,0.5)
    C->>R: GET /feed.xml
    R->>S: fetch blog posts
    S-->>R: posts
    R-->>C: RSS XML (application/xml, caching headers)
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 I hopped through code and left a trace,
Sitemaps, feeds, and a robots' grace.
JSON‑LD whispers, OG art gleams,
Manifests sparkle in PWA dreams.
Hop—discover me across search streams! 🥕✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
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.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically summarizes the main changes: adding SEO features (robots.txt, sitemap, JSON-LD, metadata) across both sites.
Description check ✅ Passed The description follows the template with clear sections (Summary, Test plan), provides detailed file-by-file changes with tables, and covers all major features implemented.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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 and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jan 26, 2026

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch
  • ✅ Electric Fly.io app

Thank you for your contribution! 🎉

… cards

- Add RSS feed alternates to blog page metadata for feed discovery
- Add OG/Twitter metadata to blog index page
- Disallow /llms.mdx/ and /llms-full.txt in docs robots.txt
- Add X-Robots-Tag: noindex to LLM/MDX endpoints (prevent duplicate content)
- Add canonical URLs and Twitter cards to docs pages
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Fix all issues with AI agents
In `@apps/marketing/public/manifest.json`:
- Around line 9-15: The manifest.json's icons array only contains a 192x192
entry; add a 512x512 icon object to the "icons" array (e.g., { "src":
"/favicon-512.png", "sizes": "512x512", "type": "image/png" }) and include the
optional "purpose" field (e.g., "any maskable") to support adaptive icons;
ensure the referenced asset exists in public assets and follow the same key
names ("src", "sizes", "type", "purpose") so Android PWA checks and splash
screens use the 512×512 image.

In `@apps/marketing/src/app/feed.xml/route.ts`:
- Line 33: The RSS <author> element is being populated with post.author (see
escapeXml(post.author)) which is a plain name; update the feed generation to
either (A) emit a Dublin Core creator element instead: replace
<author>${escapeXml(post.author)}</author> with
<dc:creator>${escapeXml(post.author)}</dc:creator> and add the dc namespace
(xmlns:dc="http://purl.org/dc/elements/1.1/") to the feed root, or (B) if you
have an email field, format the <author> per RSS spec using post.authorEmail and
post.author like <author>${escapeXml(post.authorEmail)}
(${escapeXml(post.author)})</author>; adjust the code that builds the XML in
route.ts accordingly (references: escapeXml, post.author, post.authorEmail, feed
root).

In `@apps/marketing/src/app/layout.tsx`:
- Around line 114-116: The SoftwareApplicationJsonLd component currently
includes hardcoded aggregateRating (ratingValue: "5", ratingCount: "100") which
can be misleading; update the SoftwareApplicationJsonLd usage to remove the
aggregateRating field or replace it with real ratings sourced from your review
system before rendering (e.g., pull live ratingValue and ratingCount and pass
them into SoftwareApplicationJsonLd), ensuring the fields are only present when
genuine data exists; specifically locate the SoftwareApplicationJsonLd
invocation in layout.tsx and either delete the aggregateRating prop or
conditionally supply ratingValue/ratingCount derived from your actual reviews
API.

In `@apps/marketing/src/components/JsonLd/JsonLd.tsx`:
- Around line 44-48: The JsonLd component currently contains a hardcoded
aggregateRating object (fields ratingValue and ratingCount) which violates
Google's guidelines; remove the aggregateRating block from the JSON-LD output or
change JsonLd to only include aggregateRating when real review data is provided
(e.g., check a prop or data source before emitting the aggregateRating object).
Specifically, update the JsonLd component to stop emitting the aggregateRating
object (or make it conditional) instead of the current hardcoded aggregateRating
with ratingValue: "5" and ratingCount: "100".
- Around line 131-138: The JSON-LD currently advertises a SearchAction via the
potentialAction object in the JsonLd component (SearchAction, urlTemplate) but
the blog page does not support search; either remove the potentialAction block
from JsonLd to avoid advertising non-existent search, or implement search
handling on the blog page: accept searchParams (e.g., search_term_string) in the
blog page component, filter the posts list by that query, and ensure urlTemplate
in JsonLd matches the actual query parameter name and route; update the JsonLd
potentialAction only if the blog page implements the search handler.
🧹 Nitpick comments (5)
apps/docs/src/app/sitemap.ts (1)

4-14: Extract sitemap priorities into named constants.
This avoids magic numbers and improves maintainability.

♻️ Suggested refactor
+const QUICK_START_PRIORITY = 1.0;
+const DEFAULT_PRIORITY = 0.8;
+
 export default function sitemap(): MetadataRoute.Sitemap {
 	const baseUrl = "https://docs.superset.sh";
@@
 	return pages.map((page) => ({
 		url: `${baseUrl}${page.url}`,
 		lastModified: new Date(),
 		changeFrequency: "weekly" as const,
-		priority: page.url === "/quick-start" ? 1.0 : 0.8,
+		priority: page.url === "/quick-start" ? QUICK_START_PRIORITY : DEFAULT_PRIORITY,
 	}));
 }
apps/marketing/src/app/sitemap.ts (1)

4-46: Centralize sitemap constants (priorities and fixed dates).
This reduces magic numbers and makes updates safer.

♻️ Suggested refactor
+const HOME_PRIORITY = 1.0;
+const BLOG_INDEX_PRIORITY = 0.9;
+const BLOG_POST_PRIORITY = 0.8;
+const SECTION_PRIORITY = 0.5;
+const LEGAL_PRIORITY = 0.3;
+const LEGAL_LAST_MODIFIED = new Date("2025-01-15");
+
 export default function sitemap(): MetadataRoute.Sitemap {
 	const baseUrl = "https://superset.sh";
@@
 		{
 			url: baseUrl,
 			lastModified: new Date(),
 			changeFrequency: "weekly",
-			priority: 1.0,
+			priority: HOME_PRIORITY,
 		},
@@
 			url: `${baseUrl}/blog`,
 			lastModified: new Date(),
 			changeFrequency: "daily",
-			priority: 0.9,
+			priority: BLOG_INDEX_PRIORITY,
 		},
@@
 			url: `${baseUrl}/privacy`,
-			lastModified: new Date("2025-01-15"),
+			lastModified: LEGAL_LAST_MODIFIED,
 			changeFrequency: "yearly",
-			priority: 0.3,
+			priority: LEGAL_PRIORITY,
 		},
@@
 			url: `${baseUrl}/terms`,
-			lastModified: new Date("2025-01-15"),
+			lastModified: LEGAL_LAST_MODIFIED,
 			changeFrequency: "yearly",
-			priority: 0.3,
+			priority: LEGAL_PRIORITY,
 		},
@@
 			url: `${baseUrl}/ports`,
 			lastModified: new Date(),
 			changeFrequency: "monthly",
-			priority: 0.5,
+			priority: SECTION_PRIORITY,
 		},
@@
 	const blogPages: MetadataRoute.Sitemap = posts.map((post) => ({
 		url: `${baseUrl}/blog/${post.slug}`,
 		lastModified: new Date(post.date),
 		changeFrequency: "monthly" as const,
-		priority: 0.8,
+		priority: BLOG_POST_PRIORITY,
 	}));
apps/marketing/src/app/feed.xml/route.ts (2)

5-5: Extract hardcoded URL to a named constant.

The baseUrl is a magic string that appears in multiple places across the codebase (also in sitemap, JSON-LD components). Consider extracting it to a shared constant to ensure consistency and ease future updates.

Example approach
+// At module top or in a shared config
+const BASE_URL = "https://superset.sh";
+
 export async function GET() {
   const posts = getBlogPosts();
-  const baseUrl = "https://superset.sh";
+  const baseUrl = BASE_URL;

Or import from a shared config module used across the marketing app.


7-13: Consider moving escapeXml outside the handler.

The helper is recreated on every request. Moving it to module scope avoids repeated function allocation.

Suggested refactor
+const escapeXml = (str: string) =>
+  str
+    .replace(/&/g, "&amp;")
+    .replace(/</g, "&lt;")
+    .replace(/>/g, "&gt;")
+    .replace(/"/g, "&quot;")
+    .replace(/'/g, "&apos;");
+
 export async function GET() {
   const posts = getBlogPosts();
   const baseUrl = "https://superset.sh";
-
-  const escapeXml = (str: string) =>
-    str
-      .replace(/&/g, "&amp;")
-      .replace(/</g, "&lt;")
-      .replace(/>/g, "&gt;")
-      .replace(/"/g, "&quot;")
-      .replace(/'/g, "&apos;");
apps/marketing/src/app/blog/[slug]/page.tsx (1)

23-23: Consider extracting the base URL to avoid duplication.

The URL https://superset.sh is hardcoded here and duplicated between BlogPostPage (line 23) and generateMetadata (line 56). The layout already defines metadataBase: new URL("https://superset.sh").

Consider extracting this to a shared constant or using a helper function to build blog post URLs consistently.

♻️ Suggested refactor
// In a shared constants file (e.g., `@/lib/constants.ts`)
export const SITE_URL = "https://superset.sh";
export const getBlogPostUrl = (slug: string) => `${SITE_URL}/blog/${slug}`;

Then import and use in this file:

+import { getBlogPostUrl } from "@/lib/constants";
+
 export default async function BlogPostPage({ params }: PageProps) {
   const { slug } = await params;
   const post = getBlogPost(slug);
   // ...
-  const url = `https://superset.sh/blog/${slug}`;
+  const url = getBlogPostUrl(slug);

Also applies to: 56-56

Comment on lines +9 to +15
"icons": [
{
"src": "/favicon-192.png",
"sizes": "192x192",
"type": "image/png"
}
]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Step 1: Check if the manifest.json file exists and view its content
echo "=== Checking manifest.json ==="
if [ -f "apps/marketing/public/manifest.json" ]; then
  echo "✓ manifest.json exists"
  cat -n "apps/marketing/public/manifest.json"
else
  echo "✗ manifest.json NOT FOUND"
fi

echo -e "\n=== Checking referenced favicon-192.png ==="
if [ -f "apps/marketing/public/favicon-192.png" ]; then
  echo "✓ favicon-192.png exists"
  ls -lh "apps/marketing/public/favicon-192.png"
else
  echo "✗ favicon-192.png NOT FOUND"
fi

echo -e "\n=== Checking for favicon-512.png ==="
if [ -f "apps/marketing/public/favicon-512.png" ]; then
  echo "✓ favicon-512.png exists"
  ls -lh "apps/marketing/public/favicon-512.png"
else
  echo "✗ favicon-512.png NOT FOUND"
fi

echo -e "\n=== Searching for all icon/favicon files in marketing/public ==="
find "apps/marketing/public/" -maxdepth 1 \( -name "*favicon*" -o -name "*icon*" \) 2>/dev/null

Repository: superset-sh/superset

Length of output: 909


🏁 Script executed:

#!/bin/bash
echo "=== Contents of app-icons directory ==="
find "apps/marketing/public/app-icons" -type f 2>/dev/null | head -20

echo -e "\n=== Checking file sizes and types ==="
ls -lhR "apps/marketing/public/app-icons" 2>/dev/null

Repository: superset-sh/superset

Length of output: 1646


Add 512×512 icon for proper PWA installation on Android.

The manifest only includes a 192×192 icon. PWA best practices require a 512×512 icon for Android splash screens and optimal installation experience across devices. Without it, the PWA may show degraded visuals or fail installation checks on some Android devices.

Additionally, consider adding the "purpose" field (e.g., "any maskable") to support adaptive icons on modern devices.

📱 Recommended icon configuration
 	"icons": [
 		{
 			"src": "/favicon-192.png",
 			"sizes": "192x192",
-			"type": "image/png"
+			"type": "image/png",
+			"purpose": "any maskable"
+		},
+		{
+			"src": "/favicon-512.png",
+			"sizes": "512x512",
+			"type": "image/png",
+			"purpose": "any maskable"
 		}
 	]
🤖 Prompt for AI Agents
In `@apps/marketing/public/manifest.json` around lines 9 - 15, The manifest.json's
icons array only contains a 192x192 entry; add a 512x512 icon object to the
"icons" array (e.g., { "src": "/favicon-512.png", "sizes": "512x512", "type":
"image/png" }) and include the optional "purpose" field (e.g., "any maskable")
to support adaptive icons; ensure the referenced asset exists in public assets
and follow the same key names ("src", "sizes", "type", "purpose") so Android PWA
checks and splash screens use the 512×512 image.

<description>${escapeXml(post.description || "")}</description>
<pubDate>${new Date(post.date).toUTCString()}</pubDate>
<guid isPermaLink="true">${baseUrl}/blog/${post.slug}</guid>
<author>${escapeXml(post.author)}</author>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

RSS <author> element expects email format.

Per the RSS 2.0 specification, the <author> element should contain an email address (optionally with a name in parentheses), e.g., author@example.com (Author Name). Using just a name string may cause validation warnings in some feed validators.

Consider using <dc:creator> (with Dublin Core namespace) for plain author names, or omit the author element if email addresses aren't available.

Option: Use dc:creator instead
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">

Then in items:

-      <author>${escapeXml(post.author)}</author>
+      <dc:creator>${escapeXml(post.author)}</dc:creator>
🤖 Prompt for AI Agents
In `@apps/marketing/src/app/feed.xml/route.ts` at line 33, The RSS <author>
element is being populated with post.author (see escapeXml(post.author)) which
is a plain name; update the feed generation to either (A) emit a Dublin Core
creator element instead: replace <author>${escapeXml(post.author)}</author> with
<dc:creator>${escapeXml(post.author)}</dc:creator> and add the dc namespace
(xmlns:dc="http://purl.org/dc/elements/1.1/") to the feed root, or (B) if you
have an email field, format the <author> per RSS spec using post.authorEmail and
post.author like <author>${escapeXml(post.authorEmail)}
(${escapeXml(post.author)})</author>; adjust the code that builds the XML in
route.ts accordingly (references: escapeXml, post.author, post.authorEmail, feed
root).

Comment thread apps/marketing/src/app/layout.tsx
Comment thread apps/marketing/src/components/JsonLd/JsonLd.tsx Outdated
Comment on lines +131 to +138
potentialAction: {
"@type": "SearchAction",
target: {
"@type": "EntryPoint",
urlTemplate: `${url}/blog?q={search_term_string}`,
},
"query-input": "required name=search_term_string",
},
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for search-related functionality in the blog directory
rg -n "searchParams|query|q=" apps/marketing/src/app/blog --type ts --type tsx -A 3

Repository: superset-sh/superset

Length of output: 91


🏁 Script executed:

#!/bin/bash
# Find TypeScript/React files in the blog directory
find apps/marketing/src/app/blog -type f \( -name "*.tsx" -o -name "*.ts" \) | head -20

Repository: superset-sh/superset

Length of output: 854


🏁 Script executed:

#!/bin/bash
# Examine the main blog page
cat -n apps/marketing/src/app/blog/page.tsx

Repository: superset-sh/superset

Length of output: 3334


🏁 Script executed:

#!/bin/bash
# Check if there's any search functionality elsewhere in the blog directory
rg -i "search" apps/marketing/src/app/blog -g "*.tsx" -g "*.ts" -A 2

Repository: superset-sh/superset

Length of output: 46


🏁 Script executed:

#!/bin/bash
# Check the JsonLd component to understand the SearchAction context
sed -n '120,150p' apps/marketing/src/components/JsonLd/JsonLd.tsx

Repository: superset-sh/superset

Length of output: 696


Remove or implement the advertised search functionality.

The SearchAction schema points to /blog?q={search_term_string}, but the blog page at apps/marketing/src/app/blog/page.tsx doesn't accept or handle searchParams. Either implement search filtering on the blog page or remove the SearchAction from the structured data to avoid misleading search engines.

🤖 Prompt for AI Agents
In `@apps/marketing/src/components/JsonLd/JsonLd.tsx` around lines 131 - 138, The
JSON-LD currently advertises a SearchAction via the potentialAction object in
the JsonLd component (SearchAction, urlTemplate) but the blog page does not
support search; either remove the potentialAction block from JsonLd to avoid
advertising non-existent search, or implement search handling on the blog page:
accept searchParams (e.g., search_term_string) in the blog page component,
filter the posts list by that query, and ensure urlTemplate in JsonLd matches
the actual query parameter name and route; update the JsonLd potentialAction
only if the blog page implements the search handler.

Replace hardcoded domain URLs with COMPANY constants from @superset/shared:
- COMPANY.MARKETING_URL for superset.sh URLs
- COMPANY.DOCS_URL for docs.superset.sh URLs
- COMPANY.NAME, COMPANY.GITHUB_URL, COMPANY.X_URL for branding

This ensures consistency and makes domain changes easier to manage.
@Kitenite Kitenite merged commit 2162d5f into main Jan 27, 2026
13 checks passed
@Kitenite Kitenite deleted the kiet-ho/sherbet branch January 27, 2026 00:10
@coderabbitai coderabbitai Bot mentioned this pull request Jan 27, 2026
5 tasks
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