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: 94

โœ… Valid
SOURCE: contact/page.tsx
Title: Contact
Slug: contact
Type: doc
Path: /contact
date: "2026-03-13T00:00:00Z"
Parsed: 2026-03-13T00:00:00.000Z
Full metadata dump
{
  "title": "Contact",
  "slug": "contact",
  "date": "2026-03-13T00:00:00Z",
  "author": "Jay Griffin",
  "type": "doc",
  "description": "Get in touch with Jay Griffin โ€” email, GitHub, or LinkedIn.",
  "tags": [
    "contact",
    "about"
  ],
  "path": "/contact"
}
โœ… Valid
SOURCE: fitness-dash-writeup
Title: Building a Health Data Dashboard with Garmin Data
Slug: garmin-sleep-dashboard
Type: post
Path: N/A
date: "2026-03-12T10:00:00Z"
Parsed: 2026-03-12T10:00:00.000Z
Full metadata dump
{
  "title": "Building a Health Data Dashboard with Garmin Data",
  "slug": "garmin-sleep-dashboard",
  "date": "2026-03-12T10:00:00Z",
  "description": "Trying to analyze my fitness data better than Garmin, Strava, and Apple.",
  "tags": [
    "dev",
    "health",
    "sqlite",
    "next.js",
    "data",
    "personal-tools"
  ],
  "image": "/images/projects/fitness-dash.png",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot"
}
โœ… Valid
SOURCE: debug-workspace-search
Title: Debug: Hammerspoon Workspace Search
Slug: debug-workspace-search
Type: doc
Path: N/A
date: "2026-03-04T12:00:00Z"
Parsed: 2026-03-04T12:00:00.000Z
Full metadata dump
{
  "title": "Debug: Hammerspoon Workspace Search",
  "slug": "debug-workspace-search",
  "date": "2026-03-04T12:00:00Z",
  "description": "Debugging the Hammerspoon workspace search script โ€” data model, known issues, and console log audit guide.",
  "type": "doc",
  "tags": [
    "debug",
    "hammerspoon",
    "macos"
  ],
  "author": [
    "Jay Griffin",
    "Claude Opus 4.6"
  ],
  "authorshipNote": "Claude Opus 4.6 via GitHub Copilot"
}
โœ… Valid
SOURCE: frontmatter-is-a-dead-end
Title: Frontmatter Is a Dead End (And Everything I Changed to Prove It)
Slug: frontmatter-is-a-dead-end
Type: post
Path: N/A
date: "2026-03-02T22:00:00Z"
Parsed: 2026-03-02T22:00:00.000Z
Full metadata dump
{
  "title": "Frontmatter Is a Dead End (And Everything I Changed to Prove It)",
  "slug": "frontmatter-is-a-dead-end",
  "date": "2026-03-02T22:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Opus 4.6"
  ],
  "authorshipNote": "Claude Opus 4.6 via GitHub Copilot",
  "type": "post",
  "description": "A marathon Copilot session that touched 70+ files, added relatedPosts everywhere โ€” and the realization that this whole content system sorely needs a database.",
  "tags": [
    "dev",
    "content-system",
    "sqlite",
    "prism",
    "p5js",
    "workflow",
    "retrospective"
  ],
  "relatedPosts": [
    "migrating-to-sqlite",
    "vibecoding-plasma-cosmos-evolution",
    "codeblock-showcase",
    "md-vs-tsx"
  ]
}
โœ… Valid
SOURCE: plasma-cosmos-vibecoded-evolution
Title: Vibecoding Plasma Cosmos from One-Prompt Toy to Real App
Slug: vibecoding-plasma-cosmos-evolution
Type: post
Path: N/A
date: "2026-03-02T18:00:00Z"
Parsed: 2026-03-02T18:00:00.000Z
Full metadata dump
{
  "title": "Vibecoding Plasma Cosmos from One-Prompt Toy to Real App",
  "slug": "vibecoding-plasma-cosmos-evolution",
  "date": "2026-03-02T18:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Opus 4.6"
  ],
  "authorshipNote": "Claude Opus 4.6 via GitHub Copilot",
  "type": "post",
  "description": "A Claude skill generated a generative art app in one prompt. Then I spent an evening vibecoding it with Opus into something I actually want to keep.",
  "tags": [
    "ai",
    "vibecoding",
    "generative-art",
    "p5js",
    "workflow",
    "claude"
  ],
  "relatedPosts": [
    "claude-skills-and-hosting-html"
  ]
}
โœ… Valid
SOURCE: debug-codeblocks
Title: Debug: All CodeBlock Languages (Markdown)
Slug: debug-codeblocks
Type: doc
Path: N/A
date: "2026-03-02T18:00:00Z"
Parsed: 2026-03-02T18:00:00.000Z
Full metadata dump
{
  "title": "Debug: All CodeBlock Languages (Markdown)",
  "slug": "debug-codeblocks",
  "date": "2026-03-02T18:00:00Z",
  "type": "doc",
  "description": "Test page for every configured CodeBlock language rendered through the markdown pipeline.",
  "tags": [
    "debug",
    "codeblock"
  ],
  "author": [
    "Jay Griffin",
    "Claude Opus 4.6"
  ],
  "authorshipNote": "Claude Opus 4.6 via GitHub Copilot",
  "relatedPosts": [
    "codeblock-showcase",
    "markdown-renderer-implementation"
  ]
}
โœ… Valid
SOURCE: mdx-does-not-win
Title: MDX Does Not Win On This Day
Slug: mdx-does-not-win
Type: post
Path: N/A
date: "2026-03-02T12:00:00Z"
Parsed: 2026-03-02T12:00:00.000Z
Full metadata dump
{
  "title": "MDX Does Not Win On This Day",
  "slug": "mdx-does-not-win",
  "date": "2026-03-02T12:00:00Z",
  "description": "I almost talked myself into MDX as the missing middle layer between markdown and TSX โ€” then talked myself back out of it.",
  "type": "post",
  "tags": [
    "dev",
    "content",
    "architecture",
    "tsx",
    "markdown"
  ],
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "relatedPosts": [
    "programs-not-documents",
    "md-vs-tsx",
    "markdown-format-rant"
  ]
}
โœ… Valid
SOURCE: claude-skills-and-hosting-html
Title: Claude Skills, Generative Art, and Hosting Raw HTML in Next.js
Slug: claude-skills-and-hosting-html
Type: post
Path: N/A
date: "2026-03-02T00:00:00Z"
Parsed: 2026-03-02T00:00:00.000Z
Full metadata dump
{
  "title": "Claude Skills, Generative Art, and Hosting Raw HTML in Next.js",
  "slug": "claude-skills-and-hosting-html",
  "date": "2026-03-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "type": "post",
  "description": "Claude.ai now has skills and connectors. I used one to build a generative art visualizer in a minute. Then figured out the cleanest way to ship it.",
  "tags": [
    "ai",
    "claude",
    "generative-art",
    "next.js",
    "p5js",
    "tools"
  ],
  "relatedPosts": [
    "vibecoding-plasma-cosmos-evolution",
    "agent-skills-are-insane"
  ]
}
โœ… Valid
SOURCE: skills-are-insane
Title: Agent Skills Are Insane
Slug: agent-skills-are-insane
Type: post
Path: N/A
date: "2026-03-02T00:00:00Z"
Parsed: 2026-03-02T00:00:00.000Z
Full metadata dump
{
  "title": "Agent Skills Are Insane",
  "slug": "agent-skills-are-insane",
  "date": "2026-03-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "type": "post",
  "description": "When you write a function you get one function. When you write a skill you get a new intern who works for you.",
  "tags": [
    "ai",
    "skills",
    "agents",
    "workflow",
    "automation",
    "tools"
  ],
  "relatedPosts": [
    "claude-skills-and-hosting-html",
    "building-custom-copilot-skills",
    "copilot-sdk-explainer"
  ]
}
โœ… Valid
SOURCE: bookmark-launcher-notes
Title: Bookmark Launcher: Multi-Tab & Local File Support
Slug: bookmark-launcher-notes
Type: doc
Path: N/A
date: "2026-03-02T00:00:00Z"
Parsed: 2026-03-02T00:00:00.000Z
Full metadata dump
{
  "title": "Bookmark Launcher: Multi-Tab & Local File Support",
  "slug": "bookmark-launcher-notes",
  "date": "2026-03-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via Claude.ai โ€” summarized from conversation and work done on bookmark launcher",
  "type": "doc",
  "description": "Debugging notes on building a bookmark that opens two URLs simultaneously in separate tabs โ€” what Chrome blocks, what works, and why.",
  "tags": [
    "browser",
    "bookmarks",
    "chrome",
    "debugging",
    "tools"
  ],
  "relatedPosts": [
    "epic-dev-routes"
  ]
}
โœ… Valid
SOURCE: live-feed-spec
Title: Feature Spec: /live โ€” Personal Microblog Feed
Slug: live-feed-spec
Type: doc
Path: N/A
date: "2026-03-02T00:00:00Z"
Parsed: 2026-03-02T00:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: /live โ€” Personal Microblog Feed",
  "slug": "live-feed-spec",
  "date": "2026-03-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "type": "doc",
  "description": "Spec for a /live route โ€” a personal microblog feed powered by a write API and SQLite, postable from anywhere including a phone.",
  "tags": [
    "spec",
    "live",
    "microblog",
    "sqlite",
    "api",
    "roadmap"
  ],
  "projectId": "jaygriff",
  "relatedPosts": [
    "search-feature-spec",
    "migrating-to-sqlite"
  ]
}
โœ… Valid
SOURCE: search-feature-spec
Title: Feature Spec: Full-Text Hybrid Search with SQLite FTS5
Slug: search-feature-spec
Type: doc
Path: N/A
date: "2026-03-02T00:00:00Z"
Parsed: 2026-03-02T00:00:00.000Z
Full metadata dump
{
  "title": "Feature Spec: Full-Text Hybrid Search with SQLite FTS5",
  "slug": "search-feature-spec",
  "date": "2026-03-02T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Summarized from a Claude.ai conversation",
  "type": "doc",
  "description": "Replacing Fuse.js title-only search with server-side full-text search using SQLite FTS5 โ€” paragraph-level results with highlighted snippet previews linking directly to headings.",
  "tags": [
    "search",
    "sqlite",
    "fts5",
    "spec",
    "architecture"
  ],
  "projectId": "jaygriff",
  "relatedPosts": [
    "migrating-to-sqlite",
    "content-layer-docs",
    "llm-seo-roadmap"
  ]
}
โœ… Valid
SOURCE: how-i-learned-to-code
Title: How I Learned to Code
Slug: how-i-learned-to-code
Type: post
Path: N/A
date: "2026-03-01T00:00:00Z"
Parsed: 2026-03-01T00:00:00.000Z
Full metadata dump
{
  "title": "How I Learned to Code",
  "slug": "how-i-learned-to-code",
  "date": "2026-03-01T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "type": "post",
  "description": "I'm self-taught, and the path was anything but straight.",
  "tags": [
    "career",
    "self-taught",
    "learning",
    "journey",
    "beginner"
  ],
  "relatedPosts": [
    "accounting-to-dev"
  ]
}
โœ… Valid
SOURCE: client-component-page-title-debt
Title: Three Pages With No Title Tag (And Why I'm Leaving Them That Way For Now)
Slug: client-component-page-title-debt
Type: doc
Path: N/A
date: "2026-03-01T00:00:00Z"
Parsed: 2026-03-01T00:00:00.000Z
Full metadata dump
{
  "title": "Three Pages With No Title Tag (And Why I'm Leaving Them That Way For Now)",
  "slug": "client-component-page-title-debt",
  "date": "2026-03-01T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "description": "I wired up page title metadata across the whole site โ€” except for three pages that use 'use client'. I know the fix. I don't want to do it yet. Here's everything documented so I can come back to it.",
  "type": "doc",
  "tags": [
    "next.js",
    "metadata",
    "tech-debt",
    "client-components",
    "seo"
  ],
  "projectId": "jaygriff",
  "relatedPosts": [
    "seo-optimization-plan"
  ]
}
โœ… Valid
SOURCE: how-i-use-ai
Title: How I Use AI
Slug: how-i-use-ai
Type: post
Path: N/A
date: "2026-02-28T00:00:00Z"
Parsed: 2026-02-28T00:00:00.000Z
Full metadata dump
{
  "title": "How I Use AI",
  "slug": "how-i-use-ai",
  "date": "2026-02-28T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot โ€” synthesized from my writing, projects, and ideas across the site into one document",
  "type": "post",
  "description": "Why I'm obssessed with AI and what I do with it",
  "tags": [
    "ai",
    "copilot",
    "cline",
    "workflow",
    "vibe-coding",
    "tools"
  ],
  "relatedPosts": [
    "ai-calculator-moment",
    "ai-code-editing",
    "why-i-write-in-my-ide",
    "approve-regenerate-edit-loop"
  ]
}
โœ… Valid
SOURCE: content-layer-docs
Title: Content Layer: Current System Documentation
Slug: content-layer-docs
Type: doc
Path: N/A
date: "2026-02-28T00:00:00Z"
Parsed: 2026-02-28T00:00:00.000Z
Full metadata dump
{
  "title": "Content Layer: Current System Documentation",
  "slug": "content-layer-docs",
  "date": "2026-02-28T00:00:00Z",
  "author": [
    "Jay Griffin, Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via GitHub Copilot",
  "type": "doc",
  "projectId": "jaygriff",
  "feature": "Content System",
  "description": "Reference doc for the SQLite migration. Captures exactly how the current filesystem-based content system works, where the pain points are, and what each function actually does.",
  "tags": [
    "content-system",
    "sqlite",
    "architecture",
    "docs",
    "posts",
    "filesystem"
  ],
  "relatedPosts": [
    "migrating-to-sqlite",
    "search-feature-spec"
  ]
}
โœ… Valid
SOURCE: styling-migration-2
Title: I Made an AI App Builder?
Slug: making-my-own-ai-app-builder
Type: post
Path: N/A
date: "2026-02-26T00:00:00Z"
Parsed: 2026-02-26T00:00:00.000Z
Full metadata dump
{
  "title": "I Made an AI App Builder?",
  "slug": "making-my-own-ai-app-builder",
  "date": "2026-02-26T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.6"
  ],
  "authorshipNote": "Claude Sonnet 4.6 via Cline",
  "type": "post",
  "description": "I studied vibe coding tools, figured out why they produce better AI outputs than my usual prompting, and rebuilt my stack to match. Now I have my own personal AI app builder.",
  "tags": [
    "ai",
    "vibe-coding",
    "stack",
    "cline",
    "next.js",
    "tailwind",
    "shadcn"
  ],
  "relatedPosts": [
    "styling-migration",
    "vibecoding-plasma-cosmos-evolution"
  ]
}
โœ… Valid
SOURCE: styling-migration
Title: Tailwind Wins: Making My Meta Stack Even More Meta
Slug: styling-migration
Type: post
Path: N/A
date: "2026-02-23T00:00:00Z"
Parsed: 2026-02-23T00:00:00.000Z
Full metadata dump
{
  "title": "Tailwind Wins: Making My Meta Stack Even More Meta",
  "slug": "styling-migration",
  "date": "2026-02-23T00:00:00Z",
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex"
  ],
  "authorshipNote": "GPT-5.3-Codex via GitHub Copilot",
  "description": "My migration plan from Emotion to Tailwind, CSS Modules, Shadcn, and CSS variables so styling stays fast, explicit, and AI-friendly.",
  "tags": [
    "css",
    "nextjs",
    "emotion",
    "tailwind",
    "shadcn",
    "architecture",
    "ai"
  ],
  "type": "post",
  "relatedPosts": [
    "making-my-own-ai-app-builder",
    "tailwind-rant-blog",
    "why-no-tailwind"
  ]
}
โœ… Valid
SOURCE: container-margin-map
Title: Container & Margin Behavior Map
Slug: container-margin-map
Type: doc
Path: N/A
date: "2026-02-19T20:30:00Z"
Parsed: 2026-02-19T20:30:00.000Z
updated: "2026-02-23T00:00:00Z"
Parsed: 2026-02-23T00:00:00.000Z
Full metadata dump
{
  "title": "Container & Margin Behavior Map",
  "slug": "container-margin-map",
  "date": "2026-02-19T20:30:00Z",
  "updated": [
    "2026-02-23T00:00:00Z"
  ],
  "description": "A detailed map of how my global body spacing, Container primitive margins, and page-level overrides combine across the site.",
  "tags": [
    "layout",
    "css",
    "spacing",
    "primitives",
    "docs"
  ],
  "type": "doc",
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex"
  ],
  "relatedPosts": [
    "safari-margin-hack",
    "navbar-component"
  ]
}
โœ… Valid
SOURCE: backlog-this-metadata-editor-workflow
Title: Universal Metadata + Template Editor for My Content
Slug: backlog-this-metadata-editor-workflow
Type: doc
Path: N/A
date: "2026-02-16T19:10:00Z"
Parsed: 2026-02-16T19:10:00.000Z
Full metadata dump
{
  "title": "Universal Metadata + Template Editor for My Content",
  "slug": "backlog-this-metadata-editor-workflow",
  "date": "2026-02-16T19:10:00Z",
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex"
  ],
  "type": "doc",
  "description": "My next evolution for AI-assisted content operations: generate structured documents with rich metadata, edit them quickly in a dedicated review surface, and publish high-quality artifacts in under a minute.",
  "tags": [
    "workflow",
    "ai",
    "content-system",
    "metadata",
    "editor",
    "spec",
    "ux",
    "backlog"
  ],
  "relatedPosts": [
    "backlog-this-trigger-word-workflow"
  ]
}
โœ… Valid
SOURCE: park-this-trigger-word-workflow
Title: backlog-this Command
Slug: backlog-this-trigger-word-workflow
Type: doc
Path: N/A
date: "2026-02-16T18:00:00Z"
Parsed: 2026-02-16T18:00:00.000Z
Full metadata dump
{
  "title": "backlog-this Command",
  "slug": "backlog-this-trigger-word-workflow",
  "date": "2026-02-16T18:00:00Z",
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex"
  ],
  "type": "doc",
  "description": "A focused workflow for capturing ideas into backlog storage when I intentionally want to stop implementing and preserve context for later.",
  "tags": [
    "workflow",
    "ai",
    "backlog",
    "productivity",
    "meta",
    "spec"
  ],
  "relatedPosts": [
    "backlog-this-metadata-editor-workflow"
  ]
}
โœ… Valid
SOURCE: git-commit-message-escaping
Title: Quick Note: Git Commit Message Escaping Is Still Funny in 2026
Slug: git-commit-message-escaping
Type: post
Path: N/A
date: "2026-02-16T00:00:00Z"
Parsed: 2026-02-16T00:00:00.000Z
Full metadata dump
{
  "title": "Quick Note: Git Commit Message Escaping Is Still Funny in 2026",
  "slug": "git-commit-message-escaping",
  "date": "2026-02-16T00:00:00Z",
  "author": [
    "GPT-5.3-Codex",
    "Jay Griffin"
  ],
  "authorshipNote": "Jay made a quick observation about commit-message escaping in 2026 and asked GPT-5.3-Codex to turn it into a short markdown doc.",
  "type": "post",
  "description": "A quick amusing observation: modern AI workflows are powerful, but shell escaping in git commit messages is still a thing.",
  "tags": [
    "git",
    "shell",
    "workflow",
    "ai",
    "developer-experience"
  ],
  "relatedPosts": [
    "ai-code-editing"
  ]
}
โœ… Valid
SOURCE: time-blocking-app-security
Title: Time-Blocking App Prompt Injection Security
Slug: time-blocking-app-security
Type: doc
Path: N/A
date: "2026-02-16T00:00:00Z"
Parsed: 2026-02-16T00:00:00.000Z
Full metadata dump
{
  "title": "Time-Blocking App Prompt Injection Security",
  "slug": "time-blocking-app-security",
  "date": "2026-02-16T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "type": "doc",
  "description": "Security design notes for preventing prompt-injection abuse in a natural-language time-blocking app via AI intent validation.",
  "tags": [
    "security",
    "prompt-injection",
    "ai",
    "calendar",
    "time-blocking"
  ],
  "relatedPosts": [
    "structured-outputs",
    "life-logger"
  ]
}
โœ… Valid
SOURCE: building-resume-with-react
Title: Building My Resume with React and CSS
Slug: building-resume-with-react
Type: post
Path: N/A
date: "2026-02-13T10:00:00Z"
Parsed: 2026-02-13T10:00:00.000Z
updated: "2026-02-16T20:00:00Z"
Parsed: 2026-02-16T20:00:00.000Z
Full metadata dump
{
  "title": "Building My Resume with React and CSS",
  "slug": "building-resume-with-react",
  "date": "2026-02-13T10:00:00Z",
  "updated": "2026-02-16T20:00:00Z",
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex",
    "Claude Sonnet 4.5"
  ],
  "description": "How I ditched traditional design tools and built a print-perfect resume using React, Emotion, and CSS print media queries.",
  "tags": [
    "dev",
    "react",
    "css",
    "workflow"
  ],
  "type": "post",
  "relatedPosts": [
    "pdf-the-frankenformat",
    "why-react-components-rule"
  ]
}
โœ… Valid
SOURCE: pdf-is-a-dead-format
Title: PDF the Frankenformat
Slug: pdf-the-frankenformat
Type: post
Path: N/A
date: "2026-02-13T00:00:00Z"
Parsed: 2026-02-13T00:00:00.000Z
updated: "2026-02-20T00:00:00Z2026-02-18T00:00:00Z2026-02-17T00:00:00Z2026-02-16T00:00:00Z"
Parsed: 2026-02-20T00:00:00.000Z
Full metadata dump
{
  "title": "PDF the Frankenformat",
  "slug": "pdf-the-frankenformat",
  "date": "2026-02-13T00:00:00Z",
  "updated": [
    "2026-02-20T00:00:00Z",
    "2026-02-18T00:00:00Z",
    "2026-02-17T00:00:00Z",
    "2026-02-16T00:00:00Z"
  ],
  "author": [
    "Jay Griffin",
    "GPT-5.3-Codex",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "This document was developed through iterative discussion, with AI-assisted drafting and revision.",
  "description": "Me trying to publish all kinds of things (not just websites) in HTML/CSS/React",
  "tags": [
    "dev",
    "ai",
    "web",
    "formats",
    "publishing",
    "workflow"
  ],
  "type": "post",
  "relatedPosts": [
    "building-resume-with-react"
  ]
}
โœ… Valid
SOURCE: migrating-to-sqlite
Title: Why I'm Finally Moving to SQLite (And Why I Waited Until Now)
Slug: migrating-to-sqlite
Type: post
Path: N/A
date: "2026-02-10T00:00:00Z"
Parsed: 2026-02-10T00:00:00.000Z
Full metadata dump
{
  "title": "Why I'm Finally Moving to SQLite (And Why I Waited Until Now)",
  "slug": "migrating-to-sqlite",
  "date": "2026-02-10T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "๐Ÿ”ง AI-Assisted - Written after back and forth discussion about migration strategy and timing",
  "type": "post",
  "description": "After over 60 articles in one month, my file-based content system is breaking down. Here's why I'm migrating to SQLite, why now, and why I didn't do this sooner.",
  "tags": [
    "dev",
    "database",
    "content-system",
    "sqlite"
  ],
  "relatedPosts": [
    "content-layer-docs",
    "search-feature-spec"
  ]
}
โœ… Valid
SOURCE: building-custom-copilot-skills
Title: Building Custom GitHub Copilot Skills: A Natural Language Command Interface for My Workflow
Slug: building-custom-copilot-skills
Type: post
Path: N/A
date: "2026-02-09T21:00:00Z"
Parsed: 2026-02-09T21:00:00.000Z
Full metadata dump
{
  "title": "Building Custom GitHub Copilot Skills: A Natural Language Command Interface for My Workflow",
  "description": "Why I'm building domain-specific tools and skills for GitHub Copilot instead of using marketplace solutionsโ€”creating an audience-of-one command interface with zero abstraction tax.",
  "date": "2026-02-09T21:00:00Z",
  "slug": "building-custom-copilot-skills",
  "tags": [
    "dev",
    "ai",
    "workflow",
    "tools",
    "automation"
  ],
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Written collaboratively after realizing that custom AI skills aren't just productivity toolsโ€”they're a natural language command interface for encoding my entire development workflow. This article documents the vision.",
  "relatedPosts": [
    "content-creator-skill-plan",
    "copilot-sdk-explainer",
    "agent-skills-are-insane"
  ]
}
โœ… Valid
SOURCE: choosing-copilot-over-claude-code
Title: Why I Chose GitHub Copilot Over Claude Code
Slug: choosing-copilot-over-claude-code
Type: post
Path: N/A
date: "2026-02-09T20:00:00Z"
Parsed: 2026-02-09T20:00:00.000Z
Full metadata dump
{
  "title": "Why I Chose GitHub Copilot Over Claude Code",
  "description": "After using both AI coding assistants, I decided to consolidate on GitHub Copilot for my daily development workflow. Here's why precision IDE integration won over autonomous code generation.",
  "date": "2026-02-09T20:00:00Z",
  "slug": "choosing-copilot-over-claude-code",
  "tags": [
    "dev",
    "ai",
    "workflow",
    "tools"
  ],
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "This article was written by GitHub Copilot based on a real debugging session where it fixed a JSX syntax error that Claude Code couldn't resolve. Jay asked Copilot to document the decision-making process, and this piece was created from that conversationโ€”an example of the precision editing workflow described within.",
  "relatedPosts": [
    "ai-code-editing",
    "how-i-use-ai"
  ]
}
โœ… Valid
SOURCE: seo-optimization-plan
Title: Site-Wide SEO Optimization Implementation Plan
Slug: seo-optimization-plan
Type: doc
Path: /docs/seo-optimization-plan
date: "2026-02-09T00:00:00Z"
Parsed: 2026-02-09T00:00:00.000Z
Full metadata dump
{
  "title": "Site-Wide SEO Optimization Implementation Plan",
  "slug": "seo-optimization-plan",
  "date": "2026-02-09T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "type": "doc",
  "description": "Comprehensive plan for implementing Next.js metadata API across the site for better SEO, including OpenGraph and Twitter Card support.",
  "tags": [
    "seo",
    "nextjs",
    "optimization",
    "roadmap",
    "metadata"
  ],
  "path": "/docs/seo-optimization-plan",
  "relatedPosts": [
    "llm-seo-roadmap",
    "thumbnail-metadata-spec",
    "client-component-page-title-debt"
  ]
}
โœ… Valid
SOURCE: copilot-sdk-explainer
Title: Github Copilot SDK Explainer
Slug: copilot-sdk-explainer
Type: doc
Path: N/A
date: "2026-02-09T00:00:00Z"
Parsed: 2026-02-09T00:00:00.000Z
Full metadata dump
{
  "title": "Github Copilot SDK Explainer",
  "slug": "copilot-sdk-explainer",
  "date": "2026-02-09T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Written collaboratively to explain the core technical capabilities that make the GitHub Copilot SDK different from traditional automation frameworks",
  "type": "doc",
  "description": "How context awareness, reasoning between tool calls, and adaptive execution make the Copilot SDK fundamentally different from traditional automation",
  "tags": [
    "github-copilot",
    "ai",
    "sdk",
    "automation",
    "agents",
    "tool-use",
    "architecture"
  ],
  "relatedPosts": [
    "building-custom-copilot-skills",
    "agent-skills-are-insane"
  ]
}
โœ… Valid
SOURCE: content-creator-skill-plan
Title: Content Creation GitHub Copilot Skill
Slug: content-creator-skill-plan
Type: doc
Path: N/A
date: "2026-02-08T00:00:00Z"
Parsed: 2026-02-08T00:00:00.000Z
updated: "2026-02-09T00:00:00Z"
Parsed: 2026-02-09T00:00:00.000Z
Full metadata dump
{
  "title": "Content Creation GitHub Copilot Skill",
  "slug": "content-creator-skill-plan",
  "date": "2026-02-08T00:00:00Z",
  "updated": "2026-02-09T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Created collaboratively with GitHub Copilot while working on implementing the content creation system described in this document",
  "type": "doc",
  "description": "Implementation plan for building a GitHub Copilot skill that enables natural language content creation",
  "tags": [
    "ai",
    "workflows",
    "github-copilot",
    "automation",
    "skills",
    "semantic-deterministic",
    "content-creation"
  ],
  "relatedPosts": [
    "building-custom-copilot-skills",
    "copilot-sdk-explainer",
    "agent-skills-are-insane"
  ]
}
โœ… Valid
SOURCE: epic-dev-routes
Title: Epic Dev Routes - Your App as Your Tooling Layer
Slug: epic-dev-routes
Type: doc
Path: N/A
date: "2026-02-08T00:00:00Z"
Parsed: 2026-02-08T00:00:00.000Z
Full metadata dump
{
  "title": "Epic Dev Routes - Your App as Your Tooling Layer",
  "slug": "epic-dev-routes",
  "date": "2026-02-08T00:00:00Z",
  "author": [
    "Jay Griffin"
  ],
  "type": "doc",
  "description": "Stop building separate tools - use Next.js /dev/* routes to turn your entire app into a personal productivity layer with hot reload, TypeScript safety, and zero deployment overhead",
  "tags": [
    "next.js",
    "dev-tools",
    "workflows",
    "architecture",
    "productivity",
    "dx",
    "web-dev"
  ],
  "relatedPosts": [
    "why-i-write-in-my-ide",
    "building-custom-copilot-skills"
  ]
}
โœ… Valid
SOURCE: my-tools-spec
Title: My Stack Spec
Slug: my-stack-spec
Type: doc
Path: N/A
date: "2026-02-04T00:00:00Z"
Parsed: 2026-02-04T00:00:00.000Z
Full metadata dump
{
  "title": "My Stack Spec",
  "slug": "my-stack-spec",
  "date": "2026-02-04T00:00:00Z",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "type": "doc",
  "projectId": "jaygriff",
  "description": "Spec for my stack page - filterable categories showing what I use, what I'm watching, what I retired, and why",
  "tags": [
    "feature-spec",
    "ux",
    "design"
  ],
  "authorshipNote": "Spec emerged organically from building the page",
  "relatedPosts": [
    "making-my-own-ai-app-builder"
  ]
}
โœ… 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
updated: "2026-02-04T18:00:00Z"
Parsed: 2026-02-04T18:00:00.000Z
Full metadata dump
{
  "title": "NavBar Component",
  "slug": "navbar-component",
  "date": "2026-02-03T10:00:00Z",
  "updated": "2026-02-04T18: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",
    "responsive",
    "flexbox"
  ],
  "feature": "navbar",
  "author": [
    "Jay Griffin",
    "Claude Sonnet 4.5"
  ],
  "authorshipNote": "Collaboratively written with Claude by summarizing work done and analyzing the code",
  "relatedPosts": [
    "container-margin-map",
    "navigator-feature"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "ui-polish"
  ]
}
โœ… 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",
  "relatedPosts": [
    "ai-code-editing",
    "approve-regenerate-edit-loop",
    "how-i-use-ai"
  ]
}
โœ… 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",
  "relatedPosts": [
    "epic-dev-routes"
  ]
}
โœ… 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",
  "relatedPosts": [
    "building-resume-with-react"
  ]
}
โœ… 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",
  "relatedPosts": [
    "content-header-test"
  ]
}
โœ… 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 any other 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"
  ],
  "relatedPosts": [
    "how-i-use-ai",
    "ai-workflow-transparency"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "thumbnail-metadata-spec"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "seo-optimization-plan",
    "project-launchpad-spec"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "semantic-controls-for-ai",
    "structured-outputs"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "ai-workflow-transparency",
    "why-i-write-in-my-ide"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "search-feature-spec"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "semantic-controls-for-ai",
    "semantic-controls-for-ai-2",
    "llm-component-designer"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "ai-code-editing",
    "why-i-write-in-my-ide",
    "how-i-use-ai"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "semantic-controls-for-ai-2",
    "structured-outputs"
  ]
}
โœ… 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",
  "relatedPosts": [
    "backlog-this-metadata-editor-workflow"
  ]
}
โœ… 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",
  "relatedPosts": [
    "structured-outputs"
  ]
}
โœ… 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%)",
  "relatedPosts": [
    "docs-routing",
    "routing-strategy"
  ]
}
โœ… 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%)",
  "relatedPosts": [
    "app-routes-path-strategy",
    "routing-strategy"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "table-examples",
    "markdown-renderer-implementation"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "markdown-table-test"
  ]
}
โœ… 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: 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",
  "relatedPosts": [
    "navigator-feature",
    "search-feature-spec"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "metadata-paradox",
    "backlog-this-trigger-word-workflow"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "ai-workflow-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"
  ],
  "relatedPosts": [
    "epic-dev-routes"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "ai-calculator-moment",
    "how-i-use-ai"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "docs-routing",
    "navigator-feature"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "metadata-paradox"
  ]
}
โœ… 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-23T00:00:00Z2026-02-04T00:00:00Z2026-02-03T00:00:00Z2026-02-02T00:00:00Z"
Parsed: 2026-02-23T00: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-23T00:00:00Z",
    "2026-02-04T00:00:00Z",
    "2026-02-03T00:00:00Z",
    "2026-02-02T00:00:00Z"
  ],
  "relatedPosts": [
    "codeblock-backtick-bug",
    "debug-codeblocks"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "docs-routing",
    "routing-strategy"
  ]
}
โœ… 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
updated: "2026-02-09T00:00:00Z"
Parsed: 2026-02-09T00:00:00.000Z
Full metadata dump
{
  "title": "About This Site",
  "slug": "about-this-site",
  "date": "2026-01-21T00:00:00Z",
  "updated": "2026-02-09T00: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: My Journey from Accounting to Software Development",
  "tags": [
    "career",
    "accounting",
    "self-taught",
    "journey",
    "excel"
  ],
  "relatedPosts": [
    "how-i-learned-to-code"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "approve-regenerate-edit-loop",
    "why-i-write-in-my-ide",
    "how-i-use-ai"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "todo-system-organization"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "programs-not-documents",
    "building-resume-with-react"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "codeblock-showcase",
    "markdown-renderer-implementation"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "codeblock-backtick-bug",
    "md-vs-tsx",
    "mdx-does-not-win"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "container-margin-map"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "programs-not-documents",
    "md-vs-tsx"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "docs-routing",
    "app-routes-path-strategy"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "dynamic-routes-nextjs",
    "content-system-refactor"
  ]
}
โœ… 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",
  "relatedPosts": [
    "content-system-refactor",
    "docs-routing"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "content-system-refactor"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "routing-strategy",
    "app-routes-path-strategy",
    "dynamic-routes-nextjs"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "search-feature-spec",
    "docs-routing"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "programs-not-documents",
    "md-vs-tsx",
    "mdx-does-not-win"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "structured-outputs",
    "semantic-controls-for-ai"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "server-components-refactor",
    "docs-routing"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "why-no-tailwind",
    "styling-migration"
  ]
}
โœ… 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"
  ],
  "relatedPosts": [
    "tailwind-rant-blog",
    "styling-migration"
  ]
}

Related Posts

  • ContentHeader Component Test Cases
    Edge case testing for the ContentHeader component with various metadata configurations.