diff --git a/AGENTS.md b/AGENTS.md index b061495..6cfd05e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,7 +22,7 @@ Your content is instantly available to browsers, LLMs, and AI agents.. Write mar - **Total Posts**: 17 - **Total Pages**: 5 - **Latest Post**: 2025-12-29 -- **Last Updated**: 2025-12-30T20:03:38.734Z +- **Last Updated**: 2025-12-30T23:27:44.143Z ## Tech stack diff --git a/CLAUDE.md b/CLAUDE.md index b138588..3e70fcd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ Project instructions for Claude Code. ## Project context - + Markdown sync framework. Write markdown in `content/`, run sync commands, content appears instantly via Convex real-time database. Built for developers and AI agents. @@ -61,6 +61,12 @@ npx convex deploy # Deploy Convex functions Netlify build command: `npm ci --include=dev && npx convex deploy --cmd 'npm run build'` +## AI assistance + +- Always use Context7 MCP for library/API documentation, code generation, setup or configuration steps +- Proactively look up documentation without explicit requests when working with libraries +- Use Context7 for up-to-date API references and best practices + ## Code conventions - TypeScript strict mode diff --git a/FORK_CONFIG.md b/FORK_CONFIG.md index 2cc5e1d..2219953 100644 --- a/FORK_CONFIG.md +++ b/FORK_CONFIG.md @@ -1240,6 +1240,7 @@ Replace example content in: | `content/blog/*.md` | Blog posts | | `content/pages/*.md` | Static pages (About, etc.) | | `content/pages/home.md` | Homepage intro content (slug: `home-intro`, uses blog heading styles) | +| `content/pages/footer.md` | Footer content (slug: `footer`, syncs via markdown, falls back to siteConfig.defaultContent) | | `public/images/logo.svg` | Site logo | | `public/images/og-default.svg` | Default social share image | | `public/images/logos/*.svg` | Logo gallery images | diff --git a/TASK.md b/TASK.md index e693f55..7e0758f 100644 --- a/TASK.md +++ b/TASK.md @@ -7,10 +7,17 @@ ## Current Status -v2.1.0 ready. CLAUDE.md and Claude skills documentation complete. Created CLAUDE.md in root for Claude Code instructions, .claude/skills/ directory with three focused skill files (frontmatter.md, convex.md, sync.md), and updated sync-discovery-files.ts to automatically update CLAUDE.md during sync. Documentation updated in files.md, changelog.md, changelog-page.md, and TASK.md. +v2.2.0 ready. Footer content via markdown page complete. Created `content/pages/footer.md` for managing footer content via markdown sync. Footer content syncs with `npm run sync` without redeploy needed. Falls back to `siteConfig.footer.defaultContent` when page not found. Documentation updated in files.md, changelog.md, changelog-page.md, FORK_CONFIG.md, docs.md, setup-guide.md, and TASK.md. ## Completed +- [x] Footer content via markdown page (footer.md) + - [x] Created `content/pages/footer.md` for managing footer content via markdown sync + - [x] Footer content syncs with `npm run sync` without redeploy needed + - [x] Falls back to `siteConfig.footer.defaultContent` when page not found + - [x] Updated Home.tsx and Blog.tsx to fetch footer page by slug + - [x] Updated files.md, changelog.md, changelog-page.md, FORK_CONFIG.md with documentation + - [x] CLAUDE.md and Claude skills documentation - [x] Created CLAUDE.md in root with project instructions for Claude Code - [x] Created .claude/skills/ directory with three focused skill files diff --git a/changelog.md b/changelog.md index f001fe9..61359fb 100644 --- a/changelog.md +++ b/changelog.md @@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [2.2.0] - 2025-12-30 + +### Added + +- Footer content via markdown page + - New `content/pages/footer.md` for managing footer content via markdown sync + - Footer content syncs with `npm run sync` without redeploy needed + - Edit footer text, links, and formatting through markdown instead of code + - Falls back to `siteConfig.footer.defaultContent` when page not found + - Set `showInNav: false` to hide from navigation (page remains accessible via direct URL) + - Supports full markdown including links, paragraphs, and line breaks + +### Changed + +- `src/pages/Home.tsx`: Fetches footer page by slug "footer" and passes content to Footer component +- `src/pages/Blog.tsx`: Fetches footer page by slug "footer" and passes content to Footer component +- Footer component now prioritizes page content over siteConfig.defaultContent + +### Technical + +- New file: `content/pages/footer.md` with frontmatter (slug: "footer", showInNav: false) +- Uses existing `api.pages.getPageBySlug` query to fetch footer content +- Pattern matches `home-intro` page for consistent content management + ## [2.1.0] - 2025-12-30 ### Added diff --git a/content/blog/Untitled b/content/blog/Untitled deleted file mode 100644 index c2cc62f..0000000 --- a/content/blog/Untitled +++ /dev/null @@ -1,2 +0,0 @@ -published: true -unlisted: true \ No newline at end of file diff --git a/content/blog/happy-holidays-2025.md b/content/blog/happy-holidays-2025.md index c9e637c..c7e00d3 100644 --- a/content/blog/happy-holidays-2025.md +++ b/content/blog/happy-holidays-2025.md @@ -12,8 +12,6 @@ blogFeatured: false aiChat: false image: /images/1225-changelog.png excerpt: "Thank you for the stars, forks, and feedback. More AI-first publishing features are coming." -authorName: "Wayne Sutton" -authorImage: "/images/authors/markdown.png" --- # Happy holidays and thank you diff --git a/content/blog/how-i-added-workos-with-cursor.md b/content/blog/how-i-added-workos-with-cursor.md index c082855..6779270 100644 --- a/content/blog/how-i-added-workos-with-cursor.md +++ b/content/blog/how-i-added-workos-with-cursor.md @@ -2,15 +2,17 @@ title: "How I added WorkOS to my Convex app with Cursor" description: "A timeline of adding WorkOS AuthKit authentication to my markdown blog dashboard using Cursor, prompt engineering, and vibe coding. From PRD import to published feature." date: "2025-12-30" -slug: "how-i-added-workos-with-cursor" +slug: "workos-with-convex-cursor" tags: ["cursor", "workos", "convex", "prompt-engineering", "ai-coding"] readTime: "8 min read" featured: false +newsletter: false featuredOrder: 5 published: true unlisted: true layout: "sidebar" excerpt: "How I used Cursor, prompt engineering, and Claude to add WorkOS authentication to my Convex dashboard. A real timeline from PRD import to published feature." +authorName: "Wayne Sutton" --- # How I added WorkOS to my Convex app with Cursor diff --git a/content/blog/setup-guide.md b/content/blog/setup-guide.md index 7729966..4c56bd0 100644 --- a/content/blog/setup-guide.md +++ b/content/blog/setup-guide.md @@ -1085,6 +1085,8 @@ Pages appear automatically in the navigation when published. **Home intro content:** Create `content/pages/home.md` (slug: `home-intro`) to sync homepage intro text from markdown. Headings (h1-h6) use blog post styling (`blog-h1` through `blog-h6`) with clickable anchor links. Lists, blockquotes, horizontal rules, and links also use blog styling for consistent typography. Set `textAlign: "left"`, `"center"`, or `"right"` to control alignment. Run `npm run sync` to update homepage text instantly without redeploying. Falls back to `siteConfig.bio` if `home-intro` page not found. +**Footer content via markdown:** Create `content/pages/footer.md` (slug: `footer`) to manage footer content via markdown sync instead of hardcoding in siteConfig.ts. Run `npm run sync` to update footer text instantly without touching code. Supports full markdown including links, paragraphs, and line breaks. Falls back to `siteConfig.footer.defaultContent` if page not found. + **Sidebar layout:** Add `layout: "sidebar"` to any post or page frontmatter to enable a docs-style layout with a table of contents sidebar. The sidebar extracts headings (H1, H2, H3) automatically and provides smooth scroll navigation. Only appears if headings exist in the content. **Right sidebar:** When enabled in `siteConfig.rightSidebar.enabled`, posts and pages can display a right sidebar containing the CopyPageDropdown at 1135px+ viewport width. Add `rightSidebar: true` to frontmatter to enable. Without this field, pages render normally with CopyPageDropdown in the nav bar. When enabled, CopyPageDropdown moves from the navigation bar to the right sidebar on wide screens. The right sidebar is hidden below 1135px, and CopyPageDropdown returns to the nav bar automatically. @@ -1093,7 +1095,7 @@ Pages appear automatically in the navigation when published. **Image lightbox:** Images in blog posts and pages automatically open in a full-screen lightbox when clicked (if enabled in `siteConfig.imageLightbox.enabled`). This allows readers to view images at full size. The lightbox can be closed by clicking outside the image, pressing Escape, or clicking the close button. To disable this feature, set `imageLightbox.enabled: false` in `src/config/siteConfig.ts`. -**Footer:** Footer content can be set in frontmatter (`footer` field) or use `siteConfig.footer.defaultContent`. Control visibility globally via `siteConfig.footer.enabled` and per-page via `showFooter: true/false` frontmatter. +**Footer:** Footer content can be managed three ways: (1) Create `content/pages/footer.md` to sync footer content via markdown (recommended), (2) set in frontmatter `footer` field for per-page overrides, or (3) use `siteConfig.footer.defaultContent` for static content. The markdown page takes priority over siteConfig when present. Control visibility globally via `siteConfig.footer.enabled` and per-page via `showFooter: true/false` frontmatter. **Social footer:** Display social icons and copyright below the main footer. Configure via `siteConfig.socialFooter`. Control visibility per-page via `showSocialFooter: true/false` frontmatter. diff --git a/content/pages/changelog-page.md b/content/pages/changelog-page.md index ceca37f..ba53175 100644 --- a/content/pages/changelog-page.md +++ b/content/pages/changelog-page.md @@ -10,6 +10,29 @@ layout: "sidebar" All notable changes to this project. ![](https://img.shields.io/badge/License-MIT-yellow.svg) +## v2.2.0 + +Released December 30, 2025 + +**Footer content via markdown page** + +- New `content/pages/footer.md` for managing footer content via markdown sync + - Footer content syncs with `npm run sync` without redeploy needed + - Edit footer text, links, and formatting through markdown instead of code + - Falls back to `siteConfig.footer.defaultContent` when page not found + - Set `showInNav: false` to hide from navigation (page remains accessible via direct URL) + - Supports full markdown including links, paragraphs, and line breaks + +**Technical details:** + +- New file: `content/pages/footer.md` with frontmatter (slug: "footer", showInNav: false) +- Updated: `src/pages/Home.tsx` to fetch footer page by slug "footer" +- Updated: `src/pages/Blog.tsx` to fetch footer page by slug "footer" +- Footer component now prioritizes page content over siteConfig.defaultContent +- Pattern matches `home-intro` page for consistent content management + +Updated files: `content/pages/footer.md`, `src/pages/Home.tsx`, `src/pages/Blog.tsx`, `files.md`, `changelog.md`, `content/pages/changelog-page.md`, `FORK_CONFIG.md`, `TASK.md` + ## v2.1.0 Released December 30, 2025 diff --git a/content/pages/docs.md b/content/pages/docs.md index 6301bdf..736fe30 100644 --- a/content/pages/docs.md +++ b/content/pages/docs.md @@ -146,6 +146,8 @@ order: 1 Content here... ``` +### Frontmatter options + | Field | Required | Description | | ------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `title` | Yes | Nav link text | @@ -216,6 +218,38 @@ Your homepage intro text here. **Fallback:** If `home-intro` page is not found, the homepage falls back to `siteConfig.bio` text. +### Footer content + +The footer content can be synced from markdown via `content/pages/footer.md` (slug: `footer`). This allows you to update footer text without touching code. + +**Create footer content:** + +1. Create `content/pages/footer.md`: + +```markdown +--- +title: "Footer" +slug: "footer" +published: true +showInNav: false +order: -1 +--- + +Built with [Convex](https://convex.dev) for real-time sync and deployed on [Netlify](https://netlify.com). + +Created by [Your Name](https://x.com/yourhandle). Follow on [Twitter/X](https://x.com/yourhandle) and [GitHub](https://github.com/yourusername). +``` + +2. Run `npm run sync` to sync to Convex + +3. Footer content appears on homepage and blog page instantly (no rebuild needed) + +**Markdown support:** Footer content supports full markdown including links, paragraphs, line breaks, and images. External links automatically open in new tabs. + +**Fallback:** If `footer` page is not found, the footer falls back to `siteConfig.footer.defaultContent`. + +**Relationship with siteConfig:** The `content/pages/footer.md` page takes priority over `siteConfig.footer.defaultContent` when present. Use the markdown page for dynamic content that changes frequently, or keep using siteConfig for static footer content. + ### Sidebar layout Posts and pages can use a docs-style layout with a table of contents sidebar. Add `layout: "sidebar"` to the frontmatter: diff --git a/content/pages/footer.md b/content/pages/footer.md new file mode 100644 index 0000000..d8d0190 --- /dev/null +++ b/content/pages/footer.md @@ -0,0 +1,11 @@ +--- +title: "Footer" +slug: "footer" +published: true +showInNav: false +order: -1 +--- + +Built with [Convex](https://convex.dev) for real-time sync and deployed on [Netlify](https://netlify.com). Read the [project on GitHub](https://github.com/waynesutton/markdown-site) to fork and deploy your own. View [real-time site stats](/stats). + +Created by [Wayne](https://x.com/waynesutton) with Convex, Cursor, and Claude Opus 4.5. Follow on [Twitter/X](https://x.com/waynesutton), [LinkedIn](https://www.linkedin.com/in/waynesutton/), and [GitHub](https://github.com/waynesutton). This project is licensed under the MIT [License](https://github.com/waynesutton/markdown-site?tab=MIT-1-ov-file). diff --git a/files.md b/files.md index db4805f..e5da587 100644 --- a/files.md +++ b/files.md @@ -177,6 +177,7 @@ Markdown files for static pages like About, Projects, Contact, Changelog. **Special pages:** - `home.md` (slug: `home-intro`): Homepage intro/bio content. Set `showInNav: false` to hide from navigation. Content syncs with `npm run sync` and displays on the homepage without redeploy. Headings (h1-h6) use blog post styling (`blog-h1` through `blog-h6`) with clickable anchor links. Lists, blockquotes, horizontal rules, and links also use blog styling classes for consistent typography. Use `textAlign` frontmatter field to control alignment (left/center/right, default: left). Falls back to `siteConfig.bio` if page not found or while loading. +- `footer.md` (slug: `footer`): Footer content managed via markdown sync. Set `showInNav: false` to hide from navigation. Content syncs with `npm run sync` and displays in the footer component without redeploy. Supports full markdown including links, paragraphs, and line breaks. Falls back to `siteConfig.footer.defaultContent` if page not found or while loading. This allows editing footer content without touching code. | Field | Description | | --------------- | ----------------------------------------------------------------------- | diff --git a/public/llms.txt b/public/llms.txt index 859ae91..cbe00a6 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,6 +1,6 @@ # llms.txt - Information for AI assistants and LLMs # Learn more: https://llmstxt.org/ -# Last updated: 2025-12-30T20:03:38.736Z +# Last updated: 2025-12-30T23:27:44.147Z > Your content is instantly available to browsers, LLMs, and AI agents. diff --git a/public/raw/about.md b/public/raw/about.md index 4b4fa69..8fb7df0 100644 --- a/public/raw/about.md +++ b/public/raw/about.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- An open-source publishing framework built for AI agents and developers to ship websites, docs, or blogs.. Write markdown, sync from the terminal. Your content is instantly available to browsers, LLMs, and AI agents. Built on Convex and Netlify. diff --git a/public/raw/changelog.md b/public/raw/changelog.md index 2f0ddc2..3e6c204 100644 --- a/public/raw/changelog.md +++ b/public/raw/changelog.md @@ -2,12 +2,35 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- All notable changes to this project. ![](https://img.shields.io/badge/License-MIT-yellow.svg) +## v2.2.0 + +Released December 30, 2025 + +**Footer content via markdown page** + +- New `content/pages/footer.md` for managing footer content via markdown sync + - Footer content syncs with `npm run sync` without redeploy needed + - Edit footer text, links, and formatting through markdown instead of code + - Falls back to `siteConfig.footer.defaultContent` when page not found + - Set `showInNav: false` to hide from navigation (page remains accessible via direct URL) + - Supports full markdown including links, paragraphs, and line breaks + +**Technical details:** + +- New file: `content/pages/footer.md` with frontmatter (slug: "footer", showInNav: false) +- Updated: `src/pages/Home.tsx` to fetch footer page by slug "footer" +- Updated: `src/pages/Blog.tsx` to fetch footer page by slug "footer" +- Footer component now prioritizes page content over siteConfig.defaultContent +- Pattern matches `home-intro` page for consistent content management + +Updated files: `content/pages/footer.md`, `src/pages/Home.tsx`, `src/pages/Blog.tsx`, `files.md`, `changelog.md`, `content/pages/changelog-page.md`, `FORK_CONFIG.md`, `TASK.md` + ## v2.1.0 Released December 30, 2025 diff --git a/public/raw/contact.md b/public/raw/contact.md index 15f1475..9ab46e8 100644 --- a/public/raw/contact.md +++ b/public/raw/contact.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- You found the contact page. Nice diff --git a/public/raw/docs.md b/public/raw/docs.md index 2c39ea5..431e9fc 100644 --- a/public/raw/docs.md +++ b/public/raw/docs.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- ## Getting Started @@ -143,6 +143,8 @@ order: 1 Content here... ``` +### Frontmatter options + | Field | Required | Description | | ------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `title` | Yes | Nav link text | @@ -213,6 +215,38 @@ Your homepage intro text here. **Fallback:** If `home-intro` page is not found, the homepage falls back to `siteConfig.bio` text. +### Footer content + +The footer content can be synced from markdown via `content/pages/footer.md` (slug: `footer`). This allows you to update footer text without touching code. + +**Create footer content:** + +1. Create `content/pages/footer.md`: + +```markdown +--- +title: "Footer" +slug: "footer" +published: true +showInNav: false +order: -1 +--- + +Built with [Convex](https://convex.dev) for real-time sync and deployed on [Netlify](https://netlify.com). + +Created by [Your Name](https://x.com/yourhandle). Follow on [Twitter/X](https://x.com/yourhandle) and [GitHub](https://github.com/yourusername). +``` + +2. Run `npm run sync` to sync to Convex + +3. Footer content appears on homepage and blog page instantly (no rebuild needed) + +**Markdown support:** Footer content supports full markdown including links, paragraphs, line breaks, and images. External links automatically open in new tabs. + +**Fallback:** If `footer` page is not found, the footer falls back to `siteConfig.footer.defaultContent`. + +**Relationship with siteConfig:** The `content/pages/footer.md` page takes priority over `siteConfig.footer.defaultContent` when present. Use the markdown page for dynamic content that changes frequently, or keep using siteConfig for static footer content. + ### Sidebar layout Posts and pages can use a docs-style layout with a table of contents sidebar. Add `layout: "sidebar"` to the frontmatter: diff --git a/public/raw/footer.md b/public/raw/footer.md new file mode 100644 index 0000000..052d889 --- /dev/null +++ b/public/raw/footer.md @@ -0,0 +1,10 @@ +# Footer + +--- +Type: page +Date: 2025-12-31 +--- + +Built with [Convex](https://convex.dev) for real-time sync and deployed on [Netlify](https://netlify.com). Read the [project on GitHub](https://github.com/waynesutton/markdown-site) to fork and deploy your own. View [real-time site stats](/stats). + +Created by [Wayne](https://x.com/waynesutton) with Convex, Cursor, and Claude Opus 4.5. Follow on [Twitter/X](https://x.com/waynesutton), [LinkedIn](https://www.linkedin.com/in/waynesutton/), and [GitHub](https://github.com/waynesutton). This project is licensed under the MIT [License](https://github.com/waynesutton/markdown-site?tab=MIT-1-ov-file). \ No newline at end of file diff --git a/public/raw/home-intro.md b/public/raw/home-intro.md index e8cc536..847770e 100644 --- a/public/raw/home-intro.md +++ b/public/raw/home-intro.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- An open-source publishing framework built for AI agents and developers to ship **[docs](/docs)**, or **[blogs](/blog)** or **[websites](/)**. diff --git a/public/raw/index.md b/public/raw/index.md index 2d9f2a2..c845280 100644 --- a/public/raw/index.md +++ b/public/raw/index.md @@ -4,7 +4,7 @@ This is the homepage index of all published content. ## Blog Posts (18) -- **[How I added WorkOS to my Convex app with Cursor](/raw/how-i-added-workos-with-cursor.md)** - A timeline of adding WorkOS AuthKit authentication to my markdown blog dashboard using Cursor, prompt engineering, and vibe coding. From PRD import to published feature. +- **[How I added WorkOS to my Convex app with Cursor](/raw/workos-with-convex-cursor.md)** - A timeline of adding WorkOS AuthKit authentication to my markdown blog dashboard using Cursor, prompt engineering, and vibe coding. From PRD import to published feature. - Date: 2025-12-30 | Reading time: 8 min read | Tags: cursor, workos, convex, prompt-engineering, ai-coding - **[How to setup WorkOS with Markdown Sync](/raw/how-to-setup-workos.md)** - Step-by-step guide to configure WorkOS AuthKit authentication for your markdown blog dashboard. WorkOS is optional and can be enabled in siteConfig.ts. - Date: 2025-12-29 | Reading time: 10 min read | Tags: workos, authentication, tutorial, dashboard @@ -41,8 +41,9 @@ This is the homepage index of all published content. - **[Using Images in Blog Posts](/raw/using-images-in-posts.md)** - Learn how to add header images, inline images, and Open Graph images to your markdown posts. - Date: 2025-12-14 | Reading time: 4 min read | Tags: images, tutorial, markdown, open-graph -## Pages (7) +## Pages (8) +- **[Footer](/raw/footer.md)** - **[Home Intro](/raw/home-intro.md)** - **[Docs](/raw/docs.md)** - **[About](/raw/about.md)** - An open-source publishing framework built for AI agents and developers to ship websites, docs, or blogs.. @@ -53,6 +54,6 @@ This is the homepage index of all published content. --- -**Total Content:** 18 posts, 7 pages +**Total Content:** 18 posts, 8 pages All content is available as raw markdown files at `/raw/{slug}.md` diff --git a/public/raw/newsletter.md b/public/raw/newsletter.md index 2f67eeb..6b83cd1 100644 --- a/public/raw/newsletter.md +++ b/public/raw/newsletter.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- # Newsletter Demo Page diff --git a/public/raw/projects.md b/public/raw/projects.md index 76da6bb..7bde7ef 100644 --- a/public/raw/projects.md +++ b/public/raw/projects.md @@ -2,7 +2,7 @@ --- Type: page -Date: 2025-12-30 +Date: 2025-12-31 --- This markdown framework is open source and built to be extended. Here is what ships out of the box. diff --git a/public/raw/setup-guide.md b/public/raw/setup-guide.md index 3d38a8d..fb90a0e 100644 --- a/public/raw/setup-guide.md +++ b/public/raw/setup-guide.md @@ -1078,6 +1078,8 @@ Pages appear automatically in the navigation when published. **Home intro content:** Create `content/pages/home.md` (slug: `home-intro`) to sync homepage intro text from markdown. Headings (h1-h6) use blog post styling (`blog-h1` through `blog-h6`) with clickable anchor links. Lists, blockquotes, horizontal rules, and links also use blog styling for consistent typography. Set `textAlign: "left"`, `"center"`, or `"right"` to control alignment. Run `npm run sync` to update homepage text instantly without redeploying. Falls back to `siteConfig.bio` if `home-intro` page not found. +**Footer content via markdown:** Create `content/pages/footer.md` (slug: `footer`) to manage footer content via markdown sync instead of hardcoding in siteConfig.ts. Run `npm run sync` to update footer text instantly without touching code. Supports full markdown including links, paragraphs, and line breaks. Falls back to `siteConfig.footer.defaultContent` if page not found. + **Sidebar layout:** Add `layout: "sidebar"` to any post or page frontmatter to enable a docs-style layout with a table of contents sidebar. The sidebar extracts headings (H1, H2, H3) automatically and provides smooth scroll navigation. Only appears if headings exist in the content. **Right sidebar:** When enabled in `siteConfig.rightSidebar.enabled`, posts and pages can display a right sidebar containing the CopyPageDropdown at 1135px+ viewport width. Add `rightSidebar: true` to frontmatter to enable. Without this field, pages render normally with CopyPageDropdown in the nav bar. When enabled, CopyPageDropdown moves from the navigation bar to the right sidebar on wide screens. The right sidebar is hidden below 1135px, and CopyPageDropdown returns to the nav bar automatically. @@ -1086,7 +1088,7 @@ Pages appear automatically in the navigation when published. **Image lightbox:** Images in blog posts and pages automatically open in a full-screen lightbox when clicked (if enabled in `siteConfig.imageLightbox.enabled`). This allows readers to view images at full size. The lightbox can be closed by clicking outside the image, pressing Escape, or clicking the close button. To disable this feature, set `imageLightbox.enabled: false` in `src/config/siteConfig.ts`. -**Footer:** Footer content can be set in frontmatter (`footer` field) or use `siteConfig.footer.defaultContent`. Control visibility globally via `siteConfig.footer.enabled` and per-page via `showFooter: true/false` frontmatter. +**Footer:** Footer content can be managed three ways: (1) Create `content/pages/footer.md` to sync footer content via markdown (recommended), (2) set in frontmatter `footer` field for per-page overrides, or (3) use `siteConfig.footer.defaultContent` for static content. The markdown page takes priority over siteConfig when present. Control visibility globally via `siteConfig.footer.enabled` and per-page via `showFooter: true/false` frontmatter. **Social footer:** Display social icons and copyright below the main footer. Configure via `siteConfig.socialFooter`. Control visibility per-page via `showSocialFooter: true/false` frontmatter. diff --git a/public/raw/how-i-added-workos-with-cursor.md b/public/raw/workos-with-convex-cursor.md similarity index 100% rename from public/raw/how-i-added-workos-with-cursor.md rename to public/raw/workos-with-convex-cursor.md diff --git a/src/config/siteConfig.ts b/src/config/siteConfig.ts index be291d9..636d3a2 100644 --- a/src/config/siteConfig.ts +++ b/src/config/siteConfig.ts @@ -491,7 +491,7 @@ export const siteConfig: SiteConfig = { }, // Footer configuration - // Footer content can be set in frontmatter (footer field) or use defaultContent here + // Footer content is loaded from content/pages/footer.md (synced via npm run sync) // Use showFooter: false in frontmatter to hide footer on specific posts/pages footer: { enabled: true, // Global toggle for footer @@ -499,10 +499,8 @@ export const siteConfig: SiteConfig = { showOnPosts: true, // Default: show footer on blog posts (override with frontmatter) showOnPages: true, // Default: show footer on static pages (override with frontmatter) showOnBlogPage: true, // Show footer on /blog page - // Default footer markdown (used when frontmatter footer field is not provided) - defaultContent: `Built with [Convex](https://convex.dev) for real-time sync and deployed on [Netlify](https://netlify.com). Read the [project on GitHub](https://github.com/waynesutton/markdown-site) to fork and deploy your own. View [real-time site stats](/stats). - -Created by [Wayne](https://x.com/waynesutton) with Convex, Cursor, and Claude Opus 4.5. Follow on [Twitter/X](https://x.com/waynesutton), [LinkedIn](https://www.linkedin.com/in/waynesutton/), and [GitHub](https://github.com/waynesutton). This project is licensed under the MIT [License](https://github.com/waynesutton/markdown-site?tab=MIT-1-ov-file).`, + // Default footer markdown (fallback if footer.md doesn't exist - edit content/pages/footer.md instead) + defaultContent: undefined, }, // Homepage configuration @@ -577,6 +575,7 @@ Created by [Wayne](https://x.com/waynesutton) with Convex, Cursor, and Claude Op }, { platform: "twitter", url: "https://x.com/waynesutton" }, { platform: "linkedin", url: "https://www.linkedin.com/in/waynesutton/" }, + { platform: "discord", url: "https://www.convex.dev/community/" }, ], copyright: { siteName: "MarkDown Sync is open-source", // Update with your site/company name diff --git a/src/pages/Blog.tsx b/src/pages/Blog.tsx index 2a1f2c9..fbc9a58 100644 --- a/src/pages/Blog.tsx +++ b/src/pages/Blog.tsx @@ -28,6 +28,9 @@ export default function Blog() { // Fetch all blog featured posts for hero + featured row const blogFeaturedPosts = useQuery(api.posts.getBlogFeaturedPosts); + // Fetch footer content from Convex (synced via markdown) + const footerPage = useQuery(api.pages.getPageBySlug, { slug: "footer" }); + // State for view mode toggle (list or cards) const [viewMode, setViewMode] = useState<"list" | "cards">( siteConfig.blogPage.viewMode, @@ -218,7 +221,7 @@ export default function Blog() { )} {/* Footer section */} - {showFooter &&