diff --git a/docs/usage/modules/datasource/.pages b/docs/usage/modules/datasource/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..3b82b40c562ba37e42f892a8956e665f0581a634
--- /dev/null
+++ b/docs/usage/modules/datasource/.pages
@@ -0,0 +1,7 @@
+title: Datasources
+nav:
+  - Introduction: index.md
+  - ...
+collapse_single_pages: true
+order: asc
+sort_type: natural
diff --git a/docs/usage/modules/datasource.md b/docs/usage/modules/datasource/index.md
similarity index 100%
rename from docs/usage/modules/datasource.md
rename to docs/usage/modules/datasource/index.md
diff --git a/tools/docs/datasources.ts b/tools/docs/datasources.ts
index 76191fc77871bafc8bc5502dbf644923e1cf35b3..9d069ff49f79ce23c31ca40a3a2054b6f8fe41a4 100644
--- a/tools/docs/datasources.ts
+++ b/tools/docs/datasources.ts
@@ -1,18 +1,18 @@
+import { codeBlock } from 'common-tags';
 import { getDatasources } from '../../lib/modules/datasource';
 import { readFile, updateFile } from '../utils';
 import {
   formatDescription,
   formatUrls,
   getDisplayName,
+  getModuleLink,
   replaceContent,
 } from './utils';
 
 export async function generateDatasources(dist: string): Promise<void> {
   const dsList = getDatasources();
-  let datasourceContent =
-    '\nSupported values for `datasource` are: ' +
-    [...dsList.keys()].map((v) => `\`${v}\``).join(', ') +
-    '.\n\n';
+  let datasourceContent = '\nSupported values for `datasource` are:\n\n';
+
   for (const [datasource, definition] of dsList) {
     const {
       id,
@@ -22,32 +22,44 @@ export async function generateDatasources(dist: string): Promise<void> {
       defaultVersioning,
     } = definition;
     const displayName = getDisplayName(datasource, definition);
-    datasourceContent += `\n### ${displayName} Datasource\n\n`;
-    datasourceContent += `**Identifier**: \`${id}\`\n\n`;
+    datasourceContent += `* ${getModuleLink(
+      datasource,
+      `\`${datasource}\``
+    )}\n`;
+    let md = codeBlock`
+      ---
+      title: ${displayName}
+      ---
+
+      # ${displayName} Datasource
+      `;
+    md += '\n\n';
+    md += `**Identifier**: \`${id}\`\n\n`;
     if (defaultVersioning) {
-      datasourceContent += `**Default versioning**: \`${defaultVersioning}\`\n\n`;
+      md += `**Default versioning**: \`${defaultVersioning}\`\n\n`;
     } else {
-      datasourceContent += `**Default versioning**: no default versioning\n\n`;
+      md += `**Default versioning**: no default versioning\n\n`;
     }
-    datasourceContent += formatUrls(urls);
-    datasourceContent += `**Custom registry support**: \n\n`;
+    md += formatUrls(urls);
+    md += `**Custom registry support**: \n\n`;
     if (customRegistrySupport) {
-      datasourceContent += `✅ Custom registries are supported.\n\n`;
+      md += `✅ Custom registries are supported.\n\n`;
     } else {
-      datasourceContent += `❌ No custom registry support.\n\n`;
+      md += `❌ No custom registry support.\n\n`;
     }
-    datasourceContent += await formatDescription('datasource', datasource);
+    md += await formatDescription('datasource', datasource);
 
     if (defaultConfig) {
-      datasourceContent +=
+      md +=
         '**Default configuration**:\n\n```json\n' +
         JSON.stringify(defaultConfig, undefined, 2) +
         '\n```\n';
     }
 
-    datasourceContent += `\n----\n\n`;
+    await updateFile(`${dist}/modules/datasource/${datasource}/index.md`, md);
   }
-  let indexContent = await readFile(`docs/usage/modules/datasource.md`);
+
+  let indexContent = await readFile(`docs/usage/modules/datasource/index.md`);
   indexContent = replaceContent(indexContent, datasourceContent);
-  await updateFile(`${dist}/modules/datasource.md`, indexContent);
+  await updateFile(`${dist}/modules/datasource/index.md`, indexContent);
 }
diff --git a/tools/docs/platforms.ts b/tools/docs/platforms.ts
index a185c5a14e5f2414e67b60ac257884532002d1fa..e6ac36e1d4d62f2a700ec162620498a4f551bf5d 100644
--- a/tools/docs/platforms.ts
+++ b/tools/docs/platforms.ts
@@ -1,10 +1,6 @@
 import { getPlatformList } from '../../lib/modules/platform';
 import { readFile, updateFile } from '../utils';
-import { replaceContent } from './utils';
-
-function getModuleLink(module: string, title: string): string {
-  return `[${title ?? module}](${module}/)`;
-}
+import { getModuleLink, replaceContent } from './utils';
 
 export async function generatePlatforms(dist: string): Promise<void> {
   let platformContent = 'Supported values for `platform` are: ';
diff --git a/tools/docs/utils.ts b/tools/docs/utils.ts
index b015d8c92954763d60cb2a26d9a6511f0122743d..56a6d06b1a6548f83c3a6bebe1f990ccd4edfc3e 100644
--- a/tools/docs/utils.ts
+++ b/tools/docs/utils.ts
@@ -67,3 +67,7 @@ export async function formatDescription(
   }
   return `**Description**:\n\n${content}\n`;
 }
+
+export function getModuleLink(module: string, title: string): string {
+  return `[${title ?? module}](${module}/)`;
+}