Next.jsReactPortfolioBlogStarter

nextjs-mui-blog-starter — Next.js Portfolio Template

By muhimasri

A blog and portfolio template based on Next.js App Router, Material UI, and MDX, with built-in tag filtering, table of contents, code highlighting, and light/dark themes. The README explains the directory structure and theme token usage.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-14View source

What stands out

A quick read of the recorded project description.

01

MDX blog system: each post is stored in its own folder with page.mdx, using frontmatter to manage title, description, date, tags, and images

02

Supports tag filtering, featured images, recommended posts, and a table of contents automatically generated from headings

03

Code syntax highlighting via rehype-pretty-code and Shiki

04

Light/dark modes based on MUI theme tokens, with theme values convertible to CSS variables for external style references

05

Includes a homepage, About page, dynamic routing, and Open Graph metadata

06

Uses TypeScript and provides ESLint and Prettier scripts

Template Details

This template is used to build blog or technical portfolio sites. The README states that it includes a homepage, an About page, a blog system based on MDX and frontmatter, dynamic routing, tag filtering, featured images and recommended posts, an automatically generated table of contents, code highlighting implemented via rehype-pretty-code and Shiki, light/dark modes based on MUI theme tokens, Open Graph metadata, and responsive layout. Content is organized under content/ with one folder per post containing page.mdx, images are placed in public/images/, and headings are included in the table of contents.

On the technical stack side, the README lists Next.js App Router, Material UI, MDX, rehype-pretty-code, TypeScript, ESLint, and Prettier, and explains that MDX is compiled via next-mdx-remote, rehype-pretty-code, and gray-matter. The styling system is centralized in src/styles/tokens.ts, theme.ts, and global.tsx. The theme is generated from design tokens, and MUI converts theme values into CSS variables for reference in external stylesheets.

The README's Roadmap lists accessibility improvements, RSS, Sitemap, GitHub comments, social sharing, PWA, Newsletter integration, and custom syntax highlighting themes as to-dos, indicating that these capabilities are not currently described in the README as implemented features. The README does not provide deployment platform, environment variable, or hosting step instructions, nor does it describe content scale, build artifact size, or performance data beyond the Lighthouse badge.

Next.jsReactPortfolioBlogStarter

Is it right for your project?

Use Cases

  • Building a personal technical blog and writing articles with code examples in MDX
  • Creating a developer portfolio site to showcase projects and article lists
  • Content sites that need tag categorization, article table of contents, and light/dark theme switching
  • Projects that want to centrally manage style variables such as colors, spacing, and fonts with design tokens

Suitable For

  • Developers familiar with Next.js App Router and React
  • Individuals or teams willing to use Material UI and MDX to write content
  • Blog or portfolio projects that need customizable theme tokens
  • Authors who want to manage articles as folders plus MDX files

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Commands provided by the README: npm install, npm run dev, npm run build, npm start, npm run lint, npm run format

  2. 2

    Posts are placed under content/ with one folder per post, the file name is page.mdx, images are placed in public/images/ and referenced via /images/...

  3. 3

    Themes and design tokens are located in src/styles/tokens.ts, theme.ts, and global.tsx, and can be modified as needed

  4. 4

    The README does not provide deployment platform, environment variable, or hosting step instructions

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in a public repository; the free scope is the code of this version and does not mean that external services or third-party assets are free.

Must comply with when using

  • Allows free use, modification, commercial use, and distribution of this version's code.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the complete MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis

Compiled by DeepSeek based on repository license and README ·2026-10-14. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 88 / 100
Technologies
Next.js · React
Website type
Portfolio · Blog · Starter
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2025-12-11
Screenshot last checked
2026-10-14

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Next.js as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: codex-user-requested-batch-review-20261015 · 2026-10-15

Inspect the recorded source material

SHA-256: 9dff40220b630f3cec55ded8fd8889ef28774c057b03c7432119fec21ba6e922

2026-10-14T03:35:22.115Z

Source file / repository
# nextjs-mui-blog-starter

