Debug: Date Analysis

By Claude Sonnet 4.5, Jay Griffin*Claude built this debug tool to solve the invalid date bugΒ·Β  January 30, 2026
docs
🏷️ Tags:debugtoolsdatesmetadatatroubleshooting

Comprehensive debugging tool for inspecting content metadata dates. Created to diagnose and fix the "invalid date" bug on the homepage.

πŸ› The Invalid Date Bug

Problem: An "invalid date" was appearing on the homepage content listings, but we couldn't identify which content item had the malformed date.

Root Cause: The getAllAppRoutes() function in src/lib/posts.ts was attempting to dynamically import all app route pages to extract their routeMetadata. However, the about-me page uses the 'use client' directive because it requires Emotion styled-components.

Why It Failed: Client components cannot be imported in server-side code. When Next.js tried to import the about-me client component during server-side rendering, the import failed silently or returned malformed data, resulting in an invalid date object being passed to new Date().

The Fix: Updated getAllAppRoutes() to check if a file starts with 'use client' before attempting to import it. Client components are now skipped during the app route scan, preventing the import error.

Side Note: During investigation, I also found and fixed a malformed date in codeblock-showcase.tsx (was using '2026-01-19' instead of the full ISO 8601 format '2026-01-19T00:00:00Z').

What This Page Does: This debug tool loads all content from posts, docs, and app routes, then displays each item's metadata with clear visual indicators for valid vs invalid dates. Items with invalid dates appear at the top with red highlighting.

πŸ” Full Date Data Dump

Total content items: 62

