Skip to main content
Docusaurus

Search documentation

Type to search this documentation.

On this pageOverview

Autogenerated

mdx-code-block
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

Docusaurus can create a sidebar automatically from your filesystem structure: each folder creates a sidebar category, and each file creates a doc link.

TypeScript
type SidebarItemAutogenerated = {
  type: 'autogenerated';
  dirName: string; // Source folder to generate the sidebar slice from (relative to docs)
};

Docusaurus can generate a full sidebar from your docs folder:

sidebars.js
export default {  myAutogeneratedSidebar: [    {      type: 'autogenerated',      dirName: '.', // '.' means the current docs folder    },  ],};

An autogenerated item is converted by Docusaurus to a sidebar slice (also discussed in category shorthands): a list of items of type doc or category, so you can splice multiple autogenerated items from multiple directories, interleaving them with regular sidebar items, in one sidebar level.

A real-world example

Consider this file structure:

Bash
docs
β”œβ”€β”€ api
β”‚   β”œβ”€β”€ product1-api
β”‚   β”‚   └── api.md
β”‚   └── product2-api
β”‚       β”œβ”€β”€ basic-api.md
β”‚       └── pro-api.md
β”œβ”€β”€ intro.md
└── tutorials
    β”œβ”€β”€ advanced
    β”‚   β”œβ”€β”€ advanced1.md
    β”‚   β”œβ”€β”€ advanced2.md
    β”‚   └── read-more
    β”‚       β”œβ”€β”€ resource1.md
    β”‚       └── resource2.md
    β”œβ”€β”€ easy
    β”‚   β”œβ”€β”€ easy1.md
    β”‚   └── easy2.md
    β”œβ”€β”€ tutorial-end.md
    β”œβ”€β”€ tutorial-intro.md
    └── tutorial-medium.md

And assume every doc's ID is just its file name. If you define an autogenerated sidebar like this:

sidebars.js
export default {  mySidebar: [    'intro',    {      type: 'category',      label: 'Tutorials',      items: [        'tutorial-intro',        {          type: 'autogenerated',          dirName: 'tutorials/easy', // Generate sidebar slice from docs/tutorials/easy        },        'tutorial-medium',        {          type: 'autogenerated',          dirName: 'tutorials/advanced', // Generate sidebar slice from docs/tutorials/advanced        },        'tutorial-end',      ],    },    {      type: 'autogenerated',      dirName: 'api', // Generate sidebar slice from docs/api    },    {      type: 'category',      label: 'Community',      items: ['team', 'chat'],    },  ],};

It would be resolved as:

sidebars.js
export default {  mySidebar: [    'intro',    {      type: 'category',      label: 'Tutorials',      items: [        'tutorial-intro',        // Two files in docs/tutorials/easy        'easy1',        'easy2',        'tutorial-medium',        // Two files and a folder in docs/tutorials/advanced        'advanced1',        'advanced2',        {          type: 'category',          label: 'read-more',          items: ['resource1', 'resource2'],        },        'tutorial-end',      ],    },    // Two folders in docs/api    {      type: 'category',      label: 'product1-api',      items: ['api'],    },    {      type: 'category',      label: 'product2-api',      items: ['basic-api', 'pro-api'],    },    {      type: 'category',      label: 'Community',      items: ['team', 'chat'],    },  ],};

Note how the autogenerate source directories themselves don't become categories: only the items they contain do. This is what we mean by "sidebar slice".

Docusaurus can automatically link a category to its index document.

A category index document is a document following one of those filename conventions:

  • Named as index (case-insensitive): docs/Guides/index.md
  • Named as README (case-insensitive): docs/Guides/README.mdx
  • Same name as parent folder: docs/Guides/Guides.md

This is equivalent to using a category with a doc link:

sidebars.js
export default {  docs: [    {      type: 'category',      label: 'Guides',      link: {type: 'doc', id: 'Guides/index'},      items: [],    },  ],};
Customizing category index matching

It is possible to opt out any of the category index conventions, or define even more conventions. You can inject your own isCategoryIndex matcher through the sidebarItemsGenerator callback. For example, you can also pick intro as another file name eligible for automatically becoming the category index.

docusaurus.config.js
export default {  plugins: [    [      '@docusaurus/plugin-content-docs',      {        async sidebarItemsGenerator({          ...args,          isCategoryIndex: defaultCategoryIndexMatcher, // The default matcher implementation, given below          defaultSidebarItemsGenerator,        }) {          return defaultSidebarItemsGenerator({            ...args,            isCategoryIndex(doc) {              return (                // Also pick intro.md in addition to the default ones                doc.fileName.toLowerCase() === 'intro' ||                defaultCategoryIndexMatcher(doc)              );            },          });        },      },    ],  ],};

Or choose to not have any category index convention.

docusaurus.config.js
export default {  plugins: [    [      '@docusaurus/plugin-content-docs',      {        async sidebarItemsGenerator({          ...args,          isCategoryIndex: defaultCategoryIndexMatcher, // The default matcher implementation, given below          defaultSidebarItemsGenerator,        }) {          return defaultSidebarItemsGenerator({            ...args,            isCategoryIndex() {              // No doc will be automatically picked as category index              return false;            },          });        },      },    ],  ],};

The isCategoryIndex matcher will be provided with three fields:

  • fileName, the file's name without extension and with casing preserved
  • directories, the list of directory names from the lowest level to the highest level, relative to the docs root directory
  • extension, the file's extension, with a leading dot.

For example, for a doc file at guides/sidebar/autogenerated.md, the props the matcher receives are

JavaScript
const props = {
  fileName: 'autogenerated',
  directories: ['sidebar', 'guides'],
  extension: '.md',
};

The default implementation is:

JavaScript
function isCategoryIndex({fileName, directories}) {
  const eligibleDocIndexNames = [
    'index',
    'readme',
    directories[0].toLowerCase(),
  ];
  return eligibleDocIndexNames.includes(fileName.toLowerCase());
}

For handwritten sidebar definitions, you would provide metadata to sidebar items through sidebars.js; for autogenerated, Docusaurus would read them from the item's respective file. In addition, you may want to adjust the relative position of each item because, by default, items within a sidebar slice will be generated in alphabetical order (using file and folder names).

The label, className, key, and customProps attributes are declared in front matter as sidebar_label, sidebar_class_name, sidebar_key and sidebar_custom_props, respectively. Position can be specified in the same way, via sidebar_position front matter.

docs/tutorials/tutorial-easy.md
---sidebar_position: 2sidebar_label: Easysidebar_class_name: greensidebar_key: unique-sidebar-item-key---# Easy TutorialThis is the easy tutorial!

Add a _category_.json or _category_.yml file in the respective folder. You can specify any category metadata and also the position metadata. label, className, key, position, and customProps will default to the respective values of the category's linked doc, if there is one.

JSON
{
  "position": 2.5,
  "label": "Tutorial",
  "key": "unique-sidebar-item-key",
  "collapsible": true,
  "collapsed": false,
  "className": "red",
  "link": {
    "type": "generated-index",
    "title": "Tutorial overview"
  },
  "customProps": {
    "description": "This description can be used in the swizzled DocCard"
  }
}
YAML
position: 2.5 # float position is supported
label: 'Tutorial'
collapsible: true # make the category collapsible
collapsed: false # keep the category open by default
className: red
link:
  type: generated-index
  title: Tutorial overview
customProps:
  description: This description can be used in the swizzled DocCard

A simple way to order an autogenerated sidebar is to prefix docs and folders by number prefixes, which also makes them appear in the file system in the same order when sorted by file name:

Bash
docs
β”œβ”€β”€ 01-Intro.md
β”œβ”€β”€ 02-Tutorial Easy
β”‚   β”œβ”€β”€ 01-First Part.md
β”‚   β”œβ”€β”€ 02-Second Part.md
β”‚   └── 03-End.md
β”œβ”€β”€ 03-Tutorial Advanced
β”‚   β”œβ”€β”€ 01-First Part.md
β”‚   β”œβ”€β”€ 02-Second Part.md
β”‚   β”œβ”€β”€ 03-Third Part.md
β”‚   └── 04-End.md
└── 04-End.md

To make it easier to adopt, Docusaurus supports multiple number prefix patterns.

By default, Docusaurus will remove the number prefix from the doc id, title, label, and URL paths.

You can provide a custom sidebarItemsGenerator function in the docs plugin (or preset) config:

docusaurus.config.js
export default {  plugins: [    [      '@docusaurus/plugin-content-docs',      {        async sidebarItemsGenerator({          defaultSidebarItemsGenerator,          numberPrefixParser,          item,          version,          docs,          categoriesMetadata,          isCategoryIndex,        }) {          // Example: return an hardcoded list of static sidebar items          return [            {type: 'doc', id: 'doc1'},            {type: 'doc', id: 'doc2'},          ];        },      },    ],  ],};
Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu