---
title: Project Structure
icon: ph:tree-structure-bold
createTime: 2025/10/08 21:59:30
permalink: /en/guide/project-structure/
---

This guide provides a detailed explanation of the file structure for projects
created using VuePress and the Plume theme, helping you better organize and manage project files.

For projects created via the [command-line tool](./usage.md#command-line-installation), the typical file structure is as follows:

::: file-tree

- .git/
- **docs** \# Documentation source directory
  - .vuepress  \# VuePress configuration directory
    - public/ \# Static assets
    - client.ts \# Client configuration (optional)
    - collections.ts \# Collections configuration (optional)
    - config.ts \# VuePress main configuration
    - navbar.ts \# Navbar configuration (optional)
    - plume.config.ts \# Theme configuration file (optional)
  - demo \# `doc` type collection
    - foo.md
    - bar.md
  - blog \# `post` type collection
    - preview \# Blog category
      - markdown.md \# Category article
    - article.md \# Blog article
  - README.md \# Site homepage
  - …
- package.json
- pnpm-lock.yaml
- .gitignore
- README.md
:::

::: tip Manually created projects can also be organized using this structure as a reference
:::

## Documentation Source Directory

The **Documentation Source Directory** contains all the Markdown source files for your site.
This directory must be specified when starting VuePress via the command line:

```sh
# [!code word:docs]
vuepress dev docs
#            ↑ Documentation source directory
```

Corresponding package.json script configuration:

```json title="package.json"
{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}
```

VuePress only processes files within the documentation source directory; other directories are ignored.

## `.vuepress` Configuration Directory

`.vuepress/` is the core configuration directory for VuePress, where you can configure your project, create custom components, and styles.

### `client.ts` - Client Configuration

Used to extend VuePress client functionality, such as registering global components:

```ts title=".vuepress/client.ts"
import { defineClientConfig } from 'vuepress/client'

export default defineClientConfig({
  enhance({ app, router, siteData }) {
    // app: Vue application instance
    // router: Vue Router instance
    // siteData: Site metadata

    // Register global components
    app.component('MyComponent', MyComponent)
  },
  setup() {
    // setup method of the Vue root component
  }
})
```

### `config.ts` - Main Configuration File

The core configuration file for VuePress, used to set up the theme, plugins, and build tool:

```ts title=".vuepress/config.ts" twoslash
import { viteBundler } from '@vuepress/bundler-vite'
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'

export default defineUserConfig({
  lang: 'zh-CN',
  theme: plumeTheme({
    // Theme configuration...
  }),
  bundler: viteBundler(),
})
```

### `plume.config.ts` - Theme Configuration

A dedicated configuration file for the theme that supports hot-reload; service restart is not required after modifications:

::: code-tabs
@tab .vuepress/plume.config.ts

```ts twoslash
// @filename: ./navbar.ts
export default []

// @filename: ./collections.ts
export default []
// ---cut---
import { defineThemeConfig } from 'vuepress-theme-plume'
import collections from './collections'
import navbar from './navbar'

export default defineThemeConfig({
  logo: '/logo.svg',
  profile: {
    name: 'Theme Plume',
  },
  navbar,
  collections,
  // More configuration...
})
```

@tab .vuepress/navbar.ts

```ts twoslash
import { defineNavbarConfig } from 'vuepress-theme-plume'

export default defineNavbarConfig([
  // Navbar item configuration...
])
```

@tab .vuepress/collections.ts

```ts twoslash
import { defineCollections } from 'vuepress-theme-plume'

export default defineCollections([
  {
    type: 'post',
    dir: 'blog',
    title: 'Blog',
    link: '/blog/'
  },
  {
    type: 'doc',
    dir: 'demo',
    linkPrefix: '/demo/',
    title: 'Documentation Examples',
    sidebar: 'auto'
  },
])
```

:::
