Clean, fast, content‑first blog starter with Next.js 15, React 19, and MDX.
pnpm install
pnpm dev| Feature | Status |
|---|---|
| MDX Support | Yes |
| Syntax Highlighting (Shiki) | Yes |
| Code Copy Button | Yes |
| Custom MDX Components | Yes |
| Static Site Generation | Yes |
| Fast Page Loads | Yes |
| Responsive Design | Yes |
| Table of Contents (scroll-spy) | Yes |
| Reading Time Estimate | Yes |
| Related Posts (tag-based) | Yes |
| Tags & Tagging | Yes |
| Series/Multi-part Posts | Yes |
| Draft Posts | Yes |
| Command Palette (⌘K) | Yes |
| Scroll Progress Bar | Yes |
| Scroll to Top Button | Yes |
| RSS/Atom/JSON Feeds | Yes |
| Sitemap Generation | Yes |
| SEO Optimized | Yes |
| Theme Mode | Yes |
| Theme-aware Components | Yes |
| YAML-based Plugin Config | Yes |
| Plugin arch / easy to extend setup | Yes |
| Comments (Giscus) | Yes |
| Open Graph Images (Dynamic) | |
| Search (Fuse.js) | Yes |
| Code Line Numbers | Yes |
| Code Language Badges | Yes |
| Code Diff Highlighting | |
| View Counter | |
| Analytics (umami, plausible or simple-analytics) | Yes |
| Social Share Buttons | Yes |
| Keyboard Shortcuts | |
| Series Navigation | Yes |
| Dynamic Content Types | Yes |
| PDF/PPT Viewer | Yes |
| Content Templates | Yes |
| Content Warnings | |
| Diagrams (Mermaid) |
See docs/README.md for complete documentation.
Using as a Template
When using this as your blog template, update/delete the following:
Site Configuration:
config/seo.yaml— Your site name, description, URL, social handlesconfig/plugins.yaml— Analytics domain, Giscus repo (if using comments)config/projects.yaml— Your projects (or delete if not needed).env.local— AddNEXT_PUBLIC_SITE_URLandDRAFT_ACCESS_TOKEN
Personal Content:
app/about/page.tsx— Your bio and informationapp/page.tsx— Homepage introduction textapp/favicon.ico— Your faviconpublic/— Replace any images/assets with yours
Branding:
README.md— Update project name and descriptionpackage.json— Update name, description, author
Example Content:
content/blog/*.mdx— Delete all example blog postscontent/talks/*.mdx— Delete example talks (or the entire folder if not needed)config/projects.yaml— Clear example projects
Optional Cleanup:
- Remove any unused content types from
config/content-types.yaml - Remove unused plugins from
config/plugins.yaml - Delete
docs/folder if you don't need documentation
- Clone/fork the repository
- Run
pnpm install - Update
config/seo.yamlwith your info - Create
.env.localwith your site URL - Delete example posts in
content/blog/ - Update
app/about/page.tsx - Replace
app/favicon.ico - Create your first post:
pnpm new:post - Test locally:
pnpm dev - Deploy!
app/ Pages and routes
components/ UI and MDX components
content/ Blog posts (MDX)
lib/ Utilities and site config
plugins/ Plugin implementations
config/ YAML config (seo, projects, plugins)
docs/ Documentation
pnpm dev— start the dev serverpnpm build— production buildpnpm start— run the production serverpnpm export— static export toout/pnpm preview— serve the exported site fromout/pnpm new:content-type— create a new content type (interactive CLI)pnpm new:post— create a new post from a template (interactive CLI)
Giscus enables GitHub Discussions-powered comments on blog posts.
- Visit giscus.app
- Enter your repo (e.g.,
username/repo) - Enable Discussions in your GitHub repo settings
- Copy the generated IDs
- Update
config/plugins.yaml:
giscus:
enabled: true
repo: "username/repo"
repoId: "your-repo-id"
category: "General"
categoryId: "your-category-id"See config/plugins.yaml for all options (theme, position, etc).
Build and run the static site with Caddy on port 80:
docker build -t monolog-blog .
docker run -d -p 80:80 --name monolog monolog-blogThen open http://localhost.
Note: Static export is handled during next build via output: 'export' in next.config.ts.
pnpm install
pnpm devOpen http://localhost:3000.
MIT
Inspired by leerob.com and based on leerob/next-mdx-blog.