βœ… Valid
SOURCE: navbar-particle-effects
Title: NavBar Component
Slug: navbar-component
Type: doc
Path: N/A
date: "2026-02-03T10:00:00Z"
Parsed: 2026-02-03T10:00:00.000Z
Full metadata dump
{
  "title": "NavBar Component",
  "slug": "navbar-component",
  "date": "2026-02-03T10:00:00Z",
  "description": "The fixed navigation bar that lives at the top of every page, featuring an animated title, search navigator, and menu system with elegant mobile responsiveness.",
  "type": "doc",
  "tags": [
    "components",
    "navigation",
    "animation",
    "mobile"
  ],
  "feature": "navbar",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Collaboratively written with Claude by summarizing work done and analyzing the code"
}
βœ… Valid
SOURCE: content-header-test
Title: ContentHeader Component Test Cases
Slug: content-header-test
Type: post
Path: N/A
date: "2026-02-02T10:00:00Z"
Parsed: 2026-02-02T10:00:00.000Z
updated: "2026-02-03T10:00:00Z2026-02-02T15:00:00Z2026-02-02T12:00:00Z2026-02-01T18:00:00Z2026-01-31T14:00:00Z2026-01-30T10:00:00Z2026-01-29T16:00:00Z2026-01-28T11:00:00Z2026-01-27T09:00:00Z2026-01-26T13:00:00Z"
Parsed: 2026-02-03T10:00:00.000Z
Full metadata dump
{
  "title": "ContentHeader Component Test Cases",
  "slug": "content-header-test",
  "date": "2026-02-02T10:00:00Z",
  "description": "Edge case testing for the ContentHeader component with various metadata configurations.",
  "tags": [
    "dev",
    "testing",
    "components"
  ],
  "type": "post",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "This is an extremely long authorship note to test tooltip overflow behavior and the auto-flip positioning logic. The content was collaboratively created through an iterative development process involving extensive AI-assisted code generation, edge case identification, and component refinement. This note intentionally contains multiple sentences to test how the tooltip handles very tall content that might overflow the viewport boundaries.",
  "updated": [
    "2026-02-03T10:00:00Z",
    "2026-02-02T15:00:00Z",
    "2026-02-02T12:00:00Z",
    "2026-02-01T18:00:00Z",
    "2026-01-31T14:00:00Z",
    "2026-01-30T10:00:00Z",
    "2026-01-29T16:00:00Z",
    "2026-01-28T11:00:00Z",
    "2026-01-27T09:00:00Z",
    "2026-01-26T13:00:00Z"
  ]
}
βœ… Valid
SOURCE: why-i-write-in-my-ide
Title: Why I Write Everything in My IDE Now
Slug: why-i-write-in-my-ide
Type: post
Path: /posts/why-i-write-in-my-ide
date: "2026-02-02T00:00:00Z"
Parsed: 2026-02-02T00:00:00.000Z
Full metadata dump
{
  "title": "Why I Write Everything in My IDE Now",
  "slug": "why-i-write-in-my-ide",
  "date": "2026-02-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "AI-Assisted - Jay's workflow insights, Claude structured the explanation",
  "description": "AI coding assistants changed how I create content - repo-wide context, multi-file operations, and instant publishing make traditional writing tools obsolete for my workflow",
  "tags": [
    "ai",
    "writing",
    "workflow",
    "dev",
    "productivity",
    "ide",
    "content-creation"
  ],
  "path": "/posts/why-i-write-in-my-ide"
}
βœ… Valid
SOURCE: cloudflare-tunnel-deploy-notifications
Title: Cloudflare Tunnel + Vercel Webhook Deploy Notifications
Slug: cloudflare-tunnel-deploy-notifications
Type: post
Path: N/A
date: "2026-02-02T00:00:00Z"
Parsed: 2026-02-02T00:00:00.000Z
Full metadata dump
{
  "title": "Cloudflare Tunnel + Vercel Webhook Deploy Notifications",
  "slug": "cloudflare-tunnel-deploy-notifications",
  "date": "2026-02-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Written by Claude Sonnet 4.5 after Jay inquired about deployment notifications feature",
  "description": "My master plan to get a satisfying ding sound on my Mac every time a Vercel deployment goes live. Time to stop refresh-spamming and get notified automatically.",
  "tags": [
    "dev",
    "deployment",
    "automation",
    "vercel",
    "cloudflare"
  ],
  "type": "post"
}
βœ… Valid
SOURCE: building-timeline-component
Title: Building an Interactive Timeline Component
Slug: building-timeline-component
Type: post
Path: /posts/building-timeline-component
date: "2026-01-31T00:00:00Z"
Parsed: 2026-01-31T00:00:00.000Z
Full metadata dump
{
  "title": "Building an Interactive Timeline Component",
  "slug": "building-timeline-component",
  "date": "2026-01-31T00:00:00Z",
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "AI-generated based on summary of work done on component",
  "description": "Deep dive into creating a custom SVG-based timeline component with hover interactions, dynamic positioning, and responsive year labels",
  "tags": [
    "dev",
    "react",
    "components",
    "svg",
    "design"
  ],
  "path": "/posts/building-timeline-component"
}
βœ… Valid
SOURCE: debug-dates
Title: Debug: Date Analysis
Slug: debug-dates
Type: doc
Path: N/A
date: "2026-01-30T12:00:00Z"
Parsed: 2026-01-30T12:00:00.000Z
Full metadata dump
{
  "title": "Debug: Date Analysis",
  "slug": "debug-dates",
  "date": "2026-01-30T12:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "authorshipNote": "Claude built this debug tool to solve the invalid date bug",
  "description": "Comprehensive debugging tool for inspecting content metadata dates. Created to diagnose and fix the \"invalid date\" bug on the homepage.",
  "tags": [
    "debug",
    "tools",
    "dates",
    "metadata",
    "troubleshooting"
  ],
  "type": "doc"
}
βœ… Valid
SOURCE: ai_calculator_moment
Title: The Calculator Moment: AI as a Universal Information Innovation
Slug: ai-calculator-moment
Type: post
Path: N/A
date: "2026-01-30T00:00:00Z"
Parsed: 2026-01-30T00:00:00.000Z
Full metadata dump
{
  "title": "The Calculator Moment: AI as a Universal Information Innovation",
  "slug": "ai-calculator-moment",
  "date": "2026-01-30T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Jay's perspective on AI adoption patterns, Claude articulated the argument",
  "type": "post",
  "description": "AI isn't categorically different from calculators or any tool innovationβ€”it's just the calculator moment happening to every domain simultaneously at unprecedented speed",
  "tags": [
    "ai",
    "tools",
    "adoption",
    "education",
    "perspective",
    "calculator-moment",
    "amplification"
  ]
}
βœ… Valid
SOURCE: project-launchpad-spec
Title: Feature Spec: Project Launchpad System
Slug: project-launchpad-spec
Type: doc
Path: N/A
date: "2026-01-30T00:00:00Z"
Parsed: 2026-01-30T00:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: Project Launchpad System",
  "slug": "project-launchpad-spec",
  "date": "2026-01-30T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ€– AI Generated",
  "type": "doc",
  "description": "Frictionless system for showcasing development projects - make adding new projects feel as easy as publishing a blog post",
  "tags": [
    "feature-spec",
    "projects",
    "portfolio",
    "ux",
    "content-system",
    "showcase"
  ]
}
βœ… Valid
SOURCE: thumbnail-metadata-spec
Title: Feature Spec: Content Thumbnail Metadata System
Slug: thumbnail-metadata-spec
Type: doc
Path: N/A
date: "2026-01-30T00:00:00Z"
Parsed: 2026-01-30T00:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: Content Thumbnail Metadata System",
  "slug": "thumbnail-metadata-spec",
  "date": "2026-01-30T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ€– AI Generated",
  "type": "doc",
  "description": "Add visual thumbnail support to all content types (posts, projects, pages) for improved visual appeal, social sharing, and user engagement",
  "tags": [
    "feature-spec",
    "images",
    "thumbnails",
    "metadata",
    "social-sharing",
    "open-graph",
    "visual-design"
  ]
}
βœ… Valid
SOURCE: semantic-compression-for-ai-2
Title: Semantic Controls for AI Workflows Part 2
Slug: semantic-controls-for-ai-2
Type: post
Path: N/A
date: "2026-01-29T00:00:00Z"
Parsed: 2026-01-29T00:00:00.000Z
Full metadata dump
{
  "title": "Semantic Controls for AI Workflows Part 2",
  "slug": "semantic-controls-for-ai-2",
  "date": "2026-01-29T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Conversation synthesis exploring schema-based AI control systems",
  "type": "post",
  "description": "AI as an intelligence building block",
  "tags": [
    "ai",
    "semantic-compression",
    "schemas",
    "structured-outputs",
    "zod",
    "control-systems",
    "web-development"
  ]
}
βœ… Valid
SOURCE: voice-note-feature
Title: Audio as Optional Prop: Adding Human Commentary to AI Content
Slug: audio-primitive
Type: doc
Path: N/A
date: "2026-01-29T00:00:00Z"
Parsed: 2026-01-29T00:00:00.000Z
updated: "2026-02-02T00:00:00Z"
Parsed: 2026-02-02T00:00:00.000Z
Full metadata dump
{
  "title": "Audio as Optional Prop: Adding Human Commentary to AI Content",
  "slug": "audio-primitive",
  "date": "2026-01-29T00:00:00Z",
  "updated": "2026-02-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Jay's design evolution, Claude documented the spec",
  "type": "doc",
  "description": "Feature spec for audio as optional prop on content primitives - attach human commentary to any component",
  "tags": [
    "feature-spec",
    "audio",
    "ai-content",
    "primitives",
    "design-systems",
    "transparency"
  ]
}
βœ… Valid
SOURCE: llm-seo-roadmap
Title: LLM SEO Implementation Roadmap
Slug: llm-seo-roadmap
Type: doc
Path: N/A
date: "2026-01-29T00:00:00Z"
Parsed: 2026-01-29T00:00:00.000Z
Full metadata dump
{
  "title": "LLM SEO Implementation Roadmap",
  "slug": "llm-seo-roadmap",
  "date": "2026-01-29T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Jay's strategy research, Claude structured the roadmap",
  "type": "doc",
  "description": "A practical guide to optimizing your site for AI-powered search and LLM discoverability - actionable strategies for appearing in ChatGPT, Claude, Perplexity, and other LLM-generated responses",
  "tags": [
    "seo",
    "llm",
    "ai-search",
    "optimization",
    "discoverability",
    "content-strategy",
    "roadmap"
  ]
}
βœ… Valid
SOURCE: structured-outputs
Title: Structured Outputs: AI as JSON API for Decisionmaking
Slug: structured-outputs
Type: post
Path: N/A
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "Structured Outputs: AI as JSON API for Decisionmaking",
  "slug": "structured-outputs",
  "date": "2026-01-27T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Jay's explanation, Claude wrote it",
  "type": "post",
  "description": "Separating probabilistic thinking from deterministic execution",
  "tags": [
    "ai",
    "structured-outputs",
    "json-schema",
    "architecture",
    "llm"
  ]
}
βœ… Valid
SOURCE: work-at-the-speed-of-thought
Title: The Approve β†’ Regenerate β†’ Edit Loop
Slug: approve-regenerate-edit-loop
Type: post
Path: N/A
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "The Approve β†’ Regenerate β†’ Edit Loop",
  "slug": "approve-regenerate-edit-loop",
  "date": "2026-01-27T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Jay's philosophy, Claude structured it",
  "type": "post",
  "description": "The fundamental AI-assisted workflow: approve output, regenerate if wrong, edit to polish. Every bit of friction you remove compounds exponentially.",
  "tags": [
    "ai",
    "workflow",
    "productivity",
    "natural-language",
    "development"
  ]
}
βœ… Valid
SOURCE: semantic-compression-for-ai
Title: Semantic Controls for AI Workflows
Slug: semantic-controls-for-ai
Type: post
Path: N/A
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "Semantic Controls for AI Workflows",
  "slug": "semantic-controls-for-ai",
  "date": "2026-01-27T00:00:00Z",
  "author": [
    "Jay Griffin, Claude Sonnet 4.5"
  ],
  "authorshipNote": "πŸ”§ AI-Assisted - Conversation synthesis of Jay's ideas that Claude structured and articulated",
  "type": "post",
  "description": "Exploring how to compress semantic meaning into symbolic syntax for more efficient AI prompting and higher-quality AI-generated outputs",
  "tags": [
    "ai",
    "semantic-compression",
    "dsl",
    "markdown",
    "llm",
    "prompt-engineering",
    "code-generation"
  ]
}
βœ… Valid
SOURCE: content-editor
Title: Feature Spec: Dev-Mode WYSIWYG Content Editor
Slug: content-editor
Type: doc
Path: N/A
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: Dev-Mode WYSIWYG Content Editor",
  "slug": "content-editor",
  "date": "2026-01-27T00:00:00Z",
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "πŸ€– AI-generated",
  "type": "doc",
  "description": "A development-only inline content editor for markdown files that enables quick content updates without manually editing files in an IDE.",
  "tags": [
    "feature-spec",
    "dev-tools",
    "content",
    "editor"
  ],
  "status": "Planning"
}
βœ… Valid
SOURCE: life-logger
Title: AI Life Logger - Product Vision
Slug: life-logger
Type: doc
Path: N/A
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "AI Life Logger - Product Vision",
  "slug": "life-logger",
  "date": "2026-01-27T00:00:00Z",
  "author": "Jay Griffin",
  "authorshipNote": "πŸ”§ AI-Assisted",
  "type": "doc",
  "description": "A frictionless life logging and time tracking system using natural language AI interface for effortless tracking and behavioral insights",
  "tags": [
    "product-vision",
    "ai",
    "life-logging",
    "time-tracking",
    "productivity",
    "natural-language"
  ],
  "status": "Planning"
}
βœ… Valid
SOURCE: features/page.tsx
Title: jaygriff.com Features
Slug: features
Type: doc
Path: /features
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
updated: "2026-02-03T00:00:00Z"
Parsed: 2026-02-03T00:00:00.000Z
Full metadata dump
{
  "title": "jaygriff.com Features",
  "slug": "features",
  "date": "2026-01-27T00:00:00Z",
  "updated": "2026-02-03T00:00:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "description": "Comprehensive list of features, architecture decisions, and capabilities that make this site a powerful development platform",
  "tags": [
    "features",
    "completed",
    "architecture",
    "development"
  ],
  "path": "/features"
}
βœ… Valid
SOURCE: readers-guide/page.tsx
Title: Reader's Guide
Slug: readers-guide
Type: doc
Path: /readers-guide
date: "2026-01-27T00:00:00Z"
Parsed: 2026-01-27T00:00:00.000Z
Full metadata dump
{
  "title": "Reader's Guide",
  "slug": "readers-guide",
  "date": "2026-01-27T00:00:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "tags": [
    "meta",
    "transparency",
    "ai",
    "disclaimers"
  ],
  "description": "How to interpret content labels, understand workflow transparency, and what guarantees (or lack thereof) apply to content on this site.",
  "path": "/readers-guide"
}
βœ… Valid
SOURCE: privacy-policy/page.tsx
Title: Privacy Policy
Slug: privacy-policy
Type: doc
Path: /privacy-policy
date: "2026-01-26T16:00:00Z"
Parsed: 2026-01-26T16:00:00.000Z
Full metadata dump
{
  "title": "Privacy Policy",
  "slug": "privacy-policy",
  "date": "2026-01-26T16:00:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "description": "Privacy policy for jaygriff.com covering analytics data collection and usage.",
  "tags": [
    "privacy",
    "legal",
    "analytics",
    "policy"
  ],
  "path": "/privacy-policy"
}
βœ… Valid
SOURCE: app-routes-path-strategy
Title: App Routes Path Strategy
Slug: app-routes-path-strategy
Type: doc
Path: N/A
date: "2026-01-26T15:00:00Z"
Parsed: 2026-01-26T15:00:00.000Z
Full metadata dump
{
  "title": "App Routes Path Strategy",
  "slug": "app-routes-path-strategy",
  "date": "2026-01-26T15:00:00Z",
  "description": "Analysis and decision on how to handle path metadata for app routes: derive from file structure vs explicit metadata.",
  "type": "doc",
  "tags": [
    "architecture",
    "routing",
    "metadata",
    "design-decision"
  ],
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "πŸ€– AI-Generated (100%)"
}
βœ… Valid
SOURCE: debug-app-routes
Title: Debug: App Routes Discovery
Slug: debug-app-routes
Type: doc
Path: N/A
date: "2026-01-26T14:00:00Z"
Parsed: 2026-01-26T14:00:00.000Z
Full metadata dump
{
  "title": "Debug: App Routes Discovery",
  "slug": "debug-app-routes",
  "date": "2026-01-26T14:00:00Z",
  "description": "Testing the getAllAppRoutes() function to see what routes are discovered.",
  "type": "doc",
  "tags": [
    "debug",
    "testing"
  ],
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "πŸ€– AI-Generated (100%)"
}
βœ… Valid
SOURCE: markdown-table-test
Title: Markdown Table Test
Slug: markdown-table-test
Type: doc
Path: N/A
date: "2026-01-26T12:30:00Z"
Parsed: 2026-01-26T12:30:00.000Z
Full metadata dump
{
  "title": "Markdown Table Test",
  "slug": "markdown-table-test",
  "date": "2026-01-26T12:30:00Z",
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "πŸ€– AI-Generated",
  "type": "doc",
  "description": "Testing GFM table syntax rendering with primitive table components.",
  "tags": [
    "markdown",
    "tables",
    "testing"
  ]
}
βœ… Valid
SOURCE: table-examples
Title: Table Component Examples
Slug: table-examples
Type: doc
Path: N/A
date: "2026-01-26T12:00:00Z"
Parsed: 2026-01-26T12:00:00.000Z
Full metadata dump
{
  "title": "Table Component Examples",
  "slug": "table-examples",
  "date": "2026-01-26T12:00:00Z",
  "author": "Jay Griffin",
  "authorshipNote": "πŸ€– AI-Generated (100%)",
  "type": "doc",
  "description": "Testing the new primitive table components with various data examples.",
  "tags": [
    "components",
    "primitives",
    "tables",
    "examples"
  ]
}
βœ… Valid
SOURCE: metadata-scanner/page.tsx
Title: Metadata Scanner
Slug: metadata-scanner
Type: doc
Path: /metadata-scanner
date: "2026-01-26T00:00:00Z"
Parsed: 2026-01-26T00:00:00.000Z
Full metadata dump
{
  "title": "Metadata Scanner",
  "slug": "metadata-scanner",
  "date": "2026-01-26T00:00:00Z",
  "description": "View all content metadata in a comprehensive table showing every field from PostMeta interface.",
  "type": "doc",
  "tags": [
    "tools",
    "metadata",
    "admin"
  ],
  "author": "Claude Sonnet 4.5",
  "authorshipNote": "πŸ€– AI-Generated (100%)",
  "path": "/metadata-scanner"
}
βœ… Valid
SOURCE: my-tools/page.tsx
Title: My Tools & Stack
Slug: my-tools
Type: doc
Path: /my-tools
date: "2026-01-26T00:00:00Z"
Parsed: 2026-01-26T00:00:00.000Z
Full metadata dump
{
  "title": "My Tools & Stack",
  "slug": "my-tools",
  "date": "2026-01-26T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "description": "The tools, languages, and stack I use for web development and creative work",
  "tags": [
    "tools",
    "stack",
    "dev"
  ],
  "type": "doc",
  "path": "/my-tools"
}
βœ… Valid
SOURCE: sticky-navbar-search
Title: Bottom Taskbar with Persistent Search
Slug: bottom-taskbar-search
Type: doc
Path: N/A
date: "2026-01-23T13:30:00Z"
Parsed: 2026-01-23T13:30:00.000Z
Full metadata dump
{
  "title": "Bottom Taskbar with Persistent Search",
  "slug": "bottom-taskbar-search",
  "date": "2026-01-23T13:30:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "tags": [
    "todo",
    "ui",
    "navigation",
    "search",
    "ux",
    "taskbar"
  ],
  "status": "open",
  "priority": "high"
}
βœ… Valid
SOURCE: todo-system-organization
Title: Todo System Organization & Status Tracking
Slug: todo-system-organization
Type: doc
Path: N/A
date: "2026-01-23T13:00:00Z"
Parsed: 2026-01-23T13:00:00.000Z
Full metadata dump
{
  "title": "Todo System Organization & Status Tracking",
  "slug": "todo-system-organization",
  "date": "2026-01-23T13:00:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "tags": [
    "todo",
    "meta",
    "organization",
    "workflow",
    "feature-spec"
  ]
}
βœ… Valid
SOURCE: todo-update-authorship-metadata
Title: Update Authorship Metadata Across All Posts
Slug: todo-update-authorship-metadata
Type: doc
Path: N/A
date: "2026-01-23T12:30:00Z"
Parsed: 2026-01-23T12:30:00.000Z
Full metadata dump
{
  "title": "Update Authorship Metadata Across All Posts",
  "slug": "todo-update-authorship-metadata",
  "date": "2026-01-23T12:30:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "tags": [
    "todo",
    "metadata",
    "authorship",
    "bulk-edit",
    "transparency"
  ]
}
βœ… Valid
SOURCE: feature-spec-private-content
Title: Feature Spec: Private Content System
Slug: feature-spec-private-content
Type: doc
Path: N/A
date: "2026-01-23T12:00:00Z"
Parsed: 2026-01-23T12:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: Private Content System",
  "slug": "feature-spec-private-content",
  "date": "2026-01-23T12:00:00Z",
  "author": "Jay Griffin, Claude Sonnet 4.5",
  "authorshipNote": "Claude wrote this spec based on Jay's requirements for practical offline productivity.",
  "description": "Comprehensive feature spec for private/offline content creation. Enables sensitive documents, personal todos, and local-only work within the same system used for public content.",
  "type": "doc",
  "tags": [
    "feature-spec",
    "privacy",
    "offline",
    "architecture",
    "productivity"
  ]
}
βœ… Valid
SOURCE: ai-workflow-transparency
Title: AI Workflow Transparency: A Framework
Slug: ai-workflow-transparency
Type: post
Path: N/A
date: "2026-01-23T00:00:00Z"
Parsed: 2026-01-23T00:00:00.000Z
Full metadata dump
{
  "title": "AI Workflow Transparency: A Framework",
  "slug": "ai-workflow-transparency",
  "date": "2026-01-23T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "post",
  "description": "Why transparency about AI use ultimately respects your audience and yourself",
  "tags": [
    "ai",
    "transparency",
    "workflow",
    "ethics"
  ]
}
βœ… Valid
SOURCE: todo-docs-homepage
Title: TODO: Decide on /docs routing strategy
Slug: todo-docs-homepage
Type: doc
Path: N/A
date: "2026-01-23T00:00:00Z"
Parsed: 2026-01-23T00:00:00.000Z
Full metadata dump
{
  "title": "TODO: Decide on /docs routing strategy",
  "slug": "todo-docs-homepage",
  "date": "2026-01-23T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "doc",
  "description": "Figure out whether to create dedicated /docs page or surface all docs on homepage via Navigator",
  "tags": [
    "todo",
    "routing",
    "navigation",
    "ux"
  ]
}
βœ… Valid
SOURCE: todo-hide-header-metadata
Title: TODO: Add hideHeader metadata field
Slug: todo-hide-header-metadata
Type: doc
Path: N/A
date: "2026-01-23T00:00:00Z"
Parsed: 2026-01-23T00:00:00.000Z
Full metadata dump
{
  "title": "TODO: Add hideHeader metadata field",
  "slug": "todo-hide-header-metadata",
  "date": "2026-01-23T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "doc",
  "description": "Add optional metadata field to hide ContentHeader component for non-standard pages like about-me",
  "tags": [
    "todo",
    "metadata",
    "ui",
    "content-system"
  ]
}
βœ… Valid
SOURCE: codeblock-showcase
Title: CodeBlock Component Showcase
Slug: codeblock-showcase
Type: post
Path: N/A
date: "2026-01-21T00:00:00Z"
Parsed: 2026-01-21T00:00:00.000Z
updated: "2026-02-03T00:00:00Z2026-02-02T00:00:00Z"
Parsed: 2026-02-03T00:00:00.000Z
Full metadata dump
{
  "title": "CodeBlock Component Showcase",
  "slug": "codeblock-showcase",
  "date": "2026-01-21T00:00:00Z",
  "description": "Testing and showcasing all CodeBlock component configurations including bash/shell and markdown support",
  "tags": [
    "dev",
    "components",
    "testing"
  ],
  "type": "post",
  "author": [
    "Jay Griffin"
  ],
  "updated": [
    "2026-02-03T00:00:00Z",
    "2026-02-02T00:00:00Z"
  ]
}
βœ… Valid
SOURCE: hierarchical-pages-spec
Title: Hierarchical Pages Feature Spec
Slug: hierarchical-pages-spec
Type: doc
Path: N/A
date: "2026-01-21T00:00:00Z"
Parsed: 2026-01-21T00:00:00.000Z
Full metadata dump
{
  "title": "Hierarchical Pages Feature Spec",
  "slug": "hierarchical-pages-spec",
  "date": "2026-01-21T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "type": "doc",
  "projectId": "jaygriff",
  "description": "Technical specification for parent-child page relationships with automatic routing and dev-mode creation.",
  "tags": [
    "feature-spec",
    "routing",
    "content-system"
  ]
}
βœ… Valid
SOURCE: about-this-site/page.tsx
Title: About This Site
Slug: about-this-site
Type: doc
Path: /about-this-site
date: "2026-01-21T00:00:00Z"
Parsed: 2026-01-21T00:00:00.000Z
Full metadata dump
{
  "title": "About This Site",
  "slug": "about-this-site",
  "date": "2026-01-21T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "type": "doc",
  "projectId": "jaygriff",
  "description": "What this site is and how it works.",
  "tags": [
    "meta",
    "about"
  ],
  "authorshipNote": "Claude wrote this based on Jay's direction and edits.",
  "path": "/about-this-site"
}
βœ… Valid
SOURCE: accounting-to-dev
Title: Accounting β†’ Software Development?
Slug: accounting-to-dev
Type: post
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "Accounting β†’ Software Development?",
  "slug": "accounting-to-dev",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Jay provided the story and context, Claude structured and wrote the post, Jay edited and refined",
  "type": "post",
  "description": "From debits and credits to TypeScript: how an accounting degree became the foundation for a career in software development",
  "tags": [
    "career",
    "accounting",
    "self-taught",
    "journey",
    "excel"
  ]
}
βœ… Valid
SOURCE: ai-as-precision-editor
Title: AI For Code Editing: Why I Won't Code Without It
Slug: ai-code-editing
Type: post
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "AI For Code Editing: Why I Won't Code Without It",
  "slug": "ai-code-editing",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Jay provided the concept and workflow insights, Claude wrote the post with illustrative coding scenarios",
  "type": "post",
  "description": "It's not about AI writing my code. It's about having a precision text manipulation interface that makes programming fundamentally more efficient.",
  "tags": [
    "ai",
    "workflow",
    "productivity",
    "tools"
  ]
}
βœ… Valid
SOURCE: metadata-paradox
Title: The Metadata Paradox: Automating What You Don't Need Yet
Slug: metadata-paradox
Type: post
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "The Metadata Paradox: Automating What You Don't Need Yet",
  "slug": "metadata-paradox",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Conversation between Jay and Claude about when to factor, synthesized by Claude",
  "type": "post",
  "projectId": "jaygriff",
  "description": "Should every page have metadata? Should I automate adding metadata? Do I even need metadata on non-content pages? The irony of documenting this decision.",
  "tags": [
    "meta",
    "automation",
    "yagni",
    "factoring",
    "developer-experience"
  ]
}
βœ… Valid
SOURCE: why-react-components-rule
Title: Why React Components Rule
Slug: why-react-components-rule
Type: post
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "Why React Components Rule",
  "slug": "why-react-components-rule",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "post",
  "description": "Encapsulation means I can write the most cursed code imaginable and it's totally fine",
  "tags": [
    "react",
    "components",
    "web-dev",
    "philosophy"
  ]
}
βœ… Valid
SOURCE: codeblock-backtick-bug
Title: CodeBlock Backtick Bug: Template Literals and Prism.js
Slug: codeblock-backtick-bug
Type: doc
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "CodeBlock Backtick Bug: Template Literals and Prism.js",
  "slug": "codeblock-backtick-bug",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Claude Opus 4.5"
  ],
  "authorshipNote": "Documented after debugging this issue with Jay for way too long",
  "type": "doc",
  "projectId": "jaygriff",
  "feature": "CodeBlock",
  "description": "Why template literals with backticks break Prism.js syntax highlighting in CodeBlock components, and how to fix it",
  "tags": [
    "debugging",
    "prism",
    "codeblock",
    "styled-components",
    "gotcha"
  ]
}
βœ… Valid
SOURCE: markdown-renderer-implementation
Title: Building a Markdown Renderer: Lessons from the Trenches
Slug: markdown-renderer-implementation
Type: doc
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "Building a Markdown Renderer: Lessons from the Trenches",
  "slug": "markdown-renderer-implementation",
  "date": "2026-01-20T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Claude wrote this doc to summarize the markdown support implementation work",
  "type": "doc",
  "projectId": "jaygriff",
  "feature": "Markdown Support",
  "description": "How we built a markdown rendering system with react-markdown, and all the edge cases that broke along the way",
  "tags": [
    "markdown",
    "react",
    "debugging",
    "implementation",
    "react-markdown"
  ]
}
βœ… Valid
SOURCE: safari-margin-hack
Title: The Safari Margin Collapse Hack
Slug: safari-margin-hack
Type: doc
Path: N/A
date: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "The Safari Margin Collapse Hack",
  "slug": "safari-margin-hack",
  "date": "2026-01-20T00:00:00Z",
  "author": "Claude Sonnet 4.5",
  "type": "doc",
  "projectId": "jaygriff",
  "description": "Why we have a mysterious 1px padding on the body element",
  "tags": [
    "safari",
    "css",
    "hack",
    "margin-collapse"
  ]
}
βœ… Valid
SOURCE: accidental-notion-clone
Title: How My Site Accidentally Became a Notion Clone
Slug: accidental-notion-clone
Type: post
Path: N/A
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "How My Site Accidentally Became a Notion Clone",
  "slug": "accidental-notion-clone",
  "date": "2026-01-19T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "authorshipNote": "Jay told Claude to make a post, Claude wrote it, lightly edited by Jay",
  "type": "post",
  "projectId": "jaygriff",
  "description": "Notion pls no sue",
  "tags": [
    "design",
    "notion",
    "constraints",
    "markdown"
  ]
}
βœ… Valid
SOURCE: routing-strategy
Title: Routing Strategy: Multi-Project Architecture
Slug: routing-strategy
Type: doc
Path: N/A
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "Routing Strategy: Multi-Project Architecture",
  "slug": "routing-strategy",
  "date": "2026-01-19T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5"
  ],
  "type": "doc",
  "projectId": "jaygriff",
  "description": "How we structure URLs and content for multiple projects under one domain using metadata-based routing.",
  "tags": [
    "architecture",
    "nextjs",
    "routing",
    "multi-project"
  ]
}
βœ… Valid
SOURCE: server-components-refactor
Title: Server Components Refactor: From API Routes to Direct Loading
Slug: server-components-refactor
Type: doc
Path: N/A
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "Server Components Refactor: From API Routes to Direct Loading",
  "slug": "server-components-refactor",
  "date": "2026-01-19T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5"
  ],
  "type": "doc",
  "projectId": "jaygriff",
  "description": "How we refactored content loading from client-side API fetches to server-side direct imports, eliminating API routes and improving performance.",
  "tags": [
    "nextjs",
    "server-components",
    "refactoring",
    "performance"
  ]
}
βœ… Valid
SOURCE: dev/page.tsx
Title: Dev Tools
Slug: dev
Type: doc
Path: /dev
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "Dev Tools",
  "slug": "dev",
  "date": "2026-01-19T00:00:00Z",
  "description": "Internal dev routes, test utilities, and behind-the-scenes infrastructure.",
  "type": "doc",
  "tags": [
    "dev",
    "tools",
    "internal"
  ],
  "author": "Jay Griffin",
  "path": "/dev"
}
βœ… Valid
SOURCE: dev/test-parser/page.tsx
Title: Markdown Parser Test
Slug: test-parser
Type: doc
Path: /dev/test-parser
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "Markdown Parser Test",
  "slug": "test-parser",
  "date": "2026-01-19T00:00:00Z",
  "description": "Test the JSON frontmatter parser on markdown files.",
  "type": "doc",
  "tags": [
    "dev",
    "tools",
    "markdown",
    "parser"
  ],
  "author": "Jay Griffin",
  "projectId": "dev",
  "path": "/dev/test-parser"
}
βœ… Valid
SOURCE: roadmap/page.tsx
Title: jaygriff.com Roadmap
Slug: roadmap
Type: doc
Path: /roadmap
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "jaygriff.com Roadmap",
  "slug": "roadmap",
  "date": "2026-01-19T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "authorshipNote": "Claude writes, Jay edits and tells it to add stuff",
  "type": "doc",
  "projectId": "jaygriff",
  "description": "Active work, planned features, and long-term ideas for jaygriff.com.",
  "tags": [
    "roadmap",
    "planning",
    "features"
  ],
  "path": "/roadmap"
}
βœ… Valid
SOURCE: theme-editor/page.tsx
Title: Theme Editor
Slug: theme-editor
Type: doc
Path: /theme-editor
date: "2026-01-19T00:00:00Z"
Parsed: 2026-01-19T00:00:00.000Z
Full metadata dump
{
  "title": "Theme Editor",
  "slug": "theme-editor",
  "date": "2026-01-19T00:00:00Z",
  "description": "Visual theme editing with live preview.",
  "type": "doc",
  "tags": [
    "tools",
    "theme",
    "design"
  ],
  "author": "Jay Griffin",
  "path": "/theme-editor"
}
βœ… Valid
SOURCE: renaming-posts-to-pages
Title: Renaming src/posts/ to src/pages/
Slug: renaming-posts-to-pages
Type: doc
Path: N/A
date: "2026-01-17T23:00:00Z"
Parsed: 2026-01-17T23:00:00.000Z
Full metadata dump
{
  "title": "Renaming src/posts/ to src/pages/",
  "slug": "renaming-posts-to-pages",
  "description": "Comprehensive analysis of all code changes required to rename the content directory from src/posts/ to src/pages/",
  "date": "2026-01-17T23:00:00Z",
  "author": "Claude Sonnet 4.5",
  "type": "doc"
}
βœ… Valid
SOURCE: commit-content-system-refactor
Title: Content System Refactor - Docs/Posts Separation
Slug: content-system-refactor
Type: doc:commit
Path: N/A
date: "2026-01-17T22:30:00Z"
Parsed: 2026-01-17T22:30:00.000Z
Full metadata dump
{
  "title": "Content System Refactor - Docs/Posts Separation",
  "slug": "content-system-refactor",
  "date": "2026-01-17T22:30:00Z",
  "type": "doc:commit",
  "author": "Claude Sonnet 4.5",
  "feature": "Navigator",
  "projectId": "jaygriff",
  "commitHash": "9cbde96ec935dd5c7e2d6cf07ba8756d90d96d2e",
  "description": "Complete refactor of content infrastructure: separated docs from posts with type-based routing, added comprehensive metadata system, improved Navigator UX, and created ContentHeader component.",
  "tags": [
    "refactor",
    "routing",
    "metadata"
  ]
}
βœ… Valid
SOURCE: commit-2026-01-17-ui-polish
Title: UI Polish: Multi-Author Support & Inline Code Styling
Slug: ui-polish
Type: doc:commit
Path: N/A
date: "2026-01-17T22:00:00Z"
Parsed: 2026-01-17T22:00:00.000Z
Full metadata dump
{
  "title": "UI Polish: Multi-Author Support & Inline Code Styling",
  "slug": "ui-polish",
  "date": "2026-01-17T22:00:00Z",
  "author": "Claude Sonnet 4.5",
  "type": "doc:commit",
  "projectId": "jaygriff",
  "commitHash": "b63a18974c7906ec296394b62c8868ae7caacff3",
  "description": "Added multi-author support with tooltips for authorship context, refined inline code styling with electric blue accent, and various UI polish updates",
  "tags": [
    "ui",
    "styling",
    "metadata",
    "tooltip"
  ]
}
βœ… Valid
SOURCE: docs-routing
Title: Separating Docs from Posts: Routing Architecture
Slug: docs-routing
Type: doc
Path: N/A
date: "2026-01-17T21:00:00Z"
Parsed: 2026-01-17T21:00:00.000Z
Full metadata dump
{
  "title": "Separating Docs from Posts: Routing Architecture",
  "slug": "docs-routing",
  "date": "2026-01-17T21:00:00Z",
  "type": "doc",
  "author": "Claude Sonnet 4.5",
  "feature": "Navigator",
  "projectId": "jaygriff",
  "description": "How documentation pages are separated from blog posts using type-based routing, allowing docs to live at /docs/ while posts stay at /posts/.",
  "tags": [
    "routing",
    "nextjs",
    "architecture",
    "dev-docs"
  ]
}
βœ… Valid
SOURCE: navigator-feature
Title: Building the Navigator: A Route Search Tool
Slug: navigator-feature
Type: doc
Path: N/A
date: "2026-01-17T20:00:00Z"
Parsed: 2026-01-17T20:00:00.000Z
Full metadata dump
{
  "title": "Building the Navigator: A Route Search Tool",
  "slug": "navigator-feature",
  "date": "2026-01-17T20:00:00Z",
  "type": "doc",
  "author": "Claude Sonnet 4.5",
  "feature": "Navigator",
  "projectId": "jaygriff",
  "description": "A complete walkthrough of the Navigator feature - a popover search tool for quickly finding and navigating to any route in the application.",
  "tags": [
    "search",
    "routing",
    "architecture",
    "react",
    "nextjs",
    "dev-docs",
    "features"
  ]
}
βœ… Valid
SOURCE: markdown-format-rant
Title: Why Markdown Works (And Why Obsidian Misses the Point)
Slug: markdown-format-rant
Type: post
Path: N/A
date: "2026-01-17T00:00:00Z"
Parsed: 2026-01-17T00:00:00.000Z
Full metadata dump
{
  "title": "Why Markdown Works (And Why Obsidian Misses the Point)",
  "slug": "markdown-format-rant",
  "date": "2026-01-17T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "post",
  "description": "Markdown philosophy: constraints force clarity, syntax serves the parser, not the writer",
  "tags": [
    "markdown",
    "obsidian",
    "writing",
    "constraints",
    "philosophy"
  ]
}
βœ… Valid
SOURCE: llm-component-designer
Title: Intelligent Component Designer API
Slug: llm-component-designer
Type: doc
Path: N/A
date: "2026-01-17T00:00:00Z"
Parsed: 2026-01-17T00:00:00.000Z
Full metadata dump
{
  "title": "Intelligent Component Designer API",
  "slug": "llm-component-designer",
  "date": "2026-01-17T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "doc",
  "description": "Design document for an AI-powered component composition system using LLM intelligence with deterministic, type-safe output",
  "tags": [
    "llm",
    "ai",
    "component-design",
    "harness",
    "architecture"
  ]
}
βœ… Valid
SOURCE: programs-not-documents
Title: Why My Blog Posts Are Programs, Not Documents
Slug: programs-not-documents
Type: post
Path: N/A
date: "2026-01-13T21:40:00Z"
Parsed: 2026-01-13T21:40:00.000Z
Full metadata dump
{
  "title": "Why My Blog Posts Are Programs, Not Documents",
  "slug": "programs-not-documents",
  "date": "2026-01-13T21:40:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "authorshipNote": "AI-synthesized from my rants about markdown",
  "projectId": "jaygriff",
  "description": "Exploring why my blog posts are written as code instead of simple markdown files, and the tradeoffs that come with this approach.",
  "tags": [
    "react",
    "tsx",
    "markdown",
    "cms",
    "blogging",
    "typescript",
    "web-development",
    "content-strategy"
  ],
  "relatedPosts": [
    "md-vs-tsx"
  ]
}
βœ… Valid
SOURCE: site-summary
Title: Dynamic Routes in Next.js
Slug: dynamic-routes-nextjs
Type: doc
Path: N/A
date: "2026-01-13T21:32:55Z"
Parsed: 2026-01-13T21:32:55.000Z
updated: "2026-01-17T22:00:00Z"
Parsed: 2026-01-17T22:00:00.000Z
Full metadata dump
{
  "title": "Dynamic Routes in Next.js",
  "slug": "dynamic-routes-nextjs",
  "date": "2026-01-13T21:32:55Z",
  "updated": "2026-01-17T22:00:00Z",
  "type": "doc",
  "author": "Claude Sonnet 4.5",
  "feature": "Dynamic Routes",
  "projectId": "jaygriff",
  "description": "A summary of implementing dynamic routes for posts, improving the homepage layout, and ensuring Next.js compatibility.",
  "tags": [
    "nextjs",
    "routing",
    "typescript",
    "web-development",
    "dynamic-routes"
  ]
}
βœ… Valid
SOURCE: md-vs-tsx
Title: Content Architecture: TSX-First with markdown Fallback
Slug: md-vs-tsx
Type: post
Path: N/A
date: "2026-01-13T00:00:00Z"
Parsed: 2026-01-13T00:00:00.000Z
updated: "2026-01-20T00:00:00Z"
Parsed: 2026-01-20T00:00:00.000Z
Full metadata dump
{
  "title": "Content Architecture: TSX-First with markdown Fallback",
  "slug": "md-vs-tsx",
  "date": "2026-01-13T00:00:00Z",
  "author": "Claude Sonnet 4.5",
  "type": "post",
  "description": "Why TSX is the first-class citizen and Markdown is just an input format",
  "tags": [
    "architecture",
    "tsx",
    "markdown",
    "content"
  ],
  "relatedPosts": [
    "programs-not-documents"
  ],
  "updated": "2026-01-20T00:00:00Z"
}
βœ… Valid
SOURCE: tailwind-rant-blog
Title: Why I Choose CSS-in-JS Over Tailwind
Slug: tailwind-rant-blog
Type: post
Path: N/A
date: "2026-01-13T00:00:00Z"
Parsed: 2026-01-13T00:00:00.000Z
Full metadata dump
{
  "title": "Why I Choose CSS-in-JS Over Tailwind",
  "slug": "tailwind-rant-blog",
  "date": "2026-01-13T00:00:00Z",
  "author": [
    "Claude Sonnet 4.5",
    "Jay Griffin"
  ],
  "authorshipNote": "Jay ranted about Tailwind, Claude Sonnet 4.5 summarized and structured it",
  "type": "post",
  "description": "A personal defense of CSS-in-JS over Tailwind's utility-first approach",
  "tags": [
    "css",
    "tailwind",
    "css-in-js",
    "emotion",
    "styling"
  ]
}
βœ… Valid
SOURCE: WHY_NO_TAILWIND
Title: Why No Tailwind
Slug: why-no-tailwind
Type: post
Path: N/A
date: "2025-12-08T00:00:00Z"
Parsed: 2025-12-08T00:00:00.000Z
Full metadata dump
{
  "title": "Why No Tailwind",
  "slug": "why-no-tailwind",
  "date": "2025-12-08T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "post",
  "description": "Anti-Tailwind manifesto: why design tokens and CSS-in-JS beat utility classes",
  "tags": [
    "css",
    "tailwind",
    "emotion",
    "styling",
    "design-tokens"
  ]
}