diff --git a/docs/usage/modules/versioning/.pages b/docs/usage/modules/versioning/.pages
new file mode 100644
index 0000000000000000000000000000000000000000..4a59c0f2edb4ed3e2a557fcfe40cb5b232a9ee1f
--- /dev/null
+++ b/docs/usage/modules/versioning/.pages
@@ -0,0 +1,7 @@
+title: Versionings
+nav:
+  - Introduction: index.md
+  - ...
+collapse_single_pages: true
+order: asc
+sort_type: natural
diff --git a/docs/usage/modules/versioning.md b/docs/usage/modules/versioning/index.md
similarity index 100%
rename from docs/usage/modules/versioning.md
rename to docs/usage/modules/versioning/index.md
diff --git a/lib/modules/manager/batect/readme.md b/lib/modules/manager/batect/readme.md
index 6c16968630fe0951acef944d0be15552b04bba9e..93c1abad59706996f6d97b8bb50afe01ee34d64c 100644
--- a/lib/modules/manager/batect/readme.md
+++ b/lib/modules/manager/batect/readme.md
@@ -28,6 +28,6 @@ For example:
 
 ### Bundle versioning
 
-This manager assumes that any bundles referenced use tags for versioning, and that these tags use [SemVer](../../versioning.md#semantic-versioning).
+This manager assumes that any bundles referenced use tags for versioning, and that these tags use [SemVer](../../versioning/semver.md).
 The implementation of SemVer is strict - versions must follow the `X.Y.Z` or `vX.Y.Z` format.
 Versions that don't match this format (eg. `X.Y`) will be ignored.
diff --git a/lib/modules/manager/dockerfile/readme.md b/lib/modules/manager/dockerfile/readme.md
index 4a46c995490f5629253ec02c2ca84ea6036a866e..f2ed0e24bbf17463e6f5b4ae7dfee267ff14a7c4 100644
--- a/lib/modules/manager/dockerfile/readme.md
+++ b/lib/modules/manager/dockerfile/readme.md
@@ -19,4 +19,4 @@ For example, if you know that an image follows SemVer, you can tell Renovate to
 }
 ```
 
-Read [Renovate's Docker Versioning](../../versioning.md#docker-versioning) docs to learn more.
+Read [Renovate's Docker Versioning](../../versioning/docker.md) docs to learn more.
diff --git a/tools/docs/github-query-items.ts b/tools/docs/github-query-items.ts
index 5aeb4e282b3d21510a70233ea5483a0dd3a54dbe..60bb203e9c0b5f715621569d282351a964ec2957 100644
--- a/tools/docs/github-query-items.ts
+++ b/tools/docs/github-query-items.ts
@@ -36,6 +36,7 @@ export interface RenovateOpenItems {
   managers: OpenItems;
   platforms: OpenItems;
   datasources: OpenItems;
+  versionings: OpenItems;
 }
 
 export type OpenItems = Record<string, Items | undefined>;
@@ -63,6 +64,7 @@ export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
       managers: extractIssues(rawItems, 'manager:'),
       platforms: extractIssues(rawItems, 'platform:'),
       datasources: extractIssues(rawItems, 'datasource:'),
+      versionings: extractIssues(rawItems, 'versioning:'),
     };
 
     return renovateOpenItems;
@@ -71,7 +73,7 @@ export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
     if (process.env.CI) {
       throw err;
     }
-    return { managers: {}, platforms: {}, datasources: {} };
+    return { managers: {}, platforms: {}, datasources: {}, versionings: {} };
   }
 }
 
diff --git a/tools/docs/index.ts b/tools/docs/index.ts
index 577f0d6e9ec0c79163bb0b6397e52379c085e9db..737138b1082c2a38c542ebea3538405e2757a06d 100644
--- a/tools/docs/index.ts
+++ b/tools/docs/index.ts
@@ -32,7 +32,7 @@ export async function generateDocs(): Promise<void> {
 
     // versionings
     logger.info('* versionings');
-    await generateVersioning(dist);
+    await generateVersioning(dist, openItems.versionings);
 
     // datasources
     logger.info('* datasources');
diff --git a/tools/docs/versioning.ts b/tools/docs/versioning.ts
index 4eb85beb5bce0d50e567b6993f3b56ee248e32c9..eb379f357b0e3932d7f83cc0955b83f1eb8788f2 100644
--- a/tools/docs/versioning.ts
+++ b/tools/docs/versioning.ts
@@ -1,6 +1,16 @@
+import { codeBlock } from 'common-tags';
 import { getVersioningList } from '../../lib/modules/versioning';
 import { readFile, updateFile } from '../utils';
-import { formatDescription, formatUrls, replaceContent } from './utils';
+import {
+  type OpenItems,
+  generateFeatureAndBugMarkdown,
+} from './github-query-items';
+import {
+  formatDescription,
+  formatUrls,
+  getModuleLink,
+  replaceContent,
+} from './utils';
 
 type Versioning = {
   id: string;
@@ -10,35 +20,51 @@ type Versioning = {
   supportedRangeStrategies?: string[];
 };
 
-export async function generateVersioning(dist: string): Promise<void> {
+export async function generateVersioning(
+  dist: string,
+  versioningIssuesMap: OpenItems,
+): Promise<void> {
   const versioningList = getVersioningList();
-  let versioningContent =
-    '\nSupported values for `versioning` are: ' +
-    versioningList.map((v) => `\`${v}\``).join(', ') +
-    '.\n\n';
+  let versioningContent = '\nSupported values for `versioning` are:\n\n';
   for (const versioning of versioningList) {
     const definition = (await import(
       `../../lib/modules/versioning/${versioning}`
     )) as Versioning;
     const { id, displayName, urls, supportsRanges, supportedRangeStrategies } =
       definition;
-    versioningContent += `\n### ${displayName} Versioning\n\n`;
-    versioningContent += `**Identifier**: \`${id}\`\n\n`;
-    versioningContent += formatUrls(urls);
-    versioningContent += `**Ranges/Constraints:**\n\n`;
+    versioningContent += `* ${getModuleLink(
+      versioning,
+      `\`${versioning}\``,
+    )}\n`;
+    let md = codeBlock`
+    ---
+    title: ${displayName}
+    edit_url: https://github.com/renovatebot/renovate/edit/main/lib/modules/versioning/${versioning}/readme.md
+    ---
+
+    # ${displayName} Versioning
+    `;
+    md += '\n\n';
+    md += `**Identifier**: \`${id}\`\n\n`;
+    md += formatUrls(urls);
+    md += `**Ranges/Constraints:**\n\n`;
     if (supportsRanges) {
-      versioningContent += `✅ Ranges are supported.\n\nValid \`rangeStrategy\` values are: ${(
+      md += `✅ Ranges are supported.\n\nValid \`rangeStrategy\` values are: ${(
         supportedRangeStrategies ?? []
       )
         .map((strategy: string) => `\`${strategy}\``)
         .join(', ')}\n\n`;
     } else {
-      versioningContent += `❌ No range support.\n\n`;
+      md += `❌ No range support.\n\n`;
     }
-    versioningContent += await formatDescription('versioning', versioning);
-    versioningContent += `\n----\n\n`;
+    md += await formatDescription('versioning', versioning);
+    md += `\n----\n\n`;
+    md += generateFeatureAndBugMarkdown(versioningIssuesMap, versioning);
+
+    await updateFile(`${dist}/modules/versioning/${versioning}/index.md`, md);
   }
-  let indexContent = await readFile(`docs/usage/modules/versioning.md`);
+
+  let indexContent = await readFile(`docs/usage/modules/versioning/index.md`);
   indexContent = replaceContent(indexContent, versioningContent);
-  await updateFile(`${dist}/modules/versioning.md`, indexContent);
+  await updateFile(`${dist}/modules/versioning/index.md`, indexContent);
 }