A minimal, SEO-friendly Nuxt 3 blog theme focused on content, performance, accessibility, and developer experience. Perfect for personal blogs, documentation sites, and portfolios.
- π Performance First - Static site generation with optimal loading strategies
- π Markdown Content - Write posts in Markdown with frontmatter support
- π¨ Minimal Design - Clean, focused on readability with dark mode support
- π SEO Optimized - Built-in meta tags, sitemap, RSS feed, and structured data
- βΏ Accessible - WCAG compliant with semantic HTML and ARIA attributes
- π± Responsive - Mobile-first design that works on all devices
- π― TypeScript - Fully typed for better developer experience
- π οΈ Developer Friendly - Hot reload, auto-imports, and clear project structure
- Node.js 18+
- pnpm (recommended) or npm
- Click the "Use this template" button on GitHub
- Create a new repository from the template
- Clone your new repository:
git clone https://github.com/yourusername/my-blog.git cd my-blog
-
Clone or fork this repository
git clone https://github.com/yourusername/NuxtPapier.git my-blog cd my-blog
-
Install dependencies
pnpm install
-
Start development server
pnpm dev
Create a new .md
file in /content/posts/
:
---
title: My First Blog Post
description: This is my first post using NuxtPapier
date: 2025-01-26
published: true
tags:
- nuxt
- blogging
image: /images/my-post-cover.jpg
---
Your content here...
Field | Type | Required | Description |
---|---|---|---|
title |
string | β | Post title |
description |
string | β | SEO description |
date |
string | β | ISO date (YYYY-MM-DD) |
published |
boolean | β | Show/hide post (default: true) |
tags |
string[] | β | Post categories |
image |
string | β | Cover image URL |
Set published: false
to hide posts from production:
---
title: Work in Progress
published: false
---
Edit app.config.ts
to customize your site:
export default defineAppConfig({
name: 'My Blog',
description: 'Welcome to my personal blog',
url: 'https://myblog.com',
author: {
name: 'Your Name',
email: 'you@example.com',
twitter: '@yourhandle'
}
})
Update social links in constants.ts
:
export const SOCIAL_LINKS = {
github: 'https://github.com/yourusername',
twitter: 'https://twitter.com/yourhandle',
linkedin: 'https://linkedin.com/in/yourprofile'
}
Modify theme colors in uno.config.ts
:
theme: {
colors: {
primary: {
DEFAULT: '#3B82F6',
// Add more shades
}
}
}
NuxtPapier/
βββ components/ # Vue components
β βββ Base*.vue # Prefixed base components
βββ content/ # Markdown content
β βββ pages/ # Static pages
β βββ posts/ # Blog posts
βββ pages/ # Route pages
βββ server/ # Server routes
β βββ api/ # API endpoints
β βββ routes/ # RSS, sitemap, robots.txt
βββ composables/ # Vue composables
βββ types/ # TypeScript types
βββ app.config.ts # Site metadata
βββ nuxt.config.ts # Nuxt configuration
βββ uno.config.ts # UnoCSS configuration
# Development
pnpm dev # Start dev server (localhost:3000)
# Building
pnpm build # Build for production
pnpm generate # Generate static site
pnpm preview # Preview production build
# Code Quality
pnpm lint # Run ESLint with auto-fix
pnpm typecheck # TypeScript type checking
Add new components to /components/
with Base
prefix:
<!-- components/BaseCard.vue -->
<script setup lang="ts">
const { title, description } = defineProps<{
title: string
description?: string
}>()
</script>
<template>
<div class="base-card">
<h3>{{ title }}</h3>
<p v-if="description">{{ description }}</p>
</div>
</template>
Create files in /pages/
for new routes:
<!-- pages/about.vue -->
<template>
<div>
<BaseContainer>
<h1>About Me</h1>
<!-- Your content -->
</BaseContainer>
</div>
</template>
This template includes automatic GitHub Pages deployment:
-
Enable GitHub Pages
- Go to Settings β Pages
- Under "Build and deployment", select "GitHub Actions" as source
-
Push to main branch
- The site will automatically build and deploy
- Access at:
https://<username>.github.io/<repository>/
-
Custom domain (optional)
- Add a CNAME file with your domain
- Configure DNS settings
-
Generate static site
pnpm generate
-
Deploy
.output/public/
to:- Netlify
- Vercel
- Cloudflare Pages
- Any static host
For server-side features:
pnpm build
node .output/server/index.mjs
Create .env
for local development:
NUXT_PUBLIC_SITE_URL=http://localhost:3000
# For GitHub Pages deployment with custom path
NUXT_APP_BASE_URL=/repository-name/
Edit nuxt.config.ts
:
export default defineNuxtConfig({
googleFonts: {
families: {
Inter: [400, 500, 600, 700]
}
}
})
Install and configure analytics module:
pnpm add @nuxtjs/google-gtag
The theme uses a component prefix system. All base components start with Base
:
BaseContainer
- Content wrapperBaseHeader
- Site headerBaseFooter
- Site footerBaseProse
- Markdown content wrapper
- Nuxt 3 - Vue.js framework
- Nuxt Content - File-based CMS
- UnoCSS - Atomic CSS engine
- VueUse - Vue composition utilities
- TypeScript - Type safety
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
- Inspired by AstroPaper
- Built for the Nuxt community
- Designed for developers who write
Made with β€οΈ using Nuxt 3