fix(landing): complete Organization schema, add CollectionPage/BlogPosting JSON-LD, fix TechArticle rich-result eligibility#5638
Conversation
|
@cursor review |
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryLow Risk Overview Collection pages now emit a Article schema always includes Site-wide Organization JSON-LD adds Reviewed by Cursor Bugbot for commit 4182dd5. Configure here. |
Greptile SummaryThis PR improves landing-page structured data for the blog, library, and article pages.
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (4): Last reviewed commit: "fix(landing): match CollectionPage ItemL..." | Re-trigger Greptile |
Greptile SummaryThis PR expands landing-page structured data for posts and collection pages. The main changes are:
Confidence Score: 4/5The collection structured data can describe the wrong visible list on filtered and paginated pages.
apps/sim/app/(landing)/blog/page.tsx, apps/sim/app/(landing)/library/page.tsx Important Files Changed
Reviews (2): Last reviewed commit: "fix(landing): complete Organization sche..." | Re-trigger Greptile |
…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)
01c9a99 to
5a70bea
Compare
|
@cursor review |
…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
|
@cursor review |
There was a problem hiding this comment.
✅ 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.
…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)
Summary
brandandcontactPoint.url(verifiedsameAsalready matches footer; omittedfoundingDate/legalName/address— nothing in the repo backs those values)mainEntity(realItemListof posts) to/blogand/libraryCollectionPage schemaTechArticle-only posts silently losing Google rich-result eligibility (TechArticleisn't in the allowlist) by emitting a multi-type["BlogPosting", "TechArticle"]for technical posts, driven by a newtechnicalfrontmatter flag (defaultstrue; setfalseonly on the Series A funding post)speakable.cssSelectortarget and relative (invalid)image.urlon article schemaLandingFAQ— already correct everywhere, no changes neededType of Change
Testing
bunx tsc --noEmitcleanbun run lintclean (19/19 packages)/blog,/blog/multiplayer,/blog/series-a,/library,/library/ai-agent-ideas,/models,/integrations/slack— confirmed real JSON-LD data rendering in every caseChecklist