![Next.js](https://img.shields.io/badge/Next.js-15-black?logo=nextdotjs)
![Material UI](https://img.shields.io/badge/MUI-7-blueviolet?logo=mui)
![React](https://img.shields.io/badge/react-19-blue?logo=react)
![License: MIT](https://img.shields.io/badge/license-MIT-green)
![SEO Optimized](https://img.shields.io/badge/SEO-Optimized-success)
![Lighthouse Score: 90](https://img.shields.io/badge/Lighthouse-Performance%3A%2090-brightgreen)

A fast, modern, and SEO-friendly blog and portfolio template built with **Next.js 14**, **Material UI (MUI 6)**, and **MDX**. Ideal for developers who want to launch a customizable blog or technical portfolio site with built-in support for dark mode, code highlighting, design tokens, and accessibility.

🔗 Live Demo - [nextjs-mui-blog.muhimasri.com](https://nextjs-mui-blog.muhimasri.com/)

<p align="center">
  <img src="./public/images/demo-1.png" width="45%" style="margin: 10px;" />
  <img src="./public/images/demo-5.png" width="45%" style="margin: 10px;" />
  <br />
  <img src="./public/images/demo-2.png" width="45%" style="margin: 10px;" />
  <img src="./public/images/demo-3.png" width="45%" style="margin: 10px;" />
</p>

---

## 📚 Table of Contents

- [Features](#-features)
- [Why Use This Template?](#-why-use-this-template)
- [Technologies and Tools](#-technologies-and-tools)
- [Running the Project](#-running-the-project)
- [Roadmap](#-roadmap)
- [Developer Guide](#-developer-guide)

---

## 🚀 Features

- Home & About Pages
- MDX Blog System with Frontmatter
- Dynamic Routing
- Tag Filtering
- Featured Images & Suggested Articles
- Table of Contents (TOC)
- Code Highlighting with Shiki (via rehype-pretty-code)
- Dark/Light Mode (MUI v6 Theme Tokens)
- SEO Metadata with Open Graph
- Accessibility Features
- Fully Responsive and Mobile Friendly
- 85-95% Lighthouse Scores
- Developer-Friendly Architecture

---

## 💡 Why Use This Template?

- ✅ Built with the latest Next.js App Router (14+)
- 🧩 Write MDX content with embedded React components
- 🎨 Custom theming and design tokens using Material UI
- 🧱 Responsive layout and component-based structure
- 🧠 Automatically generated Table of Contents
- 🌐 SEO-friendly with dynamic meta & Open Graph tags
- 🔒 Accessibility and performance best practices

---

## 🛠 Technologies and Tools

- **Next.js 14** – App Router architecture
- **Material UI v6** – Responsive components and design system
- **MDX** – Write JSX inside Markdown files
- **rehype-pretty-code** – Syntax highlighting with Shiki
- **TypeScript** – Safer, more maintainable code
- **ESLint + Prettier** – Code quality and formatting

---

## 🧪 Running the Project

```bash
# Clone the repository
$ git clone <repository-url>
$ cd nextjs-mui-blog-starter

# Install dependencies
$ npm install

# Run the development server
$ npm run dev

# Build for production
$ npm run build

# Start the production server
$ npm start

# Lint and format
$ npm run lint
$ npm run format
```

---

## 🗺 Roadmap

- [ ] Accessibility Improvements
- [ ] RSS Feed
- [ ] Sitemap.xml
- [ ] GitHub-based Commenting System
- [ ] Social Sharing Buttons
- [ ] PWA Support
- [ ] Newsletter Integration
- [ ] Custom sytax highlighting theme with light and dark mode support

---

## 📁 Developer Guide

This guide provides a full breakdown of the directory structure, blog system, styling tokens, and theming implementation for MUI.

### Project Structure Overview

```
content/           # MDX blog post folders
public/            # Static assets like images
src/               # Application source code
├── app/           # Pages and routes (App Router)
├── components/    # Shared UI components
├── styles/        # Global styles and MUI theme setup
```

### Blog Content Directory (content/)

- Each blog post lives in its own folder with a `page.mdx` file.
- Use frontmatter for metadata like title, description, date, tags, and images.

```
content/
  react-hooks-guide/
    page.mdx
  styled-components-vs-mui/
    page.mdx
```

### Public Directory (public/)

- Store images and assets accessible via `/images/...`

```
public/
  images/
    react-hooks-cover.jpg
    styled-vs-mui-cover.jpg
```

### App Directory (src/app/)

- `about/` – About page and its layout
- `blogs/` – Blog listing, tag filtering, and dynamic `[slug]/` post rendering

### Component Directory (src/components/)

- `Header.tsx`, `Footer/`, `Tag.tsx`, `PostCard.tsx`, `TableOfContents.tsx`

### Styling System (src/styles/)

- `tokens.ts` – Centralized design tokens: spacing, colors, radii, typography
- `theme.ts` – MUI theme that uses tokens for light/dark mode
- `global.tsx` – Global reset styles and scrollbar customization

### MDX Setup

- MDX files are compiled using `next-mdx-remote` with `rehype-pretty-code` and `gray-matter`
- Supports frontmatter metadata and React components inside content

---

### Creating a Blog Post

1. Create a new folder under `content/your-blog-title/`
2. Add `page.mdx` with the frontmatter and Markdown content.
3. Reference images using `/images/your-image.jpg` from `public/images/`
4. Headings like `##` will automatically populate the Table of Contents.
5. Run the dev server and preview at `/blogs/[slug]`

---

### Styling with Tokens and Theme

- Theme is created from `tokens.ts` with design primitives tokenized to support quick and centralized custom theming:

  - `colors`
  - `font`
  - `spacing`
  - `shadows`
  - `borderRadius`
  - `letterSpacing`
  - `lineHeight`

- Tokens are used in `theme.ts` as values for the theme palette, supporting light/dark mode via MUI’s color scheme.

```tsx
const theme = createTheme({
  cssVariables: {
    colorSchemeSelector: "class",
  },
  colorSchemes: {
    light: {
      palette: {
        primary: {
          main: colors.primary[500],
          ...
        },
        secondary: {
          main: colors.secondary[500],
          ...
        },
        common: {
          onBackground: colors.grey[900],
          ...
        },
        text: {
          primary: colors.grey[800],
          ...
        },
      },
    },
    dark: {
      palette: {
        primary: {
          main: colors.primary[600],
          ...
        },
        secondary: {
          main: colors.secondary[900],
          ...
        },
        text: {
          primary: colors.grey[100],
          ...
        },
      },
    },
  },
});
```

- Theme palettes are also extended to define custom variables for specific sections like blog, about, and subscribe pages:

```ts
blog: {
  headerBgColor: "white",
  h1Color: colors.secondary[500],
},
subscribe: {
  headerColor: colors.grey[800],
},
about: {
  headerTitle: colors.grey[800],
}
```

- MUI 6 converts all theme values into CSS variables automatically. This enables use of tokens in external stylesheets or with Tailwind:

```ts
about: {
  headerTitle: colors.grey[800], // var(--mui-palette-about-headerTitle)
  headerText: colors.grey[700],  // var(--mui-palette-about-headerText)
}
```

- Components are styled using the sx prop or direct props, supporting shorthand token references for consistency and dark mode support:

```tsx
<Typography color="primary.500">
  Mareli Ramos
</Typography>
<Typography
  sx={{
    fontSize: "6",
    color: "text.primary",
  }}
>
  Mareli Ramos
</Typography>
```

- Responsive styles are defined using MUI’s sx breakpoints:

```tsx
<Box
  sx={{
    display: { xs: "block", md: "flex" },
    fontSize: { xs: "3", lg: "4" },
    padding: { xs: 2, md: 4 },
  }}
>
  Responsive Box
</Box>
```

---

## 📣 Contributing

Contributions and suggestions are welcome! Feel free to fork the repo and submit a pull request.

---

> Made with ❤️ by [Muhi Masri](https://muhimasri.com/)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.