Skip to content

Conversation

@roomote
Copy link
Contributor

@roomote roomote bot commented Jan 27, 2026

Summary

Makes the canonical blog discoverable on the marketing site by linking to internal /blog, while keeping Substack as the subscribe/community destination.

Changes

Constants (src/lib/constants.ts)

  • Added SUBSTACK: "https://roocode.substack.com" for subscribe link

Navigation (src/components/chromes/nav-bar.tsx)

  • Added Blog link to internal /blog in Resources dropdown (desktop)
  • Added Blog link to internal /blog in Resources section (mobile)

Footer (src/components/chromes/footer.tsx)

  • Added Blog link to internal /blog under Resources section
  • Added Substack link to EXTERNAL_LINKS.SUBSTACK under Connect section

Definition of Done

  • ✅ Nav/CTA links to canonical /blog
  • ✅ Substack remains available for subscribing (in footer Connect section)
  • ✅ No user-facing links mistakenly route "read posts" traffic to Substack

Pragmatic Containment

Changes are limited to shared chrome only (nav/footer/constants) as required:

  • ✅ Updated nav/footer to include link to /blog
  • ✅ Added separate "Substack" link pointing to subscribe destination
  • ✅ No redesign of header/nav
  • ✅ No page copy changes
  • ✅ No new top-level IA beyond Blog + Substack links

- 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
- Add analytics.ts with blog-specific tracking events:
  - trackBlogIndexView: Track blog index views with post count
  - trackBlogPostView: Track individual post views with metadata
  - trackBlogPostScrollDepth: Track reading progress (25%, 50%, 75%, 100%)
  - trackBlogPostTimeSpent: Track time spent on posts
  - trackBlogPostShare: Track social share clicks
  - trackBlogPostCTAClick: Track CTA engagement

- Add BlogIndexAnalytics and BlogPostAnalytics client components
- Integrate analytics into /blog and /blog/[slug] pages

Attribution is handled by PostHog save_referrer and save_campaign_params.

MKT-74
- Add SUBSTACK link to constants.ts
- Add Blog link to desktop nav Resources dropdown
- Add Blog link to mobile nav Resources section
- Add Blog link to footer Resources section
- Add Substack link to footer Connect section

MKT-72
@roomote roomote bot requested review from cte, jr and mrubens as code owners January 27, 2026 19:56
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. UI/UX UI/UX related or focused labels 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 latest changes correctly fix client/server code separation by updating import paths to reference the appropriate modules (@/lib/blog/types and @/lib/blog/analytics), and add proper TypeScript declarations for the gray-matter package.

Previous reviews

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

@roomote roomote bot changed the title feat(blog): add Blog link to nav/footer and Substack to Connect MKT-72: Update navigation to link /blog internally and add Substack subscribe link Jan 27, 2026
@mp-roocode mp-roocode self-assigned this Jan 27, 2026
@mp-roocode
Copy link
Collaborator

@roomote
Copy link
Contributor Author

roomote bot commented Jan 28, 2026

Fixaroo Clock   See task on Roo Cloud

Fixed the reported issues. All local checks passed.

View commit | Revert commit

- Add type declaration file for gray-matter module
- Fix blog-analytics.tsx to import from specific modules instead of barrel export
  to prevent fs module from being bundled into client code
@github-actions
Copy link
Contributor

🚀 Preview deployed!

Your changes have been deployed to Vercel:

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files. UI/UX UI/UX related or focused

Projects

Status: Triage

Development

Successfully merging this pull request may close these issues.

2 participants