Documentation Index Fetch the complete documentation index at: https://mintlify.com/vuejs/vitepress/llms.txt
Use this file to discover all available pages before exploring further.
Site Configuration
Site configuration is where you define global settings for your VitePress site. The config file is located at .vitepress/config.js (or .ts, .mjs, .mts) and controls everything from metadata to build options.
Basic Setup
Config File Location
VitePress looks for your configuration file at:
<root>/.vitepress/config.[ext]
Supported extensions: .js, .ts, .mjs, .mts
Using defineConfig
The defineConfig helper provides TypeScript-powered intellisense:
.vitepress/config.ts
.vitepress/config.js
import { defineConfig } from 'vitepress'
export default defineConfig ({
title: 'My Documentation' ,
description: 'A VitePress site' ,
base: '/'
})
TypeScript is supported out of the box - no additional configuration needed.
Dynamic Configuration
You can export an async function for dynamic configuration:
import { defineConfig } from 'vitepress'
export default async () => {
const data = await fetchSomeData ()
return defineConfig ({
title: data . title ,
description: data . description
})
}
Or use top-level await:
import { defineConfig } from 'vitepress'
const data = await fetchSomeData ()
export default defineConfig ({
title: data . title ,
description: data . description
})
title
title
string
default: "VitePress"
The title for your site. Displayed in the nav bar and used as the suffix for page titles.
export default defineConfig ({
title: 'My Awesome Docs'
})
With this configuration and a page containing # Hello, the page title becomes:
titleTemplate
Customize the page title suffix or format. Use :title as a placeholder for the page title.
export default defineConfig ({
title: 'My Docs' ,
titleTemplate: ':title - Custom Suffix'
})
Set to false to disable title suffixes:
export default defineConfig ({
titleTemplate: false
})
description
description
string
default: "A VitePress site"
Site description. Renders as a <meta> tag in the page HTML.
export default defineConfig ({
description: 'Comprehensive documentation for my project'
})
lang
The language attribute for the site. Renders as <html lang="...">.
export default defineConfig ({
lang: 'en-US'
})
head
Additional elements to render in the <head> tag.
type HeadConfig =
| [ string , Record < string , string >]
| [ string , Record < string , string >, string ]
Add a Favicon
export default defineConfig ({
head: [
[ 'link' , { rel: 'icon' , href: '/favicon.ico' }]
]
})
Add Google Fonts
export default defineConfig ({
head: [
[ 'link' , { rel: 'preconnect' , href: 'https://fonts.googleapis.com' }],
[ 'link' , {
rel: 'preconnect' ,
href: 'https://fonts.gstatic.com' ,
crossorigin: ''
}],
[ 'link' , {
href: 'https://fonts.googleapis.com/css2?family=Roboto&display=swap' ,
rel: 'stylesheet'
}]
]
})
Add Analytics
export default defineConfig ({
head: [
[ 'script' , {
async: '' ,
src: 'https://www.googletagmanager.com/gtag/js?id=TAG_ID'
}],
[ 'script' , {}, `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'TAG_ID');
` ]
]
})
Directory Structure
base
The base URL for deployment. Required when deploying to a subdirectory.
export default defineConfig ({
base: '/my-project/'
})
The base must start and end with a slash. It’s automatically prepended to all URLs that start with /.
srcDir
The directory where your markdown pages are stored, relative to project root.
export default defineConfig ({
srcDir: './src'
})
outDir
outDir
string
default: "./.vitepress/dist"
The build output location, relative to project root.
export default defineConfig ({
outDir: '../public'
})
assetsDir
Directory to nest generated assets under. Must be inside outDir.
export default defineConfig ({
assetsDir: 'static'
})
cacheDir
cacheDir
string
default: "./.vitepress/cache"
Directory for cache files, relative to project root.
export default defineConfig ({
cacheDir: './.vitepress/.vite'
})
srcExclude
Glob patterns for markdown files to exclude from source content.
export default defineConfig ({
srcExclude: [ '**/README.md' , '**/TODO.md' ]
})
Routing
cleanUrls
Remove trailing .html from URLs.
export default defineConfig ({
cleanUrls: true
})
Your server must be able to serve /foo.html when visiting /foo without a redirect.
rewrites
Define custom directory to URL mappings.
export default defineConfig ({
rewrites: {
'source/:page' : 'destination/:page' ,
'packages/:pkg/README.md' : ':pkg/index.md'
}
})
Theming
appearance
appearance
boolean | 'dark' | 'force-dark' | 'force-auto' | UseDarkOptions
default: "true"
Control dark mode behavior.
Auto (Default)
Dark by Default
Force Dark
Force Auto
Advanced
export default defineConfig ({
appearance: true // User can toggle, follows system preference
})
export default defineConfig ({
appearance: 'dark' // Dark by default, user can toggle
})
export default defineConfig ({
appearance: 'force-dark' // Always dark, no toggle
})
export default defineConfig ({
appearance: 'force-auto' // Follows system, no toggle
})
export default defineConfig ({
appearance: {
initialValue: 'dark' ,
// Additional VueUse UseDark options
}
})
scrollOffset
number | string | string[] | { selector: string | string[]; padding: number }
default: "134"
Configure scroll offset for sticky headers.
export default defineConfig ({
scrollOffset: 100 // pixels
})
// Or use a selector
export default defineConfig ({
scrollOffset: '.navbar'
})
// Or multiple selectors with fallback
export default defineConfig ({
scrollOffset: [ '.navbar' , '.header' ]
})
// Or with custom padding
export default defineConfig ({
scrollOffset: {
selector: '.navbar' ,
padding: 20
}
})
Build Options
ignoreDeadLinks
ignoreDeadLinks
boolean | 'localhostLinks' | (string | RegExp | Function)[]
default: "false"
Control how dead links are handled during build.
Ignore All
Ignore Localhost
Pattern Matching
export default defineConfig ({
ignoreDeadLinks: true
})
export default defineConfig ({
ignoreDeadLinks: 'localhostLinks'
})
export default defineConfig ({
ignoreDeadLinks: [
'/playground' ,
/ ^ https ? : \/\/ localhost/ ,
/ \/ repl \/ / ,
( url ) => url . toLowerCase (). includes ( 'ignore' )
]
})
lastUpdated
Get last updated timestamp for each page using Git.
export default defineConfig ({
lastUpdated: true
})
mpa (Experimental)
Build in MPA mode (Multi-Page Application). Ships 0kb JavaScript but disables client-side navigation.
export default defineConfig ({
mpa: true
})
Extract page metadata to separate JavaScript chunks for better caching.
export default defineConfig ({
metaChunk: true
})
buildConcurrency (Experimental)
Configure build concurrency. Lower values reduce memory usage but increase build time.
export default defineConfig ({
buildConcurrency: 32
})
Integrations
vite
Pass configuration to the internal Vite dev server/bundler.
export default defineConfig ({
vite: {
plugins: [ myVitePlugin ()],
server: {
port: 3000
},
build: {
chunkSizeWarningLimit: 1000
}
}
})
vue
Pass options to @vitejs/plugin-vue.
export default defineConfig ({
vue: {
template: {
compilerOptions: {
isCustomElement : ( tag ) => tag . startsWith ( 'custom-' )
}
}
}
})
markdown
Configure Markdown-it parser and Shiki syntax highlighting.
export default defineConfig ({
markdown: {
lineNumbers: true ,
theme: 'github-dark' ,
config : ( md ) => {
md . use ( myMarkdownPlugin )
}
}
})
Build Hooks
buildEnd
buildEnd
(siteConfig: SiteConfig) => Awaitable<void>
Hook called after build finishes but before CLI process exits.
export default defineConfig ({
async buildEnd ( siteConfig ) {
// Generate sitemap, search index, etc.
console . log ( 'Build completed!' )
}
})
postRender
postRender
(context: SSGContext) => Awaitable<SSGContext | void>
Hook called when SSG rendering is done. Handle teleports content.
export default defineConfig ({
async postRender ( context ) {
// Process teleported content
return context
}
})
transformHead
(context: TransformContext) => Awaitable<HeadConfig[]>
Transform head before generating each page. Return extra head entries to merge.
export default defineConfig ({
async transformHead ( context ) {
return [
[ 'meta' , { property: 'og:title' , content: context . title }],
[ 'meta' , { property: 'og:description' , content: context . description }]
]
}
})
transformHtml
(code: string, id: string, context: TransformContext) => Awaitable<string | void>
Transform HTML content before saving to disk.
export default defineConfig ({
async transformHtml ( code , id , context ) {
// Modify HTML content
return code . replace ( /foo/ g , 'bar' )
}
})
transformPageData
transformPageData
(pageData: PageData, context: TransformPageContext) => Awaitable<Partial<PageData>>
Transform page data for each page. Can directly mutate or return values to merge.
export default defineConfig ({
async transformPageData ( pageData ) {
pageData . contributors = await getContributors ( pageData . relativePath )
// Or return data to merge
return {
readingTime: calculateReadingTime ( pageData . content )
}
}
})
Advanced Features
Config Extension
Extend another configuration file.
import baseConfig from './base.config'
export default defineConfig ({
extends: baseConfig ,
title: 'Extended Config'
})
Sitemap Generation (Experimental)
sitemap
SitemapStreamOptions & { hostname: string }
Configure automatic sitemap generation.
export default defineConfig ({
sitemap: {
hostname: 'https://example.com' ,
transformItems : ( items ) => {
// Filter or modify sitemap items
return items . filter ( item => ! item . url . includes ( 'secret' ))
}
}
})
Content Props
Props to pass to the content component.
export default defineConfig ({
contentProps: {
customProp: 'value'
}
})
Router Configuration
router
{ prefetchLinks?: boolean }
Configure router behavior.
export default defineConfig ({
router: {
prefetchLinks: false // Disable link prefetching
}
})
TypeScript Configuration
Custom Theme Config Type
For custom themes, use defineConfig with a generic type:
import { defineConfig } from 'vitepress'
import type { ThemeConfig } from 'your-theme'
export default defineConfig < ThemeConfig >({
themeConfig: {
// Typed according to ThemeConfig
}
})
Environment-Specific Config
Access command and mode via function config:
import { defineConfig } from 'vitepress'
export default defineConfig ( async ({ command , mode }) => {
if ( command === 'serve' ) {
return {
// Dev-specific config
}
} else {
return {
// Build-specific config
}
}
} )
Next Steps
Theme Configuration Configure the default theme’s appearance and behavior
Custom Theme Create a completely custom theme
Extending Default Theme Customize the default theme with slots and overrides