MKT-72: Update navigation to link /blog internally and add Substack subscribe link - #11022
MKT-72: Update navigation to link /blog internally and add Substack subscribe link#11022ghost wants to merge 9 commits into
Conversation
- 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
Review complete. No issues found. The latest changes correctly fix client/server code separation by updating import paths to reference the appropriate modules ( Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues. |
|
@roomote fix the failing tests: |
Fixed the reported issues. All local checks passed. |
- 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
|
🚀 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. |
|
This was a Linear test, no need to merge |
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)SUBSTACK: "https://roocode.substack.com"for subscribe linkNavigation (
src/components/chromes/nav-bar.tsx)/blogin Resources dropdown (desktop)/blogin Resources section (mobile)Footer (
src/components/chromes/footer.tsx)/blogunder Resources sectionEXTERNAL_LINKS.SUBSTACKunder Connect sectionDefinition of Done
/blogPragmatic Containment
Changes are limited to shared chrome only (nav/footer/constants) as required:
/blog