---
title: '⚠️ 1.0.0-rc.165 Breaking Change Notice: Blog & Notes Features Migrated to "Collections"'
sticky: true
createTime: 2025/10/09 22:18:52
permalink: /en/blog/dk58a4t2/
tags:
  - Breaking Change
  - Important Update
---

:::important
‼️ This update is a BREAKING CHANGE! The blog and notes features have been entirely migrated to a new "Collections" architecture. ‼️
:::

<!-- more -->

## Design Motivation: Why Introduce "Collections"?

[Jump to Migration Guide 👇👇👇](#migration-guide){.read-more}

### Background & Problem Analysis

The theme initially only supported the **blog** feature, treating all Markdown files under the `docs`
source directory as blog posts. As the version iterated, we added the **notes/knowledge base** feature,
defaulting the `notes` directory as the root for notes and excluding its content from the blog list.

This phased implementation led to an **architectural imbalance**: the blog became a "first-class citizen,"
while the notes feature appeared marginalized. This caused the following issues for users:

- **Path Redundancy**: Note files had to be stored under the `notes/` directory, adding unnecessary directory levels.
- **Complex Links**: When `autoFrontmatter` was not enabled, URLs were forced to include the `/notes/` prefix.
- **Conceptual Confusion**: Users were often confused about the functional difference between "notes" and "docs."
- **Cumbersome Configuration**: Extra adjustments to the `notes.dir` configuration were needed to achieve a standard documentation site structure.

These design flaws were legacy issues from historical iterations, and we sincerely apologize for the inconvenience.

### Solution: Unified Content Abstraction

After researching mainstream static site generators (like Hugo, VitePress) and full-stack frameworks
(like Nuxt), we drew inspiration from the `collection` concept in `@nuxt/content`.

We decided to introduce **Collections** as a unified unit for content organization. Whether it's a blog,
notes, documentation, or a knowledge base, they are essentially specific collections of Markdown files, differing only in their presentation.

:::important
Core Insight: Use the "Collection" abstraction to unify the organization of various content types while preserving their respective display characteristics.
:::

Based on content characteristics, we defined two collection types:

- **`post` type**: Suitable for fragmented, loosely related content (e.g., blogs, columns), providing an article list as a navigation entry.
- **`doc` type**: Suitable for structured, strongly related content (e.g., documentation, manuals), providing a sidebar for quick navigation.

This design solves the historical architectural problems and lays the foundation for extending more content types in the future.

## Migration Guide

### Core Concepts

- **Collection**: Specified via `collection.dir`; all Markdown files under this directory belong to the collection.
- **Collection Type**:
  - `post`: Fragmented content, supports article list navigation.
  - `doc`: Structured content, supports sidebar navigation.

### Configuration Migration

Replace the original `blog` and `notes` configurations:

```ts twoslash
// @noErrors
import { defineUserConfig } from 'vuepress'
import { plumeTheme } from 'vuepress-theme-plume'

export default defineUserConfig({
  theme: plumeTheme({
    // [!code --:9]
    // Remove old blog and notes configuration
    blog: { /* Blog configuration */ },
    notes: {
      link: '/',
      dir: '/notes/',
      notes: [
        { dir: 'typescript', link: '/typescript/', sidebar: 'auto' }
      ]
    },
    // [!code ++:17]
    // Use collections configuration
    collections: [
      {
        type: 'post', // Replaces original blog functionality
        dir: 'blog', // Points to docs/blog directory
        title: 'Blog' // Collection display name
        // Original blog configuration continues here
        // ...
      },
      {
        type: 'doc', // Replaces original notes functionality
        dir: 'typescript', // Points to docs/typescript directory
        title: 'TypeScript Notes',
        linkPrefix: '/typescript/', // Page link prefix, sidebar judgment basis
        sidebar: 'auto', // Auto-generate sidebar
      },
    ]
  })
})
```

### Directory Structure Adjustment

Migrate files according to the following steps:

**Procedure:**

1. Move subdirectories under the `notes` directory directly to the `docs` root directory.
2. Create a `blog` directory and move original blog posts into it.
3. Remove the now-empty `notes` directory.

:::: flex

<div style="flex:1">

::: file-tree title="Pre-migration Structure"

- docs
  - -- notes
    - typescript
      - basic.md
      - advanced.md
  - blog-cate-1
    - post-1.md
  - blog-cate-2
    - post-2.md
  - blog-post.md
  - README.md
:::

</div>

<div style="align-self: center"><Icon name="mingcute:arrow-right-fill" /></div>

<div style="flex:1">

:::file-tree title="Post-migration Structure"

- docs
  - typescript
    - basic.md
    - advanced.md
  - ++ blog
    - blog-cate-1
      - post-1.md
    - blog-cate-2
      - post-2.md
    - blog-post.md
  - README.md

:::

</div>

::::

### Helper Functions

- `defineCollection`: Helper function for defining a single collection configuration.
- `defineCollections`: Helper function for defining multiple collection configurations.

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

export const blog = defineCollection({
  type: 'post',
  dir: 'blog',
  title: 'Blog'
})

export const typescript = defineCollection({
  type: 'doc',
  dir: 'typescript',
  title: 'TypeScript Notes',
  sidebar: 'auto'
})

export const collections = defineCollections([
  blog,
  typescript
])
```

## Detailed Documentation

[Collections Documentation](../../guide/quick-start/collection.md){.read-more}

[Post Collection](../../guide/quick-start/collection-post.md){.read-more}

[Doc Collection](../../guide/quick-start/collection-doc.md){.read-more}
