Skip to content

Conversation

@roomote
Copy link
Contributor

@roomote roomote bot commented Jan 27, 2026

Summary

Makes blog pages citation-ready for SEO/AEO with correct metadata and Schema.org structured data so AI systems and Google can parse and cite us reliably.

Changes

Structured Data (src/lib/blog/structured-data.ts)

  • getArticleStructuredData() - Article JSON-LD for blog posts
  • getBlogCollectionStructuredData() - CollectionPage + ItemList JSON-LD for blog index
  • getBlogBreadcrumbStructuredData() - BreadcrumbList for /blog
  • getBlogPostBreadcrumbStructuredData() - BreadcrumbList for /blog/[slug]

Blog Index (/blog)

  • Metadata: title, description, canonical (https://roocode.com/blog), OG/Twitter cards
  • JSON-LD: CollectionPage with ItemList of published posts
  • JSON-LD: BreadcrumbList (Home → Blog)
  • Single H1 element

Blog Post (/blog/[slug])

  • generateMetadata with title, description, canonical, OG/Twitter cards from frontmatter
  • JSON-LD: Article with required fields (headline, description, datePublished, mainEntityOfPage, url)
  • JSON-LD: Recommended fields (author/Organization, publisher/Organization with logo, dateModified, keywords)
  • JSON-LD: BreadcrumbList (Home → Blog → Post Title)
  • Single H1 element (post title)

AEO Requirements

  • ✅ Clear, unambiguous canonical URLs (always https://roocode.com/blog/...)
  • ✅ Strong machine-readable structure via Schema.org JSON-LD
  • ✅ One primary topic per page; no duplicate H1s
  • ✅ Reuses existing SEO utilities (src/lib/seo, src/lib/og)

Definition of Done

  • /blog and /blog/[slug] have correct canonical + OG/Twitter metadata
  • /blog/[slug] includes valid Article JSON-LD (passes Google Rich Results)
  • /blog includes valid CollectionPage/ItemList schema for published posts
  • ✅ Breadcrumb schema present on both pages
  • ✅ Page template does not introduce multiple H1s

- Add gray-matter for frontmatter parsing
- Create BlogPost type and zod schema for validation
- Implement PT timezone helpers (getNowPt, parsePublishTimePt)
- Implement content loading (getAllBlogPosts, getBlogPostBySlug)
- Implement isPublished for request-time publish gating
- Add validation for frontmatter and duplicate slugs
- Create content/blog directory for markdown files

Closes: MKT-67
…he Past

Adds the first canonical blog post to validate the content pipeline:
- Title: PRDs Are Becoming Artifacts of the Past
- Slug: prds-are-becoming-artifacts-of-the-past
- Status: published
- Publish date: 2026-01-12 at 9:00am PT

Content sourced from Office Hours S01E15 with Paige Bailey.

Closes: MKT-73
- Create blog index page at /blog
- Use force-dynamic for request-time publish gating
- Require Node.js runtime for filesystem reads
- Display posts with title, description, and date
- Add empty state when no posts are published
- Include tags display (up to 3)

Closes: MKT-68
- Create dynamic route for individual blog posts
- Use force-dynamic for request-time publish gating
- Require Node.js runtime for filesystem reads
- Return 404 for drafts, future posts, or invalid slugs
- Render Markdown with react-markdown + remark-gfm
- No raw HTML rendering (safe by default)
- Include consistent typography and styling

Closes: MKT-69
- Add structured-data.ts with Article, CollectionPage, and BreadcrumbList schemas
- Integrate JSON-LD into /blog index page (Blog collection + breadcrumbs)
- Integrate JSON-LD into /blog/[slug] page (Article + post breadcrumbs)
- Export structured data utilities from blog module index

MKT-70
@roomote roomote bot requested review from cte, jr and mrubens as code owners January 27, 2026 19:49
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. Enhancement New feature or request labels Jan 27, 2026
@github-actions
Copy link
Contributor

🚀 Preview deployed!

Your changes have been deployed to Vercel:

Preview URL: https://roo-code-website-lbzknuh3f-roo-code.vercel.app

This preview will be updated automatically when you push new commits to this PR.

@roomote roomote bot changed the title feat(blog): add Schema.org JSON-LD structured data for SEO MKT-70: Add SEO metadata and Schema.org JSON-LD for blog pages Jan 27, 2026
@roomote
Copy link
Contributor Author

roomote bot commented Jan 27, 2026

Rooviewer Clock   See task on Roo Cloud

Review complete. No issues found.

The implementation follows Schema.org specifications correctly, uses proper Next.js 15 patterns, and has appropriate TypeScript types and error handling throughout.

Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues.

@mp-roocode mp-roocode self-assigned this Jan 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Enhancement New feature or request size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

Status: Triage

Development

Successfully merging this pull request may close these issues.

2 participants