--- id: multi-instance title: Docs Multi-instance description: Use multiple docs plugin instances on a single Docusaurus site. slug: /docs-multi-instance --- The `@docusaurus/plugin-content-docs` plugin can support [multi-instance](../../using-plugins.md#multi-instance-plugins-and-plugin-ids). :::note This feature is only useful for [versioned documentations](./versioning.md). It is recommended to be familiar with docs versioning before reading this page. ::: ## Use-cases Sometimes you want a Docusaurus site to host 2 distinct sets of documentation (or more). These documentations may even have different versioning/release lifecycles. ### Mobile SDKs documentation If you build a cross-platform mobile SDK, you may have 2 documentations: - Android SDK documentation (`v1.0`, `v1.1`) - iOS SDK documentation (`v1.0`, `v2.0`) In such case, you can use a distinct docs plugin instance per mobile SDK documentation. :::caution If each documentation instance is very large, you should rather create 2 distinct Docusaurus sites. If someone edits the iOS documentation, is it really useful to rebuild everything, including the whole Android documentation that did not change? ::: ### Versioned and unversioned doc Sometimes, you want some documents to be versioned, while other documents are more "global", and it feels useless to version them. We use this pattern on the Docusaurus website itself: - The [/docs/\*](/docs) section is versioned - The [/community/\*](/community/support) section is unversioned ## Setup Let's consider we 2 documentations: - Product: some versioned doc about your product - Community: some unversioned doc about the community around your product You have to use twice the same plugin in your site configuration. :::caution `@docusaurus/preset-classic` already includes a docs plugin instance for you! ::: When using the preset: ```js title="docusaurus.config.js" module.exports = { presets: [ [ '@docusaurus/preset-classic', { docs: { // highlight-start // id: 'product', // omitted => default instance // highlight-end path: 'product', routeBasePath: 'product', sidebarPath: require.resolve('./sidebarsProduct.js'), // ... other options }, }, ], ], plugins: [ [ '@docusaurus/plugin-content-docs', { // highlight-start id: 'community', // highlight-end path: 'community', routeBasePath: 'community', sidebarPath: require.resolve('./sidebarsCommunity.js'), // ... other options }, ], ], }; ``` When not using the preset: ```js title="docusaurus.config.js" module.exports = { plugins: [ [ '@docusaurus/plugin-content-docs', { // highlight-start // id: 'product', // omitted => default instance // highlight-end path: 'product', routeBasePath: 'product', sidebarPath: require.resolve('./sidebarsProduct.js'), // ... other options }, ], [ '@docusaurus/plugin-content-docs', { // highlight-start id: 'community', // highlight-end path: 'community', routeBasePath: 'community', sidebarPath: require.resolve('./sidebarsCommunity.js'), // ... other options }, ], ], }; ``` Don't forget to assign a unique `id` attribute to plugin instances. :::note We consider that the `product` instance is the most important one, and make it the "default" instance by not assigning any id. ::: ## Versioned paths Each instance will store versioned docs in a distinct folder. The default plugin instance will use these paths: - `website/versions.json` - `website/versioned_docs` - `website/versioned_sidebars` The other plugin instances (with an `id` attribute) will use these paths: - `website/_versions.json` - `website/_versioned_docs` - `website/_versioned_sidebars` :::tip You can omit the `id` attribute (defaults to `default`) for one of the docs plugin instances. The instance paths will be simpler, and retro-compatible with a single-instance setup. ::: ## Tagging new versions Each plugin instance will have its own cli command to tag a new version. They will be displayed if you run: ```bash npm2yarn npm run docusaurus --help ``` To version the product/default docs plugin instance: ```bash npm2yarn npm run docusaurus docs:version 1.0.0 ``` To version the non-default/community docs plugin instance: ```bash npm2yarn npm run docusaurus docs:version:community 1.0.0 ``` ## Docs navbar items Each docs-related [theme navbar items](../../api/themes/theme-configuration.md#navbar) take an optional `docsPluginId` attribute. For example, if you want to have one version dropdown for each mobile SDK (iOS and Android), you could do: ```js title="docusaurus.config.js" module.exports = { themeConfig: { navbar: { items: [ { type: 'docsVersionDropdown', // highlight-start docsPluginId: 'ios', // highlight-end }, { type: 'docsVersionDropdown', // highlight-start docsPluginId: 'android', // highlight-end }, ], }, }, }; ```