Debug: Date Analysis
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
"2026-03-13T00:00:00Z"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"
}"2026-03-12T10:00:00Z"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"
}"2026-03-04T12:00:00Z"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"
}"2026-03-02T22:00:00Z"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"
]
}"2026-03-02T18:00:00Z"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"
]
}"2026-03-02T18:00:00Z"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"
]
}"2026-03-02T12:00:00Z"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"
]
}"2026-03-02T00:00:00Z"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"
]
}"2026-03-02T00:00:00Z"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"
]
}"2026-03-02T00:00:00Z"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"
]
}"2026-03-02T00:00:00Z"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"
]
}"2026-03-02T00:00:00Z"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"
]
}"2026-03-01T00:00:00Z"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"
]
}"2026-03-01T00:00:00Z"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"
]
}"2026-02-28T00:00:00Z"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"
]
}"2026-02-28T00:00:00Z"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"
]
}"2026-02-26T00:00:00Z"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"
]
}"2026-02-23T00:00:00Z"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"
]
}"2026-02-19T20:30:00Z""2026-02-23T00:00:00Z"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"
]
}"2026-02-16T19:10:00Z"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"
]
}"2026-02-16T18:00:00Z"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"
]
}"2026-02-16T00:00:00Z"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"
]
}"2026-02-16T00:00:00Z"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"
]
}"2026-02-13T10:00:00Z""2026-02-16T20:00:00Z"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"
]
}"2026-02-13T00:00:00Z""2026-02-20T00:00:00Z2026-02-18T00:00:00Z2026-02-17T00:00:00Z2026-02-16T00:00:00Z"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"
]
}"2026-02-10T00:00:00Z"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"
]
}"2026-02-09T21:00:00Z"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"
]
}"2026-02-09T20:00:00Z"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"
]
}"2026-02-09T00:00:00Z"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"
]
}"2026-02-09T00:00:00Z"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"
]
}"2026-02-08T00:00:00Z""2026-02-09T00:00:00Z"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"
]
}"2026-02-08T00:00:00Z"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"
]
}"2026-02-04T00:00:00Z"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"
]
}"2026-02-03T10:00:00Z""2026-02-04T18:00:00Z"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"
]
}"2026-02-02T10:00:00Z""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"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"
]
}"2026-02-02T00:00:00Z"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"
]
}"2026-02-02T00:00:00Z"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"
]
}"2026-01-31T00:00:00Z"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"
]
}"2026-01-30T12:00:00Z"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"
]
}"2026-01-30T00:00:00Z"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"
]
}"2026-01-30T00:00:00Z"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"
]
}"2026-01-30T00:00:00Z"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"
]
}"2026-01-29T00:00:00Z"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"
]
}"2026-01-29T00:00:00Z""2026-02-02T00:00:00Z"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"
]
}"2026-01-29T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z"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"
]
}"2026-01-27T00:00:00Z""2026-02-03T00:00:00Z"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"
}"2026-01-27T00:00:00Z"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"
}"2026-01-26T16:00:00Z"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"
}"2026-01-26T15:00:00Z"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"
]
}"2026-01-26T14:00:00Z"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"
]
}"2026-01-26T12:30:00Z"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"
]
}"2026-01-26T12:00:00Z"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"
]
}"2026-01-26T00:00:00Z"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"
}"2026-01-23T13:30:00Z"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"
]
}"2026-01-23T13:00:00Z"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"
]
}"2026-01-23T12:30:00Z"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"
]
}"2026-01-23T12:00:00Z"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"
]
}"2026-01-23T00:00:00Z"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"
]
}"2026-01-23T00:00:00Z"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"
]
}"2026-01-23T00:00:00Z"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"
]
}"2026-01-21T00:00:00Z""2026-02-23T00:00:00Z2026-02-04T00:00:00Z2026-02-03T00:00:00Z2026-02-02T00:00:00Z"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"
]
}"2026-01-21T00:00:00Z"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"
]
}"2026-01-21T00:00:00Z""2026-02-09T00:00:00Z"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"
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-20T00:00:00Z"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"
]
}"2026-01-19T00:00:00Z"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"
]
}"2026-01-19T00:00:00Z"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"
]
}"2026-01-19T00:00:00Z"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"
]
}"2026-01-19T00:00:00Z"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"
}"2026-01-19T00:00:00Z"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"
}"2026-01-19T00:00:00Z"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"
}"2026-01-19T00:00:00Z"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"
}"2026-01-17T23:00:00Z"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"
]
}"2026-01-17T22:30:00Z"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"
]
}"2026-01-17T22:00:00Z"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"
]
}"2026-01-17T21:00:00Z"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"
]
}"2026-01-17T20:00:00Z"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"
]
}"2026-01-17T00:00:00Z"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"
]
}"2026-01-17T00:00:00Z"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"
]
}"2026-01-13T21:40:00Z"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"
]
}"2026-01-13T21:32:55Z""2026-01-17T22:00:00Z"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"
]
}"2026-01-13T00:00:00Z""2026-01-20T00:00:00Z"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"
}"2026-01-13T00:00:00Z"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"
]
}"2025-12-08T00:00:00Z"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 CasesEdge case testing for the ContentHeader component with various metadata configurations.