diff --git a/README.md b/README.md
index 3316d50..675f132 100644
--- a/README.md
+++ b/README.md
@@ -108,6 +108,7 @@ Follow the step-by-step guide in `FORK_CONFIG.md` to update each file manually.
- Homepage post limit with optional "read more" link
- Blog page featured layout with hero post
- Show image at top of posts/pages
+- Version control with 3-day history for posts and pages (diff view, one-click restore)
### SEO and Discovery
@@ -171,6 +172,7 @@ See [How to Use the MCP Server](https://www.markdown.fast/how-to-use-mcp-server)
The framework includes a centralized dashboard at `/dashboard` for managing content and configuring your site. Features include:
- Content management: Edit posts and pages with live preview
+- Version control: View history, compare diffs, restore previous versions (3-day retention)
- Sync commands: Run sync operations from the browser
- Site configuration: Configure all settings via UI
- Newsletter management: Integrated subscriber and email management
diff --git a/TASK.md b/TASK.md
index 5a8b52e..de77ff9 100644
--- a/TASK.md
+++ b/TASK.md
@@ -4,10 +4,17 @@
## Current Status
-v2.16.0 ready. Added version control system for posts and pages.
+v2.16.1 ready. Docs layout scrollbar hiding for cleaner UI.
## Completed
+- [x] Docs layout scrollbar hiding (v2.16.1)
+ - [x] Hidden scrollbars on left sidebar, right sidebar, and main docs content
+ - [x] Added body:has(.docs-layout) to prevent page-level scrolling
+ - [x] Cross-browser support (IE/Edge, Firefox, Chrome/Safari)
+ - [x] Scrolling still works via trackpad, wheel, and touch
+ - [x] Updated files.md, changelog.md, task.md, changelog-page.md
+
- [x] Version control system (v2.16.0)
- [x] Added contentVersions and versionControlSettings tables to schema
- [x] Created convex/versions.ts with 7 functions (isEnabled, setEnabled, createVersion, getVersionHistory, getVersion, restoreVersion, cleanupOldVersions, getStats)
diff --git a/changelog.md b/changelog.md
index 8112a47..9fa635d 100644
--- a/changelog.md
+++ b/changelog.md
@@ -4,6 +4,23 @@ 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.16.1] - 2026-01-10
+
+### Fixed
+
+- Docs layout scrollbar hiding for cleaner UI
+ - Hidden scrollbars on left sidebar, right sidebar, and main docs content
+ - Scrolling still works via trackpad, mouse wheel, and touch
+ - Added `body:has(.docs-layout)` to prevent page-level scrolling on docs pages
+ - Cross-browser support: `-ms-overflow-style: none` (IE/Edge), `scrollbar-width: none` (Firefox), `::-webkit-scrollbar { width: 0 }` (Chrome/Safari)
+
+### Technical
+
+- Updated `src/styles/global.css`:
+ - Added `body:has(.docs-layout) { overflow: hidden; }` rule
+ - Added scrollbar hiding rules for `.docs-sidebar-left`, `.docs-sidebar-right`, `.docs-content`
+ - Existing scrollbar thumb/track styles remain but are invisible with width: 0
+
## [2.16.0] - 2026-01-09
### Added
diff --git a/content/pages/about.md b/content/pages/about.md
index 6336121..1a42731 100644
--- a/content/pages/about.md
+++ b/content/pages/about.md
@@ -6,14 +6,16 @@ order: 2
excerpt: "An open-source publishing framework built for AI agents and developers to ship websites, docs, or blogs."
---
-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.
+An open-source publishing framework built for AI agents and developers to ship websites, docs, or blogs. Two ways to publish: write markdown and sync from the terminal, or use the web dashboard. Your content is instantly available to browsers, LLMs, and AI agents. Built on Convex and Netlify.
## What makes it a dev sync system?
-**File-based content.** All posts and pages live in `content/blog/` and `content/pages/` as markdown files with frontmatter. No database UI. No admin panel. Just files in your repo.
+**File-based content.** Posts and pages live in `content/blog/` and `content/pages/` as markdown files with frontmatter. Version controlled in your repo. The dashboard provides a web UI for creating and editing content directly in the database.
**CLI publishing workflow.** Write markdown locally, then run `npm run sync` (dev) or `npm run sync:prod` (production). Content appears instantly via Convex real-time sync. Images require git commit and push since they are served as static files from Netlify.
+**Dashboard workflow.** Create and edit content at `/dashboard` without touching files. Dashboard content saves directly to the database with `source: "dashboard"` tracking. Export to markdown files with `npm run export:db` when needed.
+
**Sync commands:**
**Development:**
@@ -28,6 +30,11 @@ An open-source publishing framework built for AI agents and developers to ship w
- npm run sync:discovery:prod - Update discovery files
- npm run sync:all:prod - Sync content + discovery files together
+**Export dashboard content:**
+
+- npm run export:db - Export dashboard posts/pages to content folders (development)
+- npm run export:db:prod - Export dashboard posts/pages (production)
+
**Version controlled.** Markdown source files live in your repo alongside code. Commit changes, review diffs, roll back like any codebase. The sync command pushes content to the database.
```bash
@@ -38,7 +45,7 @@ npm run sync # dev
npm run sync:prod # production
```
-**No admin interface.** No web UI for creating or editing content. You use your code editor and terminal.
+**Dual source architecture.** File-synced content (`source: "sync"`) and dashboard content (`source: "dashboard"`) coexist. Neither overwrites the other. Use whichever workflow fits your needs.
## The real-time twist
@@ -118,6 +125,14 @@ It's a hybrid: developer workflow for publishing + real-time delivery like a dyn
- Contact forms on pages/posts via frontmatter with AgentMail delivery
- Email notifications for new subscribers and weekly stats
+**Version control:**
+
+- 3-day version history for posts and pages (similar to Obsidian Sync)
+- Automatic snapshots before every content change (sync or dashboard edit)
+- Side-by-side diff view to compare versions
+- One-click restore with automatic backup of current version
+- Toggle to enable/disable via dashboard settings
+
**Developer and AI agent support:**
- CLAUDE.md for Claude Code instructions and workflows
diff --git a/content/pages/changelog-page.md b/content/pages/changelog-page.md
index f1e9396..bec702d 100644
--- a/content/pages/changelog-page.md
+++ b/content/pages/changelog-page.md
@@ -11,6 +11,34 @@ docsSectionOrder: 4
All notable changes to this project.
+## v2.16.1
+
+Released January 10, 2026
+
+**Docs layout scrollbar hiding**
+
+Hidden scrollbars on the docs section layout while preserving scroll functionality. Cleaner UI that matches the design without visible scrollbars.
+
+**Fixes:**
+
+- Left sidebar scrolls but no scrollbar visible
+- Right sidebar scrolls but no scrollbar visible
+- Main docs content scrolls but no scrollbar visible
+- No browser page scrollbar on docs pages
+- Scrolling works via trackpad, mouse wheel, and touch
+
+**Technical:**
+
+- Added `body:has(.docs-layout) { overflow: hidden; }` to prevent page-level scroll
+- Added scrollbar hiding rules for `.docs-sidebar-left`, `.docs-sidebar-right`, `.docs-content`
+- Cross-browser support: `-ms-overflow-style: none` (IE/Edge), `scrollbar-width: none` (Firefox), `::-webkit-scrollbar { width: 0 }` (Chrome/Safari)
+
+**Files changed:**
+
+- `src/styles/global.css` - Added scrollbar hiding rules and body overflow rule
+
+---
+
## v2.16.0
Released January 9, 2026
diff --git a/content/pages/docs.md b/content/pages/docs.md
index 1b43821..6260a93 100644
--- a/content/pages/docs.md
+++ b/content/pages/docs.md
@@ -35,6 +35,11 @@ Reference documentation for setting up, customizing, and deploying this markdown
- npm run sync:discovery:prod - Update discovery files
- npm run sync:all:prod - Sync content + discovery files together
+**Export dashboard content:**
+
+- npm run export:db - Export dashboard posts/pages to content folders (development)
+- npm run export:db:prod - Export dashboard posts/pages (production)
+
## Quick start
```bash
diff --git a/content/pages/home.md b/content/pages/home.md
index 3533c5d..e8a7199 100644
--- a/content/pages/home.md
+++ b/content/pages/home.md
@@ -19,7 +19,7 @@ agents. -->
**AI agent integration** — API endpoints, raw markdown files, skills.md and MCP server included.
-**File-based publishing** — Write markdown locally, run `npm run sync`, content syncs everywhere.
+**File-based publishing** — Write markdown locally, content syncs everywhere with version control.
**URL content import** — Import urls to scrape any webpage into markdown with Firecrawl.
diff --git a/files.md b/files.md
index 2a37e52..4ffe383 100644
--- a/files.md
+++ b/files.md
@@ -107,7 +107,7 @@ A brief description of each file in the codebase.
| File | Description |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `global.css` | Global CSS with theme variables, centralized font-size CSS variables for all themes, sidebar styling with alternate background colors, hidden scrollbar, and consistent borders using box-shadow for docs-style layout. Left sidebar (`.post-sidebar-wrapper`) and right sidebar (`.post-sidebar-right`) have separate, independent styles. Footer image styles (`.site-footer-image-wrapper`, `.site-footer-image`, `.site-footer-image-caption`) for responsive image display. Write page layout uses viewport height constraints (100vh) with overflow hidden to prevent page scroll, and AI chat uses flexbox with min-height: 0 for proper scrollable message area. Image lightbox styles (`.image-lightbox-backdrop`, `.image-lightbox-img`, `.image-lightbox-close`, `.image-lightbox-caption`) for full-screen image magnification with backdrop, close button, and caption display. SEO: `.blog-h1-demoted` class for demoted H1s (semantic H2 with H1 styling), CSS `order` properties for article/sidebar DOM order optimization. Core Web Vitals: GPU-composited visitor-pulse animations with `transform: scale()`, docs-skeleton-pulse using pseudo-element with `transform: translateX()`, `will-change` hints on animated elements (theme-toggle, copy-page-menu, search-modal-backdrop, scroll-to-top, image-lightbox-backdrop, search-modal, ai-chat-message, dashboard-toast, ask-ai-modal, docs-article) |
+| `global.css` | Global CSS with theme variables, centralized font-size CSS variables for all themes, sidebar styling with alternate background colors, hidden scrollbar, and consistent borders using box-shadow for docs-style layout. Left sidebar (`.post-sidebar-wrapper`) and right sidebar (`.post-sidebar-right`) have separate, independent styles. Footer image styles (`.site-footer-image-wrapper`, `.site-footer-image`, `.site-footer-image-caption`) for responsive image display. Write page layout uses viewport height constraints (100vh) with overflow hidden to prevent page scroll, and AI chat uses flexbox with min-height: 0 for proper scrollable message area. Image lightbox styles (`.image-lightbox-backdrop`, `.image-lightbox-img`, `.image-lightbox-close`, `.image-lightbox-caption`) for full-screen image magnification with backdrop, close button, and caption display. SEO: `.blog-h1-demoted` class for demoted H1s (semantic H2 with H1 styling), CSS `order` properties for article/sidebar DOM order optimization. Core Web Vitals: GPU-composited visitor-pulse animations with `transform: scale()`, docs-skeleton-pulse using pseudo-element with `transform: translateX()`, `will-change` hints on animated elements (theme-toggle, copy-page-menu, search-modal-backdrop, scroll-to-top, image-lightbox-backdrop, search-modal, ai-chat-message, dashboard-toast, ask-ai-modal, docs-article). Docs layout scrollbar hiding: `body:has(.docs-layout)` prevents page-level scroll, `.docs-sidebar-left`, `.docs-sidebar-right`, and `.docs-content` use `scrollbar-width: none` (Firefox), `-ms-overflow-style: none` (IE/Edge), and `::-webkit-scrollbar { width: 0 }` (Chrome/Safari) for invisible scrollbars while preserving scroll functionality |
## Convex Backend (`convex/`)
diff --git a/public/raw/about.md b/public/raw/about.md
index 15a3314..a6232d6 100644
--- a/public/raw/about.md
+++ b/public/raw/about.md
@@ -5,14 +5,16 @@ Type: page
Date: 2026-01-10
---
-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.
+An open-source publishing framework built for AI agents and developers to ship websites, docs, or blogs. Two ways to publish: write markdown and sync from the terminal, or use the web dashboard. Your content is instantly available to browsers, LLMs, and AI agents. Built on Convex and Netlify.
## What makes it a dev sync system?
-**File-based content.** All posts and pages live in `content/blog/` and `content/pages/` as markdown files with frontmatter. No database UI. No admin panel. Just files in your repo.
+**File-based content.** Posts and pages live in `content/blog/` and `content/pages/` as markdown files with frontmatter. Version controlled in your repo. The dashboard provides a web UI for creating and editing content directly in the database.
**CLI publishing workflow.** Write markdown locally, then run `npm run sync` (dev) or `npm run sync:prod` (production). Content appears instantly via Convex real-time sync. Images require git commit and push since they are served as static files from Netlify.
+**Dashboard workflow.** Create and edit content at `/dashboard` without touching files. Dashboard content saves directly to the database with `source: "dashboard"` tracking. Export to markdown files with `npm run export:db` when needed.
+
**Sync commands:**
**Development:**
@@ -27,6 +29,11 @@ An open-source publishing framework built for AI agents and developers to ship w
- npm run sync:discovery:prod - Update discovery files
- npm run sync:all:prod - Sync content + discovery files together
+**Export dashboard content:**
+
+- npm run export:db - Export dashboard posts/pages to content folders (development)
+- npm run export:db:prod - Export dashboard posts/pages (production)
+
**Version controlled.** Markdown source files live in your repo alongside code. Commit changes, review diffs, roll back like any codebase. The sync command pushes content to the database.
```bash
@@ -37,7 +44,7 @@ npm run sync # dev
npm run sync:prod # production
```
-**No admin interface.** No web UI for creating or editing content. You use your code editor and terminal.
+**Dual source architecture.** File-synced content (`source: "sync"`) and dashboard content (`source: "dashboard"`) coexist. Neither overwrites the other. Use whichever workflow fits your needs.
## The real-time twist
@@ -117,6 +124,14 @@ It's a hybrid: developer workflow for publishing + real-time delivery like a dyn
- Contact forms on pages/posts via frontmatter with AgentMail delivery
- Email notifications for new subscribers and weekly stats
+**Version control:**
+
+- 3-day version history for posts and pages (similar to Obsidian Sync)
+- Automatic snapshots before every content change (sync or dashboard edit)
+- Side-by-side diff view to compare versions
+- One-click restore with automatic backup of current version
+- Toggle to enable/disable via dashboard settings
+
**Developer and AI agent support:**
- CLAUDE.md for Claude Code instructions and workflows
diff --git a/public/raw/changelog.md b/public/raw/changelog.md
index 46e1a67..f2970cd 100644
--- a/public/raw/changelog.md
+++ b/public/raw/changelog.md
@@ -7,6 +7,34 @@ Date: 2026-01-10
All notable changes to this project.
+## v2.16.1
+
+Released January 10, 2026
+
+**Docs layout scrollbar hiding**
+
+Hidden scrollbars on the docs section layout while preserving scroll functionality. Cleaner UI that matches the design without visible scrollbars.
+
+**Fixes:**
+
+- Left sidebar scrolls but no scrollbar visible
+- Right sidebar scrolls but no scrollbar visible
+- Main docs content scrolls but no scrollbar visible
+- No browser page scrollbar on docs pages
+- Scrolling works via trackpad, mouse wheel, and touch
+
+**Technical:**
+
+- Added `body:has(.docs-layout) { overflow: hidden; }` to prevent page-level scroll
+- Added scrollbar hiding rules for `.docs-sidebar-left`, `.docs-sidebar-right`, `.docs-content`
+- Cross-browser support: `-ms-overflow-style: none` (IE/Edge), `scrollbar-width: none` (Firefox), `::-webkit-scrollbar { width: 0 }` (Chrome/Safari)
+
+**Files changed:**
+
+- `src/styles/global.css` - Added scrollbar hiding rules and body overflow rule
+
+---
+
## v2.16.0
Released January 9, 2026
diff --git a/public/raw/documentation.md b/public/raw/documentation.md
index e63fbc5..cd948e6 100644
--- a/public/raw/documentation.md
+++ b/public/raw/documentation.md
@@ -25,6 +25,11 @@ Reference documentation for setting up, customizing, and deploying this markdown
- npm run sync:discovery:prod - Update discovery files
- npm run sync:all:prod - Sync content + discovery files together
+**Export dashboard content:**
+
+- npm run export:db - Export dashboard posts/pages to content folders (development)
+- npm run export:db:prod - Export dashboard posts/pages (production)
+
## Quick start
```bash
diff --git a/public/raw/home-intro.md b/public/raw/home-intro.md
index 28b1ee5..084f770 100644
--- a/public/raw/home-intro.md
+++ b/public/raw/home-intro.md
@@ -17,7 +17,7 @@ agents. -->
**AI agent integration** — API endpoints, raw markdown files, skills.md and MCP server included.
-**File-based publishing** — Write markdown locally, run `npm run sync`, content syncs everywhere.
+**File-based publishing** — Write markdown locally, content syncs everywhere with version control.
**URL content import** — Import urls to scrape any webpage into markdown with Firecrawl.
diff --git a/public/raw/index.md b/public/raw/index.md
index f7989a6..1b4cbaa 100644
--- a/public/raw/index.md
+++ b/public/raw/index.md
@@ -12,7 +12,7 @@ agents. -->
**AI agent integration** — API endpoints, raw markdown files, skills.md and MCP server included.
-**File-based publishing** — Write markdown locally, run `npm run sync`, content syncs everywhere.
+**File-based publishing** — Write markdown locally, content syncs everywhere with version control.
**URL content import** — Import urls to scrape any webpage into markdown with Firecrawl.
diff --git a/src/styles/global.css b/src/styles/global.css
index fe13ec5..fec00e8 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -12932,6 +12932,11 @@ body {
Docs Section Layout (Starlight-style)
============================================ */
+/* Prevent page-level scrolling on docs pages - only internal columns scroll */
+body:has(.docs-layout) {
+ overflow: hidden;
+}
+
/* Three-column docs layout - full width */
/* Sidebars are position: fixed, so no grid needed */
/* DOM order: main content first (for SEO - H1 before sidebar H3), then sidebars */
@@ -12949,7 +12954,7 @@ body {
/* Same as default - sidebars are fixed */
}
-/* Left sidebar for docs navigation - flush left, full height */
+/* Left sidebar for docs navigation - flush left, full height, scrolls independently */
.docs-sidebar-left {
position: fixed;
top: 0;
@@ -12958,8 +12963,14 @@ body {
width: 280px;
height: 100%;
overflow-y: auto;
+ overscroll-behavior: contain; /* Prevent scroll chaining to parent */
background-color: var(--bg-sidebar);
padding: 24px;
+ /*
+ * DO NOT REMOVE: padding-top, border-radius, border-top, border-right
+ * These styles provide visual separation and consistent spacing.
+ * Removing them breaks the docs layout design.
+ */
padding-top: 20px;
border-radius: 6px;
border-top: 1px solid var(--border-sidebar);
@@ -12984,7 +12995,7 @@ body {
background-color: var(--text-muted);
}
-/* Right sidebar for table of contents - flush right, full height */
+/* Right sidebar for table of contents - flush right, full height, scrolls independently */
.docs-sidebar-right {
position: fixed;
top: 0;
@@ -12993,7 +13004,13 @@ body {
width: 280px;
height: 100%;
overflow-y: auto;
+ overscroll-behavior: contain; /* Prevent scroll chaining to parent */
background-color: var(--bg-sidebar);
+ /*
+ * DO NOT REMOVE: padding-top, border-radius, border-top, border-left
+ * These styles provide visual separation and consistent spacing.
+ * Removing them breaks the docs layout design.
+ */
padding: 24px;
padding-top: 20px;
border-radius: 6px;
@@ -13019,6 +13036,21 @@ body {
background-color: var(--text-muted);
}
+/* Hide scrollbars but keep scroll functionality */
+.docs-sidebar-left,
+.docs-sidebar-right,
+.docs-content {
+ -ms-overflow-style: none; /* IE/old Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+.docs-sidebar-left::-webkit-scrollbar,
+.docs-sidebar-right::-webkit-scrollbar,
+.docs-content::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+}
+
/* AI Chat section in docs right sidebar */
.docs-ai-chat-section {
padding: 0px;
@@ -13094,13 +13126,16 @@ body {
max-height: 80px;
}
-/* Main content area - uses margins for fixed sidebars */
+/* Main content area - uses margins for fixed sidebars, scrolls independently */
.docs-content {
- margin-left: 280px;
- margin-right: 280px;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 280px;
+ right: 280px;
padding: 32px 48px;
overflow-y: auto;
- min-height: calc(100vh - 80px);
+ overscroll-behavior: contain; /* Prevent scroll chaining to parent */
}
/* Center the article within docs-content */
@@ -13112,7 +13147,7 @@ body {
/* No TOC layout - content takes more space (no right sidebar) */
.docs-layout.no-toc .docs-content {
- margin-right: 0;
+ right: 0;
}
/* Docs sidebar navigation */
@@ -13496,7 +13531,7 @@ body {
}
.docs-content {
- margin-right: 0;
+ right: 0;
}
}
@@ -13507,7 +13542,7 @@ body {
}
.docs-content {
- margin-left: 240px;
+ left: 240px;
padding: 24px 32px;
}
}
@@ -13526,8 +13561,9 @@ body {
}
.docs-content {
- margin-left: 0;
- margin-right: 0;
+ position: static;
+ left: auto;
+ right: auto;
padding: 20px 16px;
min-height: auto;
}