The requestId was being set to a string like "live-avatars-1767520170167"
which is not a valid UUID. This caused PostgreSQL to reject the insert
into the generations table.
Now uses req.requestId from the middleware which generates a proper UUID.
- Create centralized SEO config (docs-seo.ts) with DOCS_PAGES constants
and createDocsMetadata helper for DRY metadata generation
- Add JSON-LD schema helpers (docs-schema.ts) for BreadcrumbList,
TechArticle, HowTo, and WebAPI structured data
- Create JsonLd component for rendering structured data
- Add metadata exports and JSON-LD to all 10 docs pages:
- Getting Started, Generation, Images, Live URLs, Authentication
- API Overview, Generations API, Images API, Flows API, Live Scopes API
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove 'use client' directive from 10 documentation pages that don't
use client-side features. Pages are pure static content; the DocPage
wrapper component handles any client-side functionality.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update default aspect ratio references from 1:1 to 16:9 in:
- Generation guide
- Live Scopes API reference
- Live URLs guide
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update default aspect ratio for image generation to 16:9 widescreen
format, matching common display resolutions and user expectations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added all documentation pages to sitemap.xml:
- Getting Started (/docs)
- Image Generation (/docs/generation)
- Working with Images (/docs/images)
- Live URLs (/docs/live-urls)
- Authentication (/docs/authentication)
- API Reference (/docs/api)
- API: Generations, Images, Flows, Live Scopes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Multiple disabled nav items share the same href '#', causing React
duplicate key warning. Changed key from item.href to item.label
which is guaranteed to be unique.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added optional disabled property to NavItem interface
- Disabled items show gray text and cursor-not-allowed
- Desktop: Tooltip on hover shows "Coming soon"
- Mobile: Inline "(Coming soon)" label after item text
- Uses aria-disabled for accessibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Created (landings) route group for home page with sticky header
- Created (apps) route group for docs/demo/admin with scrollable header
- Moved page components to respective route groups
- Updated root layout to be minimal (no header/footer)
- Each route group has its own layout with appropriate header style
- Updated Footer and layouts to use public folder logo path
This enables sticky header on landing pages while docs/demo pages
have a header that scrolls away with content.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Next.js usePathname() returns paths with trailing slashes during static
generation (e.g., /docs/) but navigation hrefs use paths without trailing
slashes (e.g., /docs). The strict equality comparison was always failing.
Added path normalization to strip trailing slashes before comparison.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Mark enhancementOptions.template as planned feature - currently
all prompts use default 'general' style regardless of parameter.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update all API documentation to reflect new storage architecture:
- storageKey: {org}/{project}/img/{imageId} (UUID, no extension)
- storageUrl: https://cdn.banatie.app/{org}/{project}/img/{imageId}
- Add URL Architecture section to live-url.md
- Update all example responses with new format
- Document UUID vs alias URL routing differences
- Clarify that filename = image.id (UUID)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
VPS-specific Claude Code configuration file, not tracked in git.
Create this file manually on VPS for local context.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add test to validate storageKey format: {org}/{proj}/img/{uuid}
- Add test to validate storageUrl format matches CDN pattern
- Verify UUID in storage path matches image.id
- Update 06-edge-cases.rest to use new path format
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>