SEO improvements for better search engine optimization:
1. Canonical URL - Added client-side dynamic canonical link tags for posts and pages
2. Single H1 per page - Markdown H1s demoted to H2 with .blog-h1-demoted class (maintains H1 visual styling)
3. DOM order fix - Article now loads before sidebar in DOM for SEO (CSS order property maintains visual layout)
4. X-Robots-Tag - HTTP header added via netlify.toml (index, follow for public; noindex for dashboard/api routes)
5. Hreflang tags - Self-referencing hreflang (en, x-default) for language targeting
6. og:url consistency - Uses same canonicalUrl variable as canonical link tag
7. twitter:site - New TwitterConfig in siteConfig.ts for Twitter Cards meta tags
Files modified:
- src/config/siteConfig.ts: Added TwitterConfig interface with site/creator fields
- src/pages/Post.tsx: SEO meta tags for posts/pages, DOM order optimization
- src/components/BlogPost.tsx: H1 to H2 demotion in markdown renderer
- src/styles/global.css: .blog-h1-demoted class, CSS order properties
- convex/http.ts: hreflang and twitter:site in generateMetaHtml()
- netlify.toml: X-Robots-Tag headers for public, dashboard, API routes
- index.html: canonical, hreflang, twitter:site placeholder tags
- fork-config.json.example: twitter configuration fields
Closes#4
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add SemanticSearchConfig interface with enabled toggle to siteConfig.ts
- Default semantic search to disabled (enabled: false) to avoid blocking forks without OPENAI_API_KEY
- Update SearchModal.tsx to conditionally show mode toggle based on config
- Update sync-posts.ts to skip embedding generation when disabled
- Add semantic search toggle to Dashboard config generator
- Update FORK_CONFIG.md with Semantic Search Configuration section
- Update fork-config.json.example with semanticSearch option
- Update docs-semantic-search.md with enable/disable instructions
- Update changelog and documentation
When disabled (default):
- Search modal shows only keyword search (no mode toggle)
- Embedding generation skipped during sync
- No OpenAI API key required
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed ChatGPT, Claude, and Perplexity links from GitHub raw URLs to local /raw/{slug}.md
- Simplified AI prompt from multi-line instructions to "Read this URL and summarize it:"
- URLs now constructed using window.location.origin for consistency
- Removed unused siteConfig import and getGitHubRawUrl function
- No longer requires git push for AI links to work (synced content available immediately)
Updated: src/components/CopyPageDropdown.tsx, changelog.md, task.md, files.md, changelog-page.md
Add author archive pages displaying all posts by a specific author, following
the existing tag pages pattern. Author names in post headers are now clickable
links that navigate to the author's page.
Changes:
- Add by_authorName index to posts table (convex/schema.ts)
- Add getAllAuthors and getPostsByAuthor queries (convex/posts.ts)
- Create AuthorPage.tsx component with list/cards view toggle
- Add /author/:authorSlug route (src/App.tsx)
- Make authorName clickable in Post.tsx for posts and pages
- Add author link and page styles (src/styles/global.css)
- Add author pages to sitemap (convex/http.ts)
- Update documentation: files.md, TASK.md, changelog.md, changelog-page.md
- Save implementation plan to prds/authorname-blogs.md
Add missing changelog entries to content/pages/changelog-page.md:
v1.34.0 (2025-12-26): Blog page featured layout with hero post
- blogFeatured frontmatter field for posts
- Hero card displays first featured post with landscape image
- 2-column featured row for remaining featured posts
- 3-column grid for regular posts
v1.35.0 (2025-12-26): Image support at top of posts and pages
- showImageAtTop frontmatter field
- Full-width image display above post header
- Works for both posts and pages
v1.36.0 (2025-12-27): Social footer component
- Customizable social links (8 platform types)
- Copyright with auto-updating year
- showSocialFooter frontmatter field for per-page control
- Configurable via siteConfig.socialFooter
v1.37.0 (2025-12-27): Newsletter Admin UI
- Three-column admin interface at /newsletter-admin
- Subscriber management with search and filters
- Send newsletter panel (post selection or custom email)
- Weekly digest automation (Sunday 9am UTC)
- Developer notifications (subscriber alerts, weekly stats)
- Markdown-to-HTML conversion for custom emails
- Add /tags/[tag] routes with dynamic tag archive pages
- Add related posts component to blog post footers (up to 3 by shared tags)
- Tag links in post footers now navigate to tag archive pages
- Re-enable Open in AI links using GitHub raw URLs (bypasses edge issues)
- Add gitHubRepo config in siteConfig.ts for raw URL construction
- Add by_tags index and getAllTags/getPostsByTag/getRelatedPosts queries
- Update sitemap to include dynamically generated tag pages
- Add mobile responsive styling for all new components
- Update docs with git push requirement for AI links to work
- Remove /api/raw Netlify Function that caused build failures
- Comment out ChatGPT/Claude/Perplexity buttons in CopyPageDropdown
- Keep Copy page, View as Markdown, Download as SKILL.md options
- Update blog post with detailed log of attempted solutions
- Clean up netlify.toml by removing broken redirect rule
Users can still copy markdown and paste into AI tools manually.
The raw markdown files work in browsers but AI crawlers cannot
fetch them reliably due to Netlify edge function interception.
- Create netlify/functions/raw.ts Netlify Function
- Returns text/plain with minimal headers for reliable AI ingestion
- Reads from dist/raw/ (production) or public/raw/ (dev/preview)
- Update CopyPageDropdown to use /api/raw/:slug for AI services
- Keep /raw/:slug.md for View as Markdown browser viewing
- Add @netlify/functions dev dependency
- Remove Link header from global headers scope, apply only to /index.html
- Remove X-Robots-Tag noindex from /raw/* to allow AI crawler indexing
- Use window.location.origin instead of props.url for raw markdown URL construction
- Ensures correct URLs even when props.url points to canonical/deploy preview domains
- Fixes ChatGPT/Perplexity fetch failures on /raw/*.md endpoints
- Added v1.24.4 entry documenting showInNav field and hardcodedNavItems configuration
- Added v1.24.3 entry documenting inner page logo configuration
- Includes configuration examples and updated file lists
- Maintains consistent format with existing changelog entries
- Move mobile nav controls to left side (hamburger, search, theme)
- Add sidebar TOC to mobile menu when page has sidebar layout
- Hide desktop sidebar on mobile since accessible via hamburger
- Standardize mobile menu typography with CSS variables
- Use font-family inherit for consistent fonts across menu elements
- Blog page: list/card view toggle with localStorage persistence
- Pages: sidebar layout with auto-generated TOC (layout: "sidebar")
- Markdown: collapsible sections via <details>/<summary> tags
- Add rehype-raw and rehype-sanitize for HTML in markdown
v1.18.1 - CopyPageDropdown raw markdown URLs
- AI services (ChatGPT, Claude, Perplexity) now receive /raw/{slug}.md URLs
- Direct access to clean markdown content for better AI parsing
- No HTML parsing required by AI services
- Renamed buildUrlFromPageUrl to buildUrlFromRawMarkdown
v1.19.0 - Author display for posts and pages
- New optional authorName and authorImage frontmatter fields
- Round avatar image displayed next to date and read time
- Works on individual post and page views
- Write page updated with new field reference
v1.19.1 - GitHub Stars on Stats page
- Live star count from waynesutton/markdown-site repository
- Fetches from GitHub public API (no token required)
- Stats page now displays 6 cards with responsive grid
Documentation updates
- Frontmatter Flow section added to docs.md, setup-guide.md, files.md
- How frontmatter works with step-by-step processing flow
- Instructions for adding new frontmatter fields
Updated files:
- src/components/CopyPageDropdown.tsx
- src/pages/Stats.tsx
- src/pages/Post.tsx
- src/pages/Write.tsx
- src/styles/global.css
- convex/schema.ts
- convex/posts.ts
- convex/pages.ts
- scripts/sync-posts.ts
- content/blog/setup-guide.md
- content/pages/docs.md
- content/pages/changelog-page.md
- files.md
- README.md
- TASK.md
- changelog.md
- AGENTS.md
Add CSS styles for the modern stats page UI:
- stats-cards-modern: 5-column grid layout for stat cards
- stat-card-modern: individual card styling with icons and numbers
- Responsive breakpoints (3/2/1 columns for smaller screens)
- stats-page-wide: wider max-width for stats page
- main-content-wide: layout variant for stats route
These styles were missing from the previous Stats.tsx component update.
When content exceeds URL length limit, the async clipboard write
was blocking the window.open call. Browsers require window.open
to happen synchronously within user gesture handlers.