diff --git a/docs/usage/.pages b/docs/usage/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..4d17ba72665d8302179729701b26101bd76f793c
--- /dev/null
+++ b/docs/usage/.pages
@@ -0,0 +1,51 @@
+nav:
+  - Home: 'index.md'
+  - ... | getting-started
+  - Troubleshooting: 'troubleshooting.md'
+  - Configuration:
+      - 'Self-hosted': 'self-hosted-configuration.md'
+      - 'Repository': 'configuration-options.md'
+      - 'Presets': 'config-presets.md'
+  - ... | key-concepts
+  - ... | modules
+  - Language Support:
+      - 'Bazel': 'bazel.md'
+      - 'Docker': 'docker.md'
+      - 'Golang': 'golang.md'
+      - 'Java': 'java.md'
+      - 'JavaScript': 'javascript.md'
+      - 'Node.js Versions': 'node.md'
+      - 'Nuget': 'nuget.md'
+      - 'PHP': 'php.md'
+      - 'Python': 'python.md'
+      - 'Ruby': 'ruby.md'
+  - Deep Dives:
+      - 'Should you Pin your Javascript Dependencies?': 'dependency-pinning.md'
+      - 'Config Template Editing': 'configuration-templates.md'
+      - 'Updating and Rebasing Branches': 'updating-rebasing.md'
+      - 'Semantic Commit Messages': 'semantic-commits.md'
+      - 'Noise Reduction': 'noise-reduction.md'
+  - Included Presets:
+      - 'Compatibility Presets': 'presets-compatibility.md'
+      - 'Default Presets': 'presets-default.md'
+      - 'Docker Presets': 'presets-docker.md'
+      - 'Full Config Presets': 'presets-config.md'
+      - 'Group Presets': 'presets-group.md'
+      - 'Helper Presets': 'presets-helpers.md'
+      - 'Monorepo Presets': 'presets-monorepo.md'
+      - 'npm Presets': 'presets-npm.md'
+      - 'Package Presets': 'presets-packages.md'
+      - 'Preview Presets': 'presets-preview.md'
+      - 'Regex Manager Presets': 'presets-regexManagers.md'
+      - 'Replacement Presets': 'presets-replacements.md'
+      - 'Schedule Presets': 'presets-schedule.md'
+      - 'Workaround Presets': 'presets-workarounds.md'
+  - All Other:
+      - ... | user-stories
+      - 'Security and Permissions': 'security-and-permissions.md'
+      - 'Merge Confidence': 'merge-confidence.md'
+      - 'Templates': 'templates.md'
+      - 'Frequently Asked Questions': 'faq.md'
+      - 'Known Limitations': 'known-limitations.md'
+      - 'Release notes for major versions': 'release-notes-for-major-versions.md'
+  - About Us: 'about-us.md'
diff --git a/docs/usage/getting-started/.pages b/docs/usage/getting-started/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..d2a1b5c2af94994a245d58ef5dfca5ff8aa98937
--- /dev/null
+++ b/docs/usage/getting-started/.pages
@@ -0,0 +1,7 @@
+title: Getting Started
+nav:
+  - 'Use Cases': 'use-cases.md'
+  - 'Running Renovate': 'running.md'
+  - 'Self-Hosting Examples': '/examples/self-hosting'
+  - 'Installing & Onboarding': 'installing-onboarding.md'
+  - 'Private Packages': 'private-packages.md'
diff --git a/docs/usage/key-concepts/.pages b/docs/usage/key-concepts/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..b6ede935c13f2f402c75e0775c0086acc19648af
--- /dev/null
+++ b/docs/usage/key-concepts/.pages
@@ -0,0 +1,6 @@
+nav:
+  - 'Presets': 'presets.md'
+  - 'Dependency Dashboard': 'dashboard.md'
+  - 'Pull Requests': 'pull-requests.md'
+  - 'Renovate Scheduling': 'scheduling.md'
+  - 'Automerge': 'automerge.md'
diff --git a/docs/usage/modules/.pages b/docs/usage/modules/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..74686a6979df56f940fcf98a52ac98661d456e51
--- /dev/null
+++ b/docs/usage/modules/.pages
@@ -0,0 +1,3 @@
+title: Renovate Modules
+order: asc
+sort_type: natural
diff --git a/docs/usage/modules/manager/.pages b/docs/usage/modules/manager/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..d94cfae7f8d184b8f3a9e654fd504324dd32f5cc
--- /dev/null
+++ b/docs/usage/modules/manager/.pages
@@ -0,0 +1,9 @@
+title: Managers
+nav:
+  - index.md
+# TODO: add all managers ?
+#  - Introduction: index.md
+#  - ...
+collapse_single_pages: true
+order: asc
+sort_type: natural
diff --git a/docs/usage/modules/manager.md b/docs/usage/modules/manager/index.md
similarity index 100%
rename from docs/usage/modules/manager.md
rename to docs/usage/modules/manager/index.md
diff --git a/docs/usage/modules/platform/.pages b/docs/usage/modules/platform/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..3b36f65fefe849adc3b19c848813275932dc4da2
--- /dev/null
+++ b/docs/usage/modules/platform/.pages
@@ -0,0 +1,7 @@
+title: Platforms
+nav:
+  - Introduction: index.md
+  - ...
+collapse_single_pages: true
+order: asc
+sort_type: natural
diff --git a/docs/usage/modules/platform.md b/docs/usage/modules/platform/index.md
similarity index 100%
rename from docs/usage/modules/platform.md
rename to docs/usage/modules/platform/index.md
diff --git a/docs/usage/user-stories/.pages b/docs/usage/user-stories/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..328263cc25e5fda4bc91d9b0ffa71f03caff3294
--- /dev/null
+++ b/docs/usage/user-stories/.pages
@@ -0,0 +1,4 @@
+title: User Stories
+nav:
+  - 'Swissquote': 'swissquote.md'
+
diff --git a/tools/docs/manager.ts b/tools/docs/manager.ts
index f8bd25c23261b00ed99fdf87985a6361e7658dd8..3884560f7ba9c24331beba040ff1b101d99dbc71 100644
--- a/tools/docs/manager.ts
+++ b/tools/docs/manager.ts
@@ -212,7 +212,7 @@ sidebar_label: ${displayName}
     languageText += allLanguages[language].map(getManagerLink).join(', ');
     languageText += '\n\n';
   }
-  let indexContent = await readFile(`docs/usage/modules/manager.md`);
+  let indexContent = await readFile(`docs/usage/modules/manager/index.md`);
   indexContent = replaceContent(indexContent, languageText);
-  await updateFile(`${dist}/modules/manager.md`, indexContent);
+  await updateFile(`${dist}/modules/manager/index.md`, indexContent);
 }
diff --git a/tools/docs/platforms.ts b/tools/docs/platforms.ts
index 728fd768ed7010417a77a1e3c602b6b4b1e7c22a..a185c5a14e5f2414e67b60ac257884532002d1fa 100644
--- a/tools/docs/platforms.ts
+++ b/tools/docs/platforms.ts
@@ -20,8 +20,8 @@ export async function generatePlatforms(dist: string): Promise<void> {
 
   platformContent += '.\n';
 
-  const indexFileName = `docs/usage/modules/platform.md`;
+  const indexFileName = `docs/usage/modules/platform/index.md`;
   let indexContent = await readFile(indexFileName);
   indexContent = replaceContent(indexContent, platformContent);
-  await updateFile(`${dist}/modules/platform.md`, indexContent);
+  await updateFile(`${dist}/modules/platform/index.md`, indexContent);
 }
diff --git a/tools/generate-docs.ts b/tools/generate-docs.ts
index 612f917d5aee125c271f16402376d36d6b5cb605..d4434bf67d293319a3c0a638abf880ba0410728d 100644
--- a/tools/generate-docs.ts
+++ b/tools/generate-docs.ts
@@ -31,7 +31,7 @@ process.on('unhandledRejection', (err) => {
     }
 
     logger.info('* static');
-    r = shell.cp('-r', 'docs/usage/*', `${dist}/`);
+    r = shell.cp('-r', 'docs/usage/.', `${dist}`);
     if (r.code) {
       return;
     }