Skip to content

fix(landing): complete Organization schema, add CollectionPage/BlogPosting JSON-LD, fix TechArticle rich-result eligibility#5638

Merged
waleedlatif1 merged 3 commits into
stagingfrom
schema-markup-fixes
Jul 13, 2026
Merged

fix(landing): complete Organization schema, add CollectionPage/BlogPosting JSON-LD, fix TechArticle rich-result eligibility#5638
waleedlatif1 merged 3 commits into
stagingfrom
schema-markup-fixes

Conversation

@waleedlatif1

Copy link
Copy Markdown
Collaborator

Summary

  • Complete Organization JSON-LD with brand and contactPoint.url (verified sameAs already matches footer; omitted foundingDate/legalName/address — nothing in the repo backs those values)
  • Add missing mainEntity (real ItemList of posts) to /blog and /library CollectionPage schema
  • Fix TechArticle-only posts silently losing Google rich-result eligibility (TechArticle isn't in the allowlist) by emitting a multi-type ["BlogPosting", "TechArticle"] for technical posts, driven by a new technical frontmatter flag (defaults true; set false only on the Series A funding post)
  • Fix broken speakable.cssSelector target and relative (invalid) image.url on article schema
  • Audited FAQPage schema across all 7 pages using LandingFAQ — already correct everywhere, no changes needed

Type of Change

  • Bug fix

Testing

  • bunx tsc --noEmit clean
  • bun run lint clean (19/19 packages)
  • Real production build + curled /blog, /blog/multiplayer, /blog/series-a, /library, /library/ai-agent-ideas, /models, /integrations/slack — confirmed real JSON-LD data rendering in every case

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

@vercel

vercel Bot commented Jul 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped Jul 13, 2026 6:52pm

Request Review

@cursor

cursor Bot commented Jul 13, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
SEO and presentation-only changes on marketing pages; no auth, data, or runtime API behavior.

Overview
Improves landing structured data so crawlers see organization, collection, and article graphs that match what users actually see on /blog and /library.

Collection pages now emit a CollectionPage with a real mainEntity ItemList of the posts on that view (featured row + page slice), with url reflecting tag/page query variants. Pagination and featured-post carving move into shared paginateContentPosts / selectVisiblePosts so the index UI and JSON-LD cannot drift.

Article schema always includes BlogPosting (Google rich-result allowlist); technical posts also get TechArticle via a new technical frontmatter flag (default true, false on the Series A announcement). Article JSON-LD uses absolute image URLs; non-technical posts omit proficiencyLevel. Post pages use BlogPosting microdata and expose description for speakable/SEO alignment.

Site-wide Organization JSON-LD adds brand and contactPoint.url.

Reviewed by Cursor Bugbot for commit 4182dd5. Configure here.

@greptile-apps

greptile-apps Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR improves landing-page structured data for the blog, library, and article pages.

  • Adds Organization brand and contact URL fields.
  • Adds CollectionPage ItemList data for blog and library indexes.
  • Keeps index JSON-LD aligned with filtered and paginated posts.
  • Emits BlogPosting for article microdata and JSON-LD rich-result eligibility.
  • Adds a technical frontmatter flag for TechArticle JSON-LD typing.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
apps/sim/lib/content/index-list.ts Adds shared post filtering and pagination helpers for index rendering and JSON-LD selection.
apps/sim/app/(landing)/blog/page.tsx Passes the visible blog posts into CollectionPage JSON-LD.
apps/sim/app/(landing)/library/page.tsx Passes the visible library posts into CollectionPage JSON-LD.
apps/sim/app/(landing)/components/content-index-page/content-index-page.tsx Uses the shared pagination helper for rendered index posts.
apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx Updates article microdata to use BlogPosting and marks the description field.
apps/sim/lib/content/seo.ts Builds article and collection JSON-LD with richer type, image, URL, and ItemList data.
apps/sim/lib/content/schema.ts Adds a defaulted technical frontmatter field to content metadata.
apps/sim/lib/content/registry-factory.ts Copies the parsed technical flag into content metadata.
apps/sim/app/(landing)/components/site-structured-data/site-structured-data.tsx Extends site-level Organization JSON-LD with brand and contact URL data.

Reviews (4): Last reviewed commit: "fix(landing): match CollectionPage ItemL..." | Re-trigger Greptile

Comment thread apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx Outdated
Comment thread apps/sim/app/(landing)/blog/page.tsx Outdated
Comment thread apps/sim/app/(landing)/library/page.tsx Outdated
Comment thread apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx Outdated
@greptile-apps

greptile-apps Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR expands landing-page structured data for posts and collection pages. The main changes are:

  • Organization JSON-LD now includes brand and contact metadata.
  • Blog and library collection pages now include ItemList main entities.
  • Content frontmatter now has a technical flag for article typing.
  • Article JSON-LD now emits BlogPosting for rich-result eligibility.
  • Post image URLs and speakable selectors were adjusted.

Confidence Score: 4/5

The collection structured data can describe the wrong visible list on filtered and paginated pages.

  • Blog and library ItemList data is built before tag filtering and pagination.
  • Article and Organization schema changes otherwise line up with the inspected routes, constants, and frontmatter parsing.
  • The remaining microdata mismatch is lower impact because the JSON-LD graph includes BlogPosting.

apps/sim/app/(landing)/blog/page.tsx, apps/sim/app/(landing)/library/page.tsx

Important Files Changed

Filename Overview
apps/sim/app/(landing)/blog/page.tsx Passes all blog posts into collection JSON-LD, which can mismatch filtered or paginated blog pages.
apps/sim/app/(landing)/library/page.tsx Passes all library articles into collection JSON-LD, which can mismatch filtered or paginated library pages.
apps/sim/lib/content/seo.ts Adds article type handling, absolute image URLs, and collection ItemList generation.
apps/sim/lib/content/schema.ts Adds the defaulted technical frontmatter field to content metadata.
apps/sim/lib/content/registry-factory.ts Copies the parsed technical value into each content metadata object.
apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx Updates article microdata and adds the description itemProp used by speakable JSON-LD.
apps/sim/app/(landing)/components/site-structured-data/site-structured-data.tsx Adds Organization brand and contactPoint URL metadata.
apps/sim/content/blog/series-a/index.mdx Marks the Series A announcement as non-technical.
apps/sim/lib/blog/seo.ts Updates the blog collection JSON-LD wrapper to accept posts.
apps/sim/lib/library/seo.ts Updates the library collection JSON-LD wrapper to accept posts.

Reviews (2): Last reviewed commit: "fix(landing): complete Organization sche..." | Re-trigger Greptile

Comment thread apps/sim/app/(landing)/blog/page.tsx Outdated
Comment thread apps/sim/app/(landing)/library/page.tsx Outdated
Comment thread apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx Outdated
…sting JSON-LD, fix TechArticle rich-result eligibility

- Organization schema (site-structured-data.tsx): add brand and
  contactPoint.url (verified against the real /contact route); all other
  fields were already correct and verified against the Footer's sameAs
  links. foundingDate/legalName/address omitted — not verifiable from
  anything in this repo.
- CollectionPage (blog + library index): buildCollectionPageJsonLd now
  takes the real posts list (same getAllPostMeta() the index page already
  renders from) and emits a mainEntity ItemList of BlogPosting stubs
  instead of omitting mainEntity entirely.
- BlogPosting + TechArticle (post detail template): Google's Article
  rich-result eligibility only recognizes Article/NewsArticle/BlogPosting
  — a bare TechArticle type isn't in that allowlist. buildArticleJsonLd
  now emits a multi-type @type array (["BlogPosting","TechArticle"]) for
  genuinely technical posts, and "BlogPosting" alone for posts that are
  general announcements, via a new `technical` frontmatter flag (defaults
  true; set to false on the series-a funding-announcement post, the one
  post with no technical content). Also fixed a real markup/schema
  mismatch: the article's `speakable.cssSelector` referenced
  `[itemprop="description"]`, but no element carried that itemProp —
  added it to the description paragraph. TechArticle/BlogPosting image
  URLs are now made absolute (previously relative paths, invalid for
  crawlers).
- FAQPage: audited every LandingFAQ usage (/models, /models/[provider],
  /models/[provider]/[model], /integrations, /integrations/[slug],
  /comparison, /comparison/[provider]) — all already emit matching
  FAQPage JSON-LD sourced from the same data passed to LandingFAQ; no
  gaps found, no changes needed.
…o visible posts

Address Greptile/Cursor review on PR #5638:
- itemType now always resolves to BlogPosting (matching Greptile's exact
  suggested fix), since the JSON-LD graph already carries the richer
  TechArticle type via a multi-type array and the microdata path doesn't
  need to duplicate that distinction
- buildCollectionPageJsonLd now receives the same tag-filtered/paginated
  post subset ContentIndexPage actually renders, instead of the full
  unfiltered catalog, via a new shared selectVisiblePosts/paginateContentPosts
  helper in lib/content/index-list.ts (also de-duplicates the pagination
  logic that previously lived only in ContentIndexPage)
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

Comment thread apps/sim/lib/content/seo.ts Outdated
Comment thread apps/sim/lib/content/seo.ts
…ble filtered/paginated variant

Address round-2 Cursor Bugbot findings on PR #5638:
- buildCollectionPageJsonLd no longer re-sorts the given posts by date -
  ordering is now solely owned by the caller (selectVisiblePosts), so
  featured-row-first render order matches ItemList position order
- buildCollectionPageJsonLd now takes an optional {tag, page} filter
  descriptor and reflects it in the emitted url, instead of always
  pointing at the bare section index regardless of which filtered/
  paginated variant's posts are actually listed in mainEntity
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

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

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 4182dd5. Configure here.

@waleedlatif1 waleedlatif1 merged commit 836ceda into staging Jul 13, 2026
13 checks passed
@waleedlatif1 waleedlatif1 deleted the schema-markup-fixes branch July 13, 2026 18:55
waleedlatif1 added a commit that referenced this pull request Jul 13, 2026
…te, and address (#5644)

Adds the three fields intentionally omitted from #5638 pending real values:
- legalName: 'Sim, Inc' - matches the entity named throughout the Terms of
  Service (apps/sim/app/(landing)/terms)
- foundingDate: '2025'
- address: real registered office (80 Langton St, San Francisco, CA 94103)
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