A versioned product feature documentation platform built with Next.js 15.
- Versioned documentation — each version is a snapshot, users can switch between versions
- Embedded video players — custom
::video[filename]directive in markdown - User feedback — select text and mark it as outdated, report videos, or submit general feedback
- Admin dashboard — manage all feedback from
/adminwith filtering and status updates - Markdown rendering — remark + rehype pipeline with GFM support
- SQLite storage — lightweight feedback storage via better-sqlite3 (no external database)
npm install
npm run devOpen http://localhost:3000.
featuredocs/
├── src/
│ ├── app/ — Next.js App Router pages and API routes
│ ├── components/ — React components
│ └── lib/ — Content loading, database, types
├── content/ — Documentation content (markdown + videos)
│ └── nesta/ — Example product
└── .data/ — SQLite database (gitignored)
-
Create a directory under
content/with your product slug:content/my-product/ -
Add a
product.jsonfile:{ "name": "My Product", "tagline": "A short tagline", "description": "Longer description of the product.", "versions": ["1.0.0"], "latest": "1.0.0" } -
Create a version directory:
content/my-product/v1.0.0/ -
Add a
features.jsonfile in the version directory:{ "version": "1.0.0", "releaseDate": "2026-01-15", "features": [ { "slug": "my-feature", "title": "My Feature Title", "summary": "A brief summary of this feature.", "video": "videos/demo.mp4", "isNew": true } ] } -
Create a markdown file for each feature using its slug:
content/my-product/v1.0.0/my-feature.md -
Optionally add video files:
content/my-product/v1.0.0/videos/demo.mp4
-
Add the version to the product's
product.json:- Add the version string to the
versionsarray (newest first) - Update
latestif this is the newest version
- Add the version string to the
-
Create the version directory and its
features.json -
Create markdown files for each feature. You can copy from the previous version and update as needed.
Standard markdown plus a custom video directive:
# Feature Title
Regular markdown content here...
::video[videos/demo.mp4]
More content...
::video[videos/another.mp4]{title="Optional Title"}Users can submit feedback in three ways:
- Text selection — select text on a feature page, click "Mark as outdated"
- Video report — hover over a video player, click the flag icon
- General report — click "Report outdated" button on any feature page
All feedback is stored in SQLite at .data/feedback.db and can be managed from the admin dashboard at /admin.
- Next.js 15 (App Router)
- TypeScript (strict mode)
- Tailwind CSS v4
- remark + rehype for markdown
- better-sqlite3 for feedback storage
For production, consider replacing file-based SQLite with Turso or libSQL for serverless compatibility. The SQLite operations in src/lib/feedback-db.ts are the only file that needs updating.