diff --git a/app/assets/javascripts/ci/catalog/components/list/catalog_header.vue b/app/assets/javascripts/ci/catalog/components/list/catalog_header.vue
index a1070973a40e9bedb9f32bc1513fbc9e4c92e0a1..017eb044d3a5e46ae6faeaa99acd88d55592d6f3 100644
--- a/app/assets/javascripts/ci/catalog/components/list/catalog_header.vue
+++ b/app/assets/javascripts/ci/catalog/components/list/catalog_header.vue
@@ -42,7 +42,7 @@ export default {
     },
     learnMore: __('Learn more'),
   },
-  learnMorePath: helpPagePath('ci/components/index'),
+  learnMorePath: helpPagePath('ci/components/_index'),
   ChatBubbleSvg,
 };
 </script>
diff --git a/app/assets/javascripts/ci/catalog/components/shared/ci_verification_badge.vue b/app/assets/javascripts/ci/catalog/components/shared/ci_verification_badge.vue
index 418e1e63c3f5a06175b0b797df447811ac1e2399..2be2e310aa90468872f617e10d448c4bc58229e6 100644
--- a/app/assets/javascripts/ci/catalog/components/shared/ci_verification_badge.vue
+++ b/app/assets/javascripts/ci/catalog/components/shared/ci_verification_badge.vue
@@ -13,7 +13,7 @@ export default {
     verifiedCreatorPopoverLink: s__('CiCatalog|What are verified component creators?'),
     verificationLevelPopoverLink: s__('CiCatalog|Learn more about designated creators'),
   },
-  verificationHelpPagePath: helpPagePath('ci/components/index', {
+  verificationHelpPagePath: helpPagePath('ci/components/_index', {
     anchor: 'verified-component-creators',
   }),
   verificationLevelOptions: VERIFICATION_LEVELS,
diff --git a/app/assets/javascripts/ci/catalog/constants.js b/app/assets/javascripts/ci/catalog/constants.js
index 94e4e037209ed8b6ca5dad7e6c3350b635003218..d60b1f4d4653de20038bfe7e635217c399952ef3 100644
--- a/app/assets/javascripts/ci/catalog/constants.js
+++ b/app/assets/javascripts/ci/catalog/constants.js
@@ -16,7 +16,7 @@ export const SORT_ASC = 'ASC';
 export const SORT_DESC = 'DESC';
 export const DEFAULT_SORT_VALUE = `${SORT_OPTION_POPULARITY}_${SORT_DESC}`;
 
-export const COMPONENTS_DOCS_URL = helpPagePath('ci/components/index');
+export const COMPONENTS_DOCS_URL = helpPagePath('ci/components/_index');
 
 export const VERIFICATION_LEVEL_GITLAB_MAINTAINED_BADGE_TEXT = s__('CiCatalog|GitLab-maintained');
 export const VERIFICATION_LEVEL_GITLAB_MAINTAINED_ICON = 'tanuki-verified';
diff --git a/app/assets/javascripts/ci/pipeline_details/manual_variables/empty_state.vue b/app/assets/javascripts/ci/pipeline_details/manual_variables/empty_state.vue
index 1ea007d5c2a33fef3689ca3884a5e0478bb44042..4678b40fb1a9a105ab1370648ae1ba6ec6f397fa 100644
--- a/app/assets/javascripts/ci/pipeline_details/manual_variables/empty_state.vue
+++ b/app/assets/javascripts/ci/pipeline_details/manual_variables/empty_state.vue
@@ -17,7 +17,7 @@ export default {
       'ManualVariables|When you %{helpPageUrlStart}run a pipeline manually%{helpPageUrlEnd}, you can specify additional CI/CD variables to use in that pipeline run.',
     ),
   },
-  runPipelineManuallyDocUrl: helpPagePath('ci/pipelines/index', {
+  runPipelineManuallyDocUrl: helpPagePath('ci/pipelines/_index', {
     anchor: 'run-a-pipeline-manually',
   }),
 };
diff --git a/app/assets/javascripts/environments/components/enable_review_app_modal.vue b/app/assets/javascripts/environments/components/enable_review_app_modal.vue
index 41aac5f6861935f99694caec9e70eb52757ebdf3..aab19cf919ee797d449f500370c51c5e2f9a93e2 100644
--- a/app/assets/javascripts/environments/components/enable_review_app_modal.vue
+++ b/app/assets/javascripts/environments/components/enable_review_app_modal.vue
@@ -53,10 +53,10 @@ export default {
     },
   },
   i18n,
-  configuringReviewAppsPath: helpPagePath('ci/review_apps/index.md', {
+  configuringReviewAppsPath: helpPagePath('ci/review_apps/_index.md', {
     anchor: 'configuring-review-apps',
   }),
-  reviewAppsExamplesPath: helpPagePath('ci/review_apps/index.md', {
+  reviewAppsExamplesPath: helpPagePath('ci/review_apps/_index.md', {
     anchor: 'review-apps-examples',
   }),
 };
diff --git a/app/assets/javascripts/google_cloud/databases/service_table.vue b/app/assets/javascripts/google_cloud/databases/service_table.vue
index c8981228212d7d1b5dd089465af004fb229fe003..28538cbb3b725b76275e3a363f07321608ea193a 100644
--- a/app/assets/javascripts/google_cloud/databases/service_table.vue
+++ b/app/assets/javascripts/google_cloud/databases/service_table.vue
@@ -48,7 +48,7 @@ const i18n = {
   ),
 };
 
-const helpUrlSecrets = helpPagePath('ci/secrets/index');
+const helpUrlSecrets = helpPagePath('ci/secrets/_index');
 
 export default {
   components: { GlAlert, GlButton, GlLink, GlSprintf, GlTable },
diff --git a/app/assets/javascripts/ide/components/pipelines/empty_state.vue b/app/assets/javascripts/ide/components/pipelines/empty_state.vue
index 7048246a97989d94b8ef0ea24356b554407663c9..321c9ce5fffedfb9e263f73727730dfead78c47c 100644
--- a/app/assets/javascripts/ide/components/pipelines/empty_state.vue
+++ b/app/assets/javascripts/ide/components/pipelines/empty_state.vue
@@ -12,7 +12,7 @@ export default {
   computed: {
     ...mapState(['pipelinesEmptyStateSvgPath']),
     ciHelpPagePath() {
-      return helpPagePath('ci/quick_start/index.md');
+      return helpPagePath('ci/quick_start/_index.md');
     },
   },
   i18n: {
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue
index 68dca99a7c37a2e69a49ef79ec4e40a86106f422..29bb8d1aa56511164d0f41e8f01f46ce24dd6ee0 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue
+++ b/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue
@@ -43,7 +43,7 @@ const i18n = {
   ),
 };
 
-const ciCatalogHelpPath = helpPagePath('ci/components/index', {
+const ciCatalogHelpPath = helpPagePath('ci/components/_index', {
   anchor: 'cicd-catalog',
 });
 
diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue
index c72f9ad3334fdc54661206bd5566a62b859057e2..31fab5f27c47672e374148739d55c84db496c3ef 100644
--- a/app/assets/javascripts/releases/components/app_index.vue
+++ b/app/assets/javascripts/releases/components/app_index.vue
@@ -23,7 +23,7 @@ export default {
   i18n,
   links: {
     alertInfoMessageLink: helpPagePath('ci/yaml/_index.html', { anchor: 'release' }),
-    alertInfoPublishLink: helpPagePath('ci/components/index', { anchor: 'publish-a-new-release' }),
+    alertInfoPublishLink: helpPagePath('ci/components/_index', { anchor: 'publish-a-new-release' }),
   },
   components: {
     CiCdCatalogWrapper,
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
index 11147411027ac7227e9c68a9bc24d99b48d5c3de..a1a51ce8c1ea0ea8f2278467b628450189d41856 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/nothing_to_merge.vue
@@ -16,7 +16,7 @@ export default {
       return STATUS_EMPTY;
     },
   },
-  ciHelpPage: helpPagePath('ci/quick_start/index.html'),
+  ciHelpPage: helpPagePath('ci/quick_start/_index.html'),
 };
 </script>
 
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index 7b872985faaf6846e869ac6edf9c943469c30cdc..c2992a9a09155cf6a882438ebcc31d4e6026e94e 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -16,8 +16,8 @@ def js_pipeline_editor_data(project)
       {
         "ci-catalog-path" => explore_catalog_index_path,
         "ci-config-path": project.ci_config_path_or_default,
-        "ci-examples-help-page-path" => help_page_path('ci/examples/index.md'),
-        "ci-help-page-path" => help_page_path('ci/index.md'),
+        "ci-examples-help-page-path" => help_page_path('ci/examples/_index.md'),
+        "ci-help-page-path" => help_page_path('ci/_index.md'),
         "ci-lint-path" => project_ci_lint_path(project),
         "ci-troubleshooting-path" => help_page_path('ci/debugging.md', anchor: 'job-configuration-issues'),
         "default-branch" => project.default_branch_or_main,
@@ -32,7 +32,7 @@ def js_pipeline_editor_data(project)
         "project-path" => project.path,
         "project-full-path" => project.full_path,
         "project-namespace" => project.namespace.full_path,
-        "simulate-pipeline-help-page-path" => help_page_path('ci/pipeline_editor/index.md', anchor: 'simulate-a-cicd-pipeline'),
+        "simulate-pipeline-help-page-path" => help_page_path('ci/pipeline_editor/_index.md', anchor: 'simulate-a-cicd-pipeline'),
         "total-branches" => total_branches,
         "uses-external-config" => uses_external_config?(project) ? 'true' : 'false',
         "validate-tab-illustration-path" => image_path('illustrations/empty-state/empty-devops-md.svg'),
diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb
index 7f8eea24535e7247c9e9a3551d76a03a57c53037..2c5cfd5feb45b08ebf8589217ea895738ceb6614 100644
--- a/app/helpers/ide_helper.rb
+++ b/app/helpers/ide_helper.rb
@@ -100,7 +100,7 @@ def legacy_ide_data(project:)
       'committed-state-svg-path' => image_path('illustrations/rocket-launch-md.svg'),
       'pipelines-empty-state-svg-path': image_path('illustrations/empty-state/empty-pipeline-md.svg'),
       'switch-editor-svg-path': image_path('illustrations/rocket-launch-md.svg'),
-      'ci-help-page-path' => help_page_path('ci/quick_start/index.md'),
+      'ci-help-page-path' => help_page_path('ci/quick_start/_index.md'),
       'web-ide-help-page-path' => help_page_path('user/project/web_ide/index.md'),
       'render-whitespace-in-code': current_user.render_whitespace_in_code.to_s,
       'default-branch' => project && project.default_branch,
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index bfc84e02636f7a0964564511ffe5a3284f8560ce..ad2a21cdb2f746cf23ceec75d0b56444ce2fd772 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -52,7 +52,7 @@ def cards
           description: 'created per active user',
           feature: 'ci_pipelines',
           blog: 'https://martinfowler.com/bliki/ContinuousDelivery.html',
-          docs: help_page_path('ci/index.md')
+          docs: help_page_path('ci/_index.md')
         ),
         Card.new(
           metric: metric,
diff --git a/app/presenters/projects/security/configuration_presenter.rb b/app/presenters/projects/security/configuration_presenter.rb
index d4aa5f98c2a4613888037422f055c757c9e323d5..bc217b1b2028df5e659de0d4dd7b3252d2aa15f7 100644
--- a/app/presenters/projects/security/configuration_presenter.rb
+++ b/app/presenters/projects/security/configuration_presenter.rb
@@ -74,7 +74,7 @@ def features
       end
 
       def latest_pipeline_path
-        return help_page_path('ci/pipelines/index.md') unless latest_default_branch_pipeline
+        return help_page_path('ci/pipelines/_index.md') unless latest_default_branch_pipeline
 
         project_pipeline_path(self, latest_default_branch_pipeline)
       end
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index a42fab335d9b5ddfc6c6747e370463dde7ccd56f..54cdef3ce0e2b604313947e47cc084155e2e0137 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -2,7 +2,7 @@
 - help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer'
 - help_link_prevent_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'prevent-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer'
 - help_link_prevent_outdated_allow_rollback = link_to sprite_icon('question-o'), help_page_path('ci/environments/deployment_safety.md', anchor: 'job-retries-for-rollback-deployments'), target: '_blank', rel: 'noopener noreferrer'
-- help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/index.md', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer'
+- help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/_index.md', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer'
 
 .row.gl-mt-3
   .col-lg-12
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 872921a04801f273b1822ffc2a341301e5fef053..c2a0eec07a11bd018a326d79d6a5e1985f9f4c2f 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -72,7 +72,7 @@
     expanded: expanded) do |c|
     - c.with_description do
       = _("Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions.")
-      = link_to _('Learn more.'), help_page_path('ci/triggers/index.md'), target: '_blank', rel: 'noopener noreferrer'
+      = link_to _('Learn more.'), help_page_path('ci/triggers/_index.md'), target: '_blank', rel: 'noopener noreferrer'
     - c.with_body do
       = render 'projects/triggers/index'
 
@@ -107,6 +107,6 @@
       expanded: expanded) do |c|
       - c.with_description do
         = _("Use secure files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates.")
-        = link_to _('Learn more'), help_page_path('ci/secure_files/index.md'), target: '_blank', rel: 'noopener noreferrer'
+        = link_to _('Learn more'), help_page_path('ci/secure_files/_index.md'), target: '_blank', rel: 'noopener noreferrer'
       - c.with_body do
         #js-ci-secure-files{ data: { project_id: @project.id, admin: can?(current_user, :admin_secure_files, @project).to_s, file_size_limit: Ci::SecureFile::FILE_SIZE_LIMIT.to_mb } }
diff --git a/app/views/protected_branches/shared/_index.html.haml b/app/views/protected_branches/shared/_index.html.haml
index b49f5d30155a9156afb2beda88bf1a1a529f18fd..63bf5b6335437eb8650b3231b4f4024262efa296 100644
--- a/app/views/protected_branches/shared/_index.html.haml
+++ b/app/views/protected_branches/shared/_index.html.haml
@@ -16,7 +16,7 @@
       dismissible: false) do |c|
       - c.with_body do
         =  s_("ProtectedBranch|Giving merge rights to a protected branch also gives elevated permissions for certain CI/CD features.")
-        = link_to s_("ProtectedBranch|What are the security implications?"), help_page_path('ci/pipelines/index.md', anchor: 'pipeline-security-on-protected-branches'), target: '_blank', rel: 'noopener noreferrer'
+        = link_to s_("ProtectedBranch|What are the security implications?"), help_page_path('ci/pipelines/_index.md', anchor: 'pipeline-security-on-protected-branches'), target: '_blank', rel: 'noopener noreferrer'
 
     = render ::Layouts::CrudComponent.new(s_("ProtectedBranch|Protected branches"),
       icon: 'branch',
diff --git a/doc/administration/backup_restore/troubleshooting_backup_gitlab.md b/doc/administration/backup_restore/troubleshooting_backup_gitlab.md
index 6eef95476c6cfd831e56ec535102e8b165c315da..7a7db17e34137fe4206c7fccbca42f83a746521c 100644
--- a/doc/administration/backup_restore/troubleshooting_backup_gitlab.md
+++ b/doc/administration/backup_restore/troubleshooting_backup_gitlab.md
@@ -20,7 +20,7 @@ decrypt those columns, preventing access to the following items:
 - [Kubernetes / GCP integration](../../user/infrastructure/clusters/index.md)
 - [Custom Pages domains](../../user/project/pages/custom_domains_ssl_tls_certification/index.md)
 - [Project error tracking](../../operations/error_tracking.md)
-- [Runner authentication](../../ci/runners/index.md)
+- [Runner authentication](../../ci/runners/_index.md)
 - [Project mirroring](../../user/project/repository/mirror/index.md)
 - [Integrations](../../user/project/integrations/index.md)
 - [Web hooks](../../user/project/integrations/webhooks.md)
diff --git a/doc/administration/dedicated/hosted_runners.md b/doc/administration/dedicated/hosted_runners.md
index c516f61c9420dc2418a9ce8ad1923fe2ea3dab7e..3a7f81b2a9e2c9da5a90931c0bcdb62d311d8756 100644
--- a/doc/administration/dedicated/hosted_runners.md
+++ b/doc/administration/dedicated/hosted_runners.md
@@ -14,7 +14,7 @@ DETAILS:
 NOTE:
 To use this feature, you must purchase a subscription for Hosted Runners for GitLab Dedicated. To participate in the limited availability of Hosted Runners for Dedicated, reach out to your Customer Success Manager or Account representative.
 
-You can run your CI/CD jobs on GitLab-hosted [runners](../../ci/runners/index.md). These runners are managed by GitLab and fully integrated with your GitLab Dedicated instance.
+You can run your CI/CD jobs on GitLab-hosted [runners](../../ci/runners/_index.md). These runners are managed by GitLab and fully integrated with your GitLab Dedicated instance.
 GitLab-hosted runners for Dedicated are autoscaling [instance runners](../../ci/runners/runners_scope.md#instance-runners),
 running on AWS EC2 in the same region as the GitLab Dedicated instance.
 
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index bec1e2ce701656a4a506237ff64cdb273126519c..6f889e6491ac15b2635468d7545a0502a9a6e769 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -203,7 +203,7 @@ successfully, you must replicate their data using some other means.
 | [External merge request diffs](../../merge_request_diffs.md)                                                          | **Yes** (13.5)                                                                | **Yes** (14.6)                                                                | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551)             | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | Replication is behind the feature flag `geo_merge_request_diff_replication`, enabled by default. Verification was behind the feature flag `geo_merge_request_diff_verification`, removed in 14.7. |
 | [Versioned snippets](../../../user/snippets.md#versioned-snippets)                                                    | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809)           | [**Yes** (14.2)](https://gitlab.com/groups/gitlab-org/-/epics/2810)           | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | Verification was implemented behind the feature flag `geo_snippet_repository_verification` in 13.11, and the feature flag was removed in 14.2. |
 | [GitLab Pages](../../pages/index.md)                                                                                  | [**Yes** (14.3)](https://gitlab.com/groups/gitlab-org/-/epics/589)            | **Yes** (14.6)                                                                | [**Yes** (15.1)](https://gitlab.com/groups/gitlab-org/-/epics/5551)             | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | Behind feature flag `geo_pages_deployment_replication`, enabled by default. Verification was behind the feature flag `geo_pages_deployment_verification`, removed in 14.7. |
-| [Project-level Secure files](../../../ci/secure_files/index.md)                                                       | **Yes** (15.3)                                                                | **Yes** (15.3)                                                                | **Yes** (15.3)                                                                  | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) |       |
+| [Project-level Secure files](../../../ci/secure_files/_index.md)                                                      | **Yes** (15.3)                                                                | **Yes** (15.3)                                                                | **Yes** (15.3)                                                                  | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) |       |
 | [Incident Metric Images](../../../operations/incident_management/incidents.md#metrics)                                | **Yes** (15.5)                                                                | **Yes** (15.5)                                                                | **Yes** (15.5)                                                                  | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | Replication/Verification is handled via the Uploads data type. |
 | [Alert Metric Images](../../../operations/incident_management/alerts.md#metrics-tab)                                  | **Yes** (15.5)                                                                | **Yes** (15.5)                                                                | **Yes** (15.5)                                                                  | [**Yes** (16.4)<sup>3</sup>](https://gitlab.com/groups/gitlab-org/-/epics/8056) | Replication/Verification is handled via the Uploads data type. |
 | [Server-side Git hooks](../../server_hooks.md)                                                                        | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/1867)              | No                                                                            | Not applicable                                                                  | Not applicable                                                                  | Not planned because of current implementation complexity, low customer interest, and availability of alternatives to hooks. |
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
index 56d004d68cac39214eeb3474c9010f44087f974e..7b90b942ed8d449ea010785d1d86428cc577dda9 100644
--- a/doc/administration/get_started.md
+++ b/doc/administration/get_started.md
@@ -60,7 +60,7 @@ Get started:
 You may need to import projects from external sources like GitHub, Bitbucket, or another instance of GitLab. Many external sources can be imported into GitLab.
 
 - Review the [GitLab projects documentation](../user/project/index.md).
-- Consider [repository mirroring](../user/project/repository/mirror/index.md)—an [alternative to project migrations](../ci/ci_cd_for_external_repos/index.md).
+- Consider [repository mirroring](../user/project/repository/mirror/index.md)—an [alternative to project migrations](../ci/ci_cd_for_external_repos/_index.md).
 - Check out our [migration index](../user/project/import/index.md) for documentation on common migration paths.
 - Schedule your project exports with our [import/export API](../api/project_import_export.md#schedule-an-export).
 
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 1b623941f4f74312fb5cb0bc4d7ead057742fb61..3d1487952bb9fd69f450663717513723c88070fe 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -952,7 +952,7 @@ prevent any more changes from rendering. For more information about these limits
 
 Reports that go over the 20 MB limit aren't loaded. Affected reports:
 
-- [Merge request security reports](../ci/testing/index.md#security-reports)
+- [Merge request security reports](../ci/testing/_index.md#security-reports)
 - [CI/CD parameter `artifacts:expose_as`](../ci/yaml/_index.md#artifactsexpose_as)
 - [Unit test reports](../ci/testing/unit_test_reports.md)
 
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 484bafbc05326af0d757af5cbdf60589c7840e8f..f40cc32cbd3a5fbd5b8b278d84e904701661aa6c 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -18,7 +18,7 @@ FLAG:
 On GitLab Self-Managed, by default this feature is not available. To make it available, an administrator can [enable the feature flag](../feature_flags.md) named `certificate_based_clusters`.
 
 - Read more about the non-deprecated [Web Terminals accessible through the Web IDE](../../user/project/web_ide/index.md).
-- Read more about the non-deprecated [Web Terminals accessible from a running CI job](../../ci/interactive_web_terminal/index.md).
+- Read more about the non-deprecated [Web Terminals accessible from a running CI job](../../ci/interactive_web_terminal/_index.md).
 
 ---
 
diff --git a/doc/administration/logs/_index.md b/doc/administration/logs/_index.md
index f619af8e684c6239a1da9f21007902b62881622f..4a42fe62b8d419b75e33c94327b4da0e2bf51a26 100644
--- a/doc/administration/logs/_index.md
+++ b/doc/administration/logs/_index.md
@@ -737,7 +737,7 @@ This file is located at:
 - `/var/log/gitlab/gitlab-rails/ci_resource_group_json.log` on Linux package installations.
 - `/home/git/gitlab/log/ci_resource_group_json.log` on self-compiled installations.
 
-It contains information about [resource group](../../ci/resource_groups/index.md) acquisition. For example:
+It contains information about [resource group](../../ci/resource_groups/_index.md) acquisition. For example:
 
 ```json
 {"severity":"INFO","time":"2023-02-10T23:02:06.095Z","correlation_id":"01GRYS10C2DZQ9J1G12ZVAD4YD","resource_group_id":1,"processable_id":288,"message":"attempted to assign resource to processable","success":true}
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 4b2af9a14c318b198460cdafdae200b873985a04..79f91841d9b7d2c24877e7971c86f5c10e7926f3 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -63,7 +63,7 @@ Before configuring Pages for wildcard domains, you must:
 1. Configure a **wildcard DNS record**.
 1. Optional. Have a **wildcard certificate** for that domain if you decide to
    serve Pages under HTTPS.
-1. Optional but recommended. Enable [instance runners](../../ci/runners/index.md)
+1. Optional but recommended. Enable [instance runners](../../ci/runners/_index.md)
    so that your users don't have to bring their own.
 1. For custom domains, have a **secondary IP**.
 
@@ -81,7 +81,7 @@ Before configuring Pages for single-domain sites, you must:
 
 1. Configure a **DNS record**.
 1. Optional. If you decide to serve Pages under HTTPS, have a **TLS certificate** for that domain.
-1. Optional but recommended. Enable [instance runners](../../ci/runners/index.md)
+1. Optional but recommended. Enable [instance runners](../../ci/runners/_index.md)
    so that your users don't have to bring their own.
 1. For custom domains, have a **secondary IP**.
 
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index 6d428c6d9255eb351fe3f922b2fb2759220eb8d9..546b65f1f434b122f3077170c60016946442d53c 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -59,7 +59,7 @@ Before proceeding with the Pages configuration, make sure that:
   Pages artifacts.
 - Optional. You have a **wildcard certificate** for the Pages domain if you
   decide to serve Pages (`*.example.io`) under HTTPS.
-- Optional but recommended. You have configured and enabled the [instance runners](../../ci/runners/index.md)
+- Optional but recommended. You have configured and enabled the [instance runners](../../ci/runners/_index.md)
   so your users don't have to bring their own.
 
 ### DNS configuration
diff --git a/doc/administration/postgresql/multiple_databases.md b/doc/administration/postgresql/multiple_databases.md
index 1d80c68e89a3984efd5765f1f301af1cd232054a..8afbbd51cd793062fcad687bc32f5e417a4c8fd2 100644
--- a/doc/administration/postgresql/multiple_databases.md
+++ b/doc/administration/postgresql/multiple_databases.md
@@ -22,7 +22,7 @@ To scale GitLab, you can configure GitLab to use multiple application databases.
 Due to [known issues](#known-issues), configuring GitLab with multiple databases is in limited [beta](../../policy/development_stages_support.md#beta).
 
 After you have set up multiple databases, GitLab uses a second application database for
-[CI/CD features](../../ci/index.md), referred to as the `ci` database. We do not exclude hosting both databases on a single PostgreSQL instance.
+[CI/CD features](../../ci/_index.md), referred to as the `ci` database. We do not exclude hosting both databases on a single PostgreSQL instance.
 
 All tables have exactly the same structure in both the `main`, and `ci`
 databases. Some examples:
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index 1d0ca92e83c669bbc761c19a7c1a7649140f3618..12bda58be88a8bb8bb85961d9ff23e17614a1e4e 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -29,7 +29,7 @@ GitLab administrators configure server hooks using the `gitaly` command, which a
 If you don't have access to the `gitaly` command, alternatives to server hooks include:
 
 - [Webhooks](../user/project/integrations/webhooks.md).
-- [GitLab CI/CD](../ci/index.md).
+- [GitLab CI/CD](../ci/_index.md).
 - [Push rules](../user/project/repository/push_rules.md), for a user-configurable Git hook interface.
 
 [Geo](geo/index.md) doesn't replicate server hooks to secondary nodes.
diff --git a/doc/administration/settings/continuous_integration.md b/doc/administration/settings/continuous_integration.md
index 906ab38c47846f67a444894bd90f3b381235f218..c7640977707b2d3a8b4c7f3d6055e6e9b9aefda3 100644
--- a/doc/administration/settings/continuous_integration.md
+++ b/doc/administration/settings/continuous_integration.md
@@ -396,7 +396,7 @@ This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/3894
 and was removed in 17.0. From 17.4, it is available only behind the feature flag `required_pipelines`, disabled by default.
 Use [compliance pipelines](../../user/group/compliance_pipelines.md) instead. This change is a breaking change.
 
-You can set a [CI/CD template](../../ci/examples/index.md#cicd-templates)
+You can set a [CI/CD template](../../ci/examples/_index.md#cicd-templates)
 as a required pipeline configuration for all projects on a GitLab instance. You can
 use a template from:
 
@@ -412,7 +412,7 @@ use a template from:
 The project CI/CD configuration merges into the required pipeline configuration when
 a pipeline runs. The merged configuration is the same as if the required pipeline configuration
 added the project configuration with the [`include` keyword](../../ci/yaml/_index.md#include).
-To view a project's full merged configuration, [View full configuration](../../ci/pipeline_editor/index.md#view-full-configuration)
+To view a project's full merged configuration, [View full configuration](../../ci/pipeline_editor/_index.md#view-full-configuration)
 in the pipeline editor.
 
 To select a CI/CD template for the required pipeline configuration:
diff --git a/doc/administration/settings/rate_limit_on_pipelines_creation.md b/doc/administration/settings/rate_limit_on_pipelines_creation.md
index 578c0698f594f9fc91e0d189b4bc4c6064dc90b1..30b4d804087d1824114ad7cb46d646dd8f1249fc 100644
--- a/doc/administration/settings/rate_limit_on_pipelines_creation.md
+++ b/doc/administration/settings/rate_limit_on_pipelines_creation.md
@@ -13,7 +13,7 @@ DETAILS:
 
 You can set a limit so that users and processes can't request more than a certain number of pipelines each minute. This limit can help save resources and improve stability.
 
-For example, if you set a limit of `10`, and `11` requests are sent to the [trigger API](../../ci/triggers/index.md) within one minute,
+For example, if you set a limit of `10`, and `11` requests are sent to the [trigger API](../../ci/triggers/_index.md) within one minute,
 the eleventh request is blocked. Access to the endpoint is allowed again after one minute.
 
 This limit is:
diff --git a/doc/administration/settings/usage_statistics.md b/doc/administration/settings/usage_statistics.md
index 149cecd4b8f277a1993aae5828ed419cf021d3ca..9aad00e479d25ebf269d12a0314d3e48755e9121 100644
--- a/doc/administration/settings/usage_statistics.md
+++ b/doc/administration/settings/usage_statistics.md
@@ -77,7 +77,7 @@ In the following table, you can see:
 | [Сross-project pipelines with artifacts dependencies](../../ci/yaml/_index.md#needsproject) | GitLab 16.7 and later |
 | [Feature flag related issues](../../operations/feature_flags.md#feature-flag-related-issues) | GitLab 16.7 and later |
 | [Merged results pipelines](../../ci/pipelines/merged_results_pipelines.md) | GitLab 16.7 and later |
-| [CI/CD for external repositories](../../ci/ci_cd_for_external_repos/index.md) | GitLab 16.7 and later |
+| [CI/CD for external repositories](../../ci/ci_cd_for_external_repos/_index.md) | GitLab 16.7 and later |
 | [CI/CD for GitHub](../../ci/ci_cd_for_external_repos/github_integration.md) | GitLab 16.7 and later |
 
 ### Enable registration features
diff --git a/doc/api/admin/token.md b/doc/api/admin/token.md
index b305a2abfe141a7e797f5ce3ce8368974b1e3e18..3ea12cb4f70682d339a3c27f2929d31a167e2800 100644
--- a/doc/api/admin/token.md
+++ b/doc/api/admin/token.md
@@ -44,7 +44,7 @@ Gets information for a given token. This endpoint supports the following tokens:
 - [OAuth application secrets](../../integration/oauth_provider.md)
 - [Cluster agent tokens](../../security/tokens/_index.md#gitlab-cluster-agent-tokens)
 - [Runner authentication tokens](../../security/tokens/_index.md#runner-authentication-tokens)
-- [Pipeline trigger tokens](../../ci/triggers/index.md#create-a-pipeline-trigger-token)
+- [Pipeline trigger tokens](../../ci/triggers/_index.md#create-a-pipeline-trigger-token)
 - [CI/CD Job Tokens](../../security/tokens/_index.md#cicd-job-tokens)
 - [Feature flags client tokens](../../operations/feature_flags.md#get-access-credentials)
 - [GitLab session cookies](../../user/profile/active_sessions.md)
diff --git a/doc/api/environments.md b/doc/api/environments.md
index 52a490ce9eb9b8711cfb108b1a033e4421e8e860..885789eab5c1f79fdf94c8467263def6b421a34a 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -312,7 +312,7 @@ curl --request DELETE \
 
 It schedules for deletion multiple environments that have already been
 [stopped](../ci/environments/_index.md#stopping-an-environment) and
-are [in the review app folder](../ci/review_apps/index.md).
+are [in the review app folder](../ci/review_apps/_index.md).
 The actual deletion is performed after 1 week from the time of execution.
 By default, it only deletes environments 30 days or older. You can change this default using the `before` parameter.
 
diff --git a/doc/api/google_cloud_integration.md b/doc/api/google_cloud_integration.md
index 0d34e29893cf8d92e876f2ab85ad2d1be551f59a..175218a6723995e59c505567c9ea757678438f03 100644
--- a/doc/api/google_cloud_integration.md
+++ b/doc/api/google_cloud_integration.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com
 **Status:** Experiment
 
-Use this API to interact with the Google Cloud integration. For more information, see [GitLab and Google Cloud integration](../ci/gitlab_google_cloud_integration/index.md).
+Use this API to interact with the Google Cloud integration. For more information, see [GitLab and Google Cloud integration](../ci/gitlab_google_cloud_integration/_index.md).
 
 ## Project-level Google Cloud integration scripts
 
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index 8f6eb3fdae071ebe9d3d6403b839918f26a5fec5..4b2c34e96a38077090a462b0b79b7270569c5908 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -483,7 +483,7 @@ Retrieve the job that generated a job token.
 GET /job
 ```
 
-Examples (must run as part of the [`script`](../ci/yaml/_index.md#script) section of a [CI/CD job](../ci/jobs/index.md)):
+Examples (must run as part of the [`script`](../ci/yaml/_index.md#script) section of a [CI/CD job](../ci/jobs/_index.md)):
 
 ```shell
 curl --header "Authorization: Bearer $CI_JOB_TOKEN" "${CI_API_V4_URL}/job"
diff --git a/doc/api/pipeline_triggers.md b/doc/api/pipeline_triggers.md
index 587fa6a626ab4aea570c477f6976280eb1adb5ac..22995e57d602300676661e0802bcd2adc52789fa 100644
--- a/doc/api/pipeline_triggers.md
+++ b/doc/api/pipeline_triggers.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-You can read more about [triggering pipelines through the API](../ci/triggers/index.md).
+You can read more about [triggering pipelines through the API](../ci/triggers/_index.md).
 
 ## List project trigger tokens
 
@@ -153,7 +153,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
 
 ## Trigger a pipeline with a token
 
-Trigger a pipeline by using a [pipeline trigger token](../ci/triggers/index.md#create-a-pipeline-trigger-token)
+Trigger a pipeline by using a [pipeline trigger token](../ci/triggers/_index.md#create-a-pipeline-trigger-token)
 or a [CI/CD job token](../ci/jobs/ci_job_token.md) for authentication.
 
 With a CI/CD job token, the [triggered pipeline is a multi-project pipeline](../ci/pipelines/downstream_pipelines.md#trigger-a-multi-project-pipeline-by-using-the-api).
diff --git a/doc/api/projects.md b/doc/api/projects.md
index a33ad024493fa623551909cffa0932e6c12d44fb..5accaaf0382a81520642e3a63334737b4c0aa3c9 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -1640,7 +1640,7 @@ Supported general project attributes:
 | `ci_forward_deployment_enabled`                    | boolean           | No       | Enable or disable [prevent outdated deployment jobs](../ci/pipelines/settings.md#prevent-outdated-deployment-jobs). |
 | `ci_forward_deployment_rollback_allowed`           | boolean           | No       | Enable or disable [allow job retries for rollback deployments](../ci/pipelines/settings.md#prevent-outdated-deployment-jobs). |
 | `ci_allow_fork_pipelines_to_run_in_parent_project` | boolean           | No       | Enable or disable [running pipelines in the parent project for merge requests from forks](../ci/pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project). _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/325189) in GitLab 15.3.)_ |
-| `ci_separated_caches`                              | boolean           | No       | Set whether or not caches should be [separated](../ci/caching/index.md#cache-key-names) by branch protection status. |
+| `ci_separated_caches`                              | boolean           | No       | Set whether or not caches should be [separated](../ci/caching/_index.md#cache-key-names) by branch protection status. |
 | `ci_restrict_pipeline_cancellation_role`           | string            | No       | Set the [role required to cancel a pipeline or job](../ci/pipelines/settings.md#restrict-roles-that-can-cancel-pipelines-or-jobs). One of `developer`, `maintainer`, or `no_one`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/429921) in GitLab 16.8. Premium and Ultimate only. |
 | `ci_pipeline_variables_minimum_override_role`      | string            | No       | When `restrict_user_defined_variables` is enabled, you can specify which role can override variables. One of `owner`, `maintainer`, `developer` or `no_one_allowed`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/440338) in GitLab 17.1. |
 | `ci_push_repository_for_job_token_allowed`         | boolean           | No       | Enable or disable the ability to push to the project repository using job token. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/389060) in GitLab 17.2. |
@@ -1701,7 +1701,7 @@ Supported general project attributes:
 | `warn_about_potentially_unwanted_characters`       | boolean           | No       | Enable warnings about usage of potentially unwanted characters in this project. |
 | `wiki_enabled`                                     | boolean           | No       | _(Deprecated)_ Enable wiki for this project. Use `wiki_access_level` instead. |
 
-For example, to toggle the setting for [instance runners on a GitLab.com project](../ci/runners/index.md):
+For example, to toggle the setting for [instance runners on a GitLab.com project](../ci/runners/_index.md):
 
 ```shell
 curl --request PUT --header "PRIVATE-TOKEN: <your-token>" \
diff --git a/doc/api/resource_groups.md b/doc/api/resource_groups.md
index e9c0c284b15c0519187d4d8e1e52185176d4d994..d53a1d59151f82849da728b61eef5ae4e91601a7 100644
--- a/doc/api/resource_groups.md
+++ b/doc/api/resource_groups.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-You can read more about [controlling the job concurrency with resource groups](../ci/resource_groups/index.md).
+You can read more about [controlling the job concurrency with resource groups](../ci/resource_groups/_index.md).
 
 ## Get all resource groups for a project
 
@@ -175,7 +175,7 @@ PUT /projects/:id/resource_groups/:key
 | --------------- | ------- | --------------------------------- | -------------------------------  |
 | `id`            | integer/string | yes                        | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths)            |
 | `key`           | string  | yes                               | The key of the resource group |
-| `process_mode`  | string  | no                                | The process mode of the resource group. One of `unordered`, `oldest_first` or `newest_first`. Read [process modes](../ci/resource_groups/index.md#process-modes) for more information. |
+| `process_mode`  | string  | no                                | The process mode of the resource group. One of `unordered`, `oldest_first` or `newest_first`. Read [process modes](../ci/resource_groups/_index.md#process-modes) for more information. |
 
 ```shell
 curl --request PUT --data "process_mode=oldest_first" \
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 1df8661dac38090ea9c05b37ff1f9124c61f2303..6c0bf93c2eadd6c05e22280691d8e86d8790c7ba 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -27,7 +27,7 @@ There are two tokens to take into account when connecting a runner with GitLab.
 
 | Token | Description |
 | ----- | ----------- |
-| Registration token | Token used to [register the runner](https://docs.gitlab.com/runner/register/). It can be [obtained through GitLab](../ci/runners/index.md). |
+| Registration token | Token used to [register the runner](https://docs.gitlab.com/runner/register/). It can be [obtained through GitLab](../ci/runners/_index.md). |
 | Authentication token | Token used to authenticate the runner with the GitLab instance. The token is obtained automatically when you [register a runner](https://docs.gitlab.com/runner/register/) or by the Runners API when you manually [register a runner](#create-a-runner) or [reset the authentication token](#reset-runners-authentication-token-by-using-the-runner-id). You can also obtain the token by using the [`POST /user/runners`](users.md#create-a-runner-linked-to-a-user) endpoint. |
 
 Here's an example of how the two tokens are used in runner registration:
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index c1ad8db02ffd62168d02317b2fbf82f55a0e5593..b37220ddfeaddebed8bf41eeda574a2aedab96dc 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -11,7 +11,7 @@ DETAILS:
 
 > - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/350748) in GitLab 15.7. Feature flag `ci_secure_files` removed.
 
-This feature is part of [Mobile DevOps](../ci/mobile_devops/index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
+This feature is part of [Mobile DevOps](../ci/mobile_devops/_index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
 The feature is still in development, but you can:
 
 - [Request a feature](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=feature_request).
diff --git a/doc/ci/index.md b/doc/ci/_index.md
similarity index 95%
rename from doc/ci/index.md
rename to doc/ci/_index.md
index 108c5af27f62c02abbf5b75d0cb7247d4393a4dd..7fd236866e834fef6fa41cd205da0a524214335e 100644
--- a/doc/ci/index.md
+++ b/doc/ci/_index.md
@@ -34,7 +34,7 @@ and the product documentation refers to it as the `.gitlab-ci.yml` file or the C
 
 For more information, see:
 
-- [Tutorial: Create your first `.gitlab-ci.yml` file](quick_start/index.md)
+- [Tutorial: Create your first `.gitlab-ci.yml` file](quick_start/_index.md)
 - [The CI/CD YAML syntax reference](yaml/_index.md), which lists all possible keywords
 - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Continuous Integration overview](https://www.youtube-nocookie.com/embed/eyr5YnkWq_I)
 - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Continuous Delivery overview](https://www.youtube-nocookie.com/embed/M7rBDZYsx8U)
@@ -74,9 +74,9 @@ In your pipeline, you can integrate with a wide range of tools and platforms.
 
 For more information, see:
 
-- [Pipeline editor](pipeline_editor/index.md), which you use to edit your configuration
-- [Visualize your pipeline](pipeline_editor/index.md#visualize-ci-configuration)
-- [Pipelines](pipelines/index.md)
+- [Pipeline editor](pipeline_editor/_index.md), which you use to edit your configuration
+- [Visualize your pipeline](pipeline_editor/_index.md#visualize-ci-configuration)
+- [Pipelines](pipelines/_index.md)
 
 ## Step 4: Use CI/CD variables as part of jobs
 
@@ -115,4 +115,4 @@ GitLab also has CI/CD component templates for common tasks and integrations.
 
 For more information, see:
 
-- [CI/CD components](components/index.md)
+- [CI/CD components](components/_index.md)
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/_index.md
similarity index 100%
rename from doc/ci/caching/index.md
rename to doc/ci/caching/_index.md
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/_index.md
similarity index 100%
rename from doc/ci/chatops/index.md
rename to doc/ci/chatops/_index.md
diff --git a/doc/ci/ci_cd_for_external_repos/index.md b/doc/ci/ci_cd_for_external_repos/_index.md
similarity index 100%
rename from doc/ci/ci_cd_for_external_repos/index.md
rename to doc/ci/ci_cd_for_external_repos/_index.md
diff --git a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
index 1cffb687eb6c3823a0056cb974dcba248c8d0311..8cbe866975e274c2f7477f983729583cfd8a9907 100644
--- a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
@@ -11,7 +11,7 @@ DETAILS:
 
 GitLab CI/CD can be used with Bitbucket Cloud by:
 
-1. Creating a [CI/CD project](index.md).
+1. Creating a [CI/CD project](_index.md).
 1. Connecting your Git repository by URL.
 
 To use GitLab CI/CD with a Bitbucket Cloud repository:
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index ecffb6d82300dbca1aeb73d251233fddf8497c5a..0f9790c0975de50485b5edfe44cecfb930756beb 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
 GitLab CI/CD can be used with **GitHub.com** and **GitHub Enterprise** by
-creating a [CI/CD project](index.md) to connect your GitHub repository to
+creating a [CI/CD project](_index.md) to connect your GitHub repository to
 GitLab.
 
 <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -42,7 +42,7 @@ repositories:
    1. For **Personal access token**, paste the token.
    1. Select **List Repositories**.
    1. Select **Connect** to select the repository.
-1. In GitHub, add a `.gitlab-ci.yml` to [configure GitLab CI/CD](../quick_start/index.md).
+1. In GitHub, add a `.gitlab-ci.yml` to [configure GitLab CI/CD](../quick_start/_index.md).
 
 GitLab:
 
@@ -86,6 +86,6 @@ To manually enable GitLab CI/CD for your repository:
    https://gitlab.com/api/v4/projects/<NAMESPACE>%2F<PROJECT>/mirror/pull?private_token=<PERSONAL_ACCESS_TOKEN>
    ```
 
-   Select the **Let me select individual events** option, then check the **Pull requests** and **Pushes** checkboxes. These settings are needed for [pipelines for external pull requests](index.md#pipelines-for-external-pull-requests).
+   Select the **Let me select individual events** option, then check the **Pull requests** and **Pushes** checkboxes. These settings are needed for [pipelines for external pull requests](_index.md#pipelines-for-external-pull-requests).
 
 1. In GitHub, add a `.gitlab-ci.yml` to configure GitLab CI/CD.
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/_index.md
similarity index 99%
rename from doc/ci/cloud_deployment/index.md
rename to doc/ci/cloud_deployment/_index.md
index beec37caf21a4198f2be9064cec84ad6419698c0..0d3609be038c5728e70bcf9a35ea9c72f8f09766 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/_index.md
@@ -17,7 +17,7 @@ read about [deploying to ECS](ecs/deploy_to_aws_ecs.md).
 
 NOTE:
 If you are comfortable configuring a deployment yourself and just need to retrieve
-AWS credentials, consider using [ID tokens and OpenID Connect](../cloud_services/aws/index.md).
+AWS credentials, consider using [ID tokens and OpenID Connect](../cloud_services/aws/_index.md).
 ID tokens are more secure than storing credentials in CI/CD variables, but do not
 work with the guidance on this page.
 
diff --git a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
index 1abad99d3a24c852fedd4f69381fe8ce47455da0..b7b9c14af509c10fc463e2eb2d6288ee31a065e6 100644
--- a/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
+++ b/doc/ci/cloud_deployment/ecs/deploy_to_aws_ecs.md
@@ -16,7 +16,7 @@ In this guide, you begin by creating an ECS cluster manually using the AWS conso
 deploy a simple application that you create from a GitLab template.
 
 These instructions work for both GitLab.com and GitLab Self-Managed instances.
-Ensure your own [runners are configured](../../runners/index.md).
+Ensure your own [runners are configured](../../runners/_index.md).
 
 ## Prerequisites
 
@@ -292,6 +292,6 @@ For more details and configuration options, see the [DAST documentation](../../.
 
 ## Further reading
 
-- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../index.md).
+- If you're interested in more of the continuous deployments to clouds, see [cloud deployments](../_index.md).
 - If you want to quickly set up DevSecOps in your project, see [Auto DevOps](../../../topics/autodevops/_index.md).
 - If you want to quickly set up the production-grade environment, see [the 5 Minute Production App](https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/master/README.md).
diff --git a/doc/ci/cloud_services/index.md b/doc/ci/cloud_services/_index.md
similarity index 97%
rename from doc/ci/cloud_services/index.md
rename to doc/ci/cloud_services/_index.md
index 3502bac47598347e7461c9374b2678a8a8db988a..fe9d0bc786c6cdeebc7f42c3a948025556b0e297 100644
--- a/doc/ci/cloud_services/index.md
+++ b/doc/ci/cloud_services/_index.md
@@ -110,6 +110,6 @@ The condition is validated against the JWT to create a trust specifically agains
 
 To connect with your cloud provider, see the following tutorials:
 
-- [Configure OpenID Connect in AWS](aws/index.md)
-- [Configure OpenID Connect in Azure](azure/index.md)
-- [Configure OpenID Connect in Google Cloud](google_cloud/index.md)
+- [Configure OpenID Connect in AWS](aws/_index.md)
+- [Configure OpenID Connect in Azure](azure/_index.md)
+- [Configure OpenID Connect in Google Cloud](google_cloud/_index.md)
diff --git a/doc/ci/cloud_services/aws/index.md b/doc/ci/cloud_services/aws/_index.md
similarity index 98%
rename from doc/ci/cloud_services/aws/index.md
rename to doc/ci/cloud_services/aws/_index.md
index 453a0e78c75b6b70205adabc5eeccc0bb724f7cc..f8650c93a04af7aa6eb33a9351ab1088cf84686a 100644
--- a/doc/ci/cloud_services/aws/index.md
+++ b/doc/ci/cloud_services/aws/_index.md
@@ -14,7 +14,7 @@ WARNING:
 and is scheduled to be removed in GitLab 17.0. Use [ID tokens](../../yaml/_index.md#id_tokens) instead.
 
 In this tutorial, we'll show you how to use a GitLab CI/CD job with a JSON web token (JWT) to retrieve temporary credentials from AWS without needing to store secrets.
-To do this, you must configure OpenID Connect (OIDC) for ID federation between GitLab and AWS. For background and requirements for integrating GitLab using OIDC, see [Connect to cloud services](../index.md).
+To do this, you must configure OpenID Connect (OIDC) for ID federation between GitLab and AWS. For background and requirements for integrating GitLab using OIDC, see [Connect to cloud services](../_index.md).
 
 To complete this tutorial:
 
@@ -39,7 +39,7 @@ After you create the identity provider, configure a [web identity role](https://
 
 You can create a [custom trust policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)
 for the role to limit authorization to a specific group, project, branch, or tag.
-For the full list of supported filtering types, see [Connect to cloud services](../index.md#configure-a-conditional-role-with-oidc-claims).
+For the full list of supported filtering types, see [Connect to cloud services](../_index.md#configure-a-conditional-role-with-oidc-claims).
 
 ```json
 {
@@ -110,7 +110,7 @@ Not authorized to perform sts:AssumeRoleWithWebIdentity
 It can occur for multiple reasons:
 
 - The cloud administrator has not configured the project to use OIDC with GitLab.
-- The role is restricted from being run on the branch or tag. See [configure a conditional role](../index.md).
+- The role is restricted from being run on the branch or tag. See [configure a conditional role](../_index.md).
 - `StringEquals` is used instead of `StringLike` when using a wildcard condition. See [related issue](https://gitlab.com/guided-explorations/aws/configure-openid-connect-in-aws/-/issues/2#note_852901934).
 
 ### `Could not connect to openid configuration of provider` error
diff --git a/doc/ci/cloud_services/azure/index.md b/doc/ci/cloud_services/azure/_index.md
similarity index 99%
rename from doc/ci/cloud_services/azure/index.md
rename to doc/ci/cloud_services/azure/_index.md
index 32e6e4b0ec27126ecb2f7ab24566e21121dbf023..b253c2c9e04fe09e9110a7625e8cf4ef62d7f732 100644
--- a/doc/ci/cloud_services/azure/index.md
+++ b/doc/ci/cloud_services/azure/_index.md
@@ -17,7 +17,7 @@ This tutorial demonstrates how to use a JSON web token (JWT) in a GitLab CI/CD j
 to retrieve temporary credentials from Azure without needing to store secrets.
 
 To get started, configure OpenID Connect (OIDC) for identity federation between GitLab and Azure.
-For more information on using OIDC with GitLab, read [Connect to cloud services](../index.md).
+For more information on using OIDC with GitLab, read [Connect to cloud services](../_index.md).
 
 Prerequisites:
 
@@ -221,7 +221,7 @@ CI/CD variables, from the Azure Portal:
 1. Under `Certificates & secrets`, go to `Federated credentials` to review your
    Azure AD federated identity credentials.
 
-Review [Connect to cloud services](../index.md) for further details.
+Review [Connect to cloud services](../_index.md) for further details.
 
 ### `Request to External OIDC endpoint failed` message
 
diff --git a/doc/ci/cloud_services/google_cloud/index.md b/doc/ci/cloud_services/google_cloud/_index.md
similarity index 98%
rename from doc/ci/cloud_services/google_cloud/index.md
rename to doc/ci/cloud_services/google_cloud/_index.md
index 8de7612caccd4bb400b3f6f0eacfc40ef3bb345e..c59df6d4064d70321d0824bc2b518c736cab27d7 100644
--- a/doc/ci/cloud_services/google_cloud/index.md
+++ b/doc/ci/cloud_services/google_cloud/_index.md
@@ -19,7 +19,7 @@ generates on-demand, short-lived credentials without needing to store any secret
 
 To get started, configure OpenID Connect (OIDC) for identity federation between GitLab
 and Google Cloud. For more information on using OIDC with GitLab, read
-[Connect to cloud services](../index.md).
+[Connect to cloud services](../_index.md).
 
 This tutorial assumes you have a Google Cloud account and a Google Cloud project.
 Your account must have at least the **Workload Identity Pool Admin** permission
@@ -68,7 +68,7 @@ inside the Workload Identity Pool created in the previous step, using the follow
   - The address must not end in a trailing slash.
 - **Provider attributes mapping**: Create the following mappings, where `attribute.X` is the
   name of the attribute to be included as a claim in the Google token, and `assertion.X`
-  is the value to extract from the [GitLab claim](../index.md#how-it-works):
+  is the value to extract from the [GitLab claim](../_index.md#how-it-works):
 
   | Attribute (on Google) | Assertion (from GitLab) |
   | --- | --- |
diff --git a/doc/ci/components/index.md b/doc/ci/components/_index.md
similarity index 98%
rename from doc/ci/components/index.md
rename to doc/ci/components/_index.md
index 892961826490cff9a2801bbc6aadb7d18b97d62d..04f33b0b892136ebcceec1e90d0c602d7ccd77f0 100644
--- a/doc/ci/components/index.md
+++ b/doc/ci/components/_index.md
@@ -575,7 +575,7 @@ To access the CI/CD Catalog and view the published components that are available
 1. Select **Explore**.
 1. Select **CI/CD Catalog**.
 
-Alternatively, if you are already in the [pipeline editor](../pipeline_editor/index.md)
+Alternatively, if you are already in the [pipeline editor](../pipeline_editor/_index.md)
 in your project, you can select **CI/CD Catalog**.
 
 Visibility of components in the CI/CD catalog follows the component source project's
@@ -708,14 +708,14 @@ Any existing CI/CD template that you use in projects by using the `include:` syn
 can be converted to a CI/CD component:
 
 1. Decide if you want the component to be grouped with other components as part of
-   an existing [component project](index.md#component-project), or [create a new component project](#create-a-component-project).
-1. Create a YAML file in the component project according to the [directory structure](index.md#directory-structure).
+   an existing [component project](#component-project), or [create a new component project](#create-a-component-project).
+1. Create a YAML file in the component project according to the [directory structure](#directory-structure).
 1. Copy the content of the original template YAML file into the new component YAML file.
 1. Refactor the new component's configuration to:
    - Follow the guidance on [writing a component](#write-a-component).
    - Improve the configuration, for example by enabling [merge request pipelines](../pipelines/merge_request_pipelines.md)
      or making it [more efficient](../pipelines/pipeline_efficiency.md).
-1. Leverage the `.gitlab-ci.yml` in the components repository to [test changes to the component](index.md#test-the-component).
+1. Leverage the `.gitlab-ci.yml` in the components repository to [test changes to the component](#test-the-component).
 1. Tag and [release the component](#publish-a-new-release).
 
 You can learn more by following a practical example for [migrating the Go CI/CD template to CI/CD component](examples.md#cicd-component-migration-example-go).
@@ -741,7 +741,7 @@ To mirror a GitLab.com component in your GitLab Self-Managed instance:
    for the component project mirror because mirroring repositories does not copy the description.
 1. [Set the self-hosted component project as a catalog resource](#set-a-component-project-as-a-catalog-project).
 1. Publish [a new release](../../user/project/releases/index.md) in the self-hosted component project by
-   [running a pipeline](../pipelines/index.md#run-a-pipeline-manually) for a tag (usually the latest tag).
+   [running a pipeline](../pipelines/_index.md#run-a-pipeline-manually) for a tag (usually the latest tag).
 
 ## CI/CD component security best practices
 
diff --git a/doc/ci/components/examples.md b/doc/ci/components/examples.md
index 250d5bd7f4794775bad0d7588a7be1b3fc8884c9..0711cbac281e1f1f42a983dc2fe1814f3680e4a9 100644
--- a/doc/ci/components/examples.md
+++ b/doc/ci/components/examples.md
@@ -11,7 +11,7 @@ DETAILS:
 
 ## Test a component
 
-Depending on a component's functionality, [testing the component](index.md#test-the-component) might require additional files in the repository.
+Depending on a component's functionality, [testing the component](_index.md#test-the-component) might require additional files in the repository.
 For example, a component which lints, builds, and tests software in a specific programming language requires actual source code samples.
 You can have source code examples, configuration files, and similar in the same repository.
 
@@ -19,7 +19,7 @@ For example, the Code Quality CI/CD component's has several [code samples for te
 
 ### Example: Test a Rust language CI/CD component
 
-Depending on a component's functionality, [testing the component](index.md#test-the-component) might require additional files in the repository.
+Depending on a component's functionality, [testing the component](_index.md#test-the-component) might require additional files in the repository.
 
 The following "hello world" example for the Rust programming language uses the `cargo` tool chain for simplicity:
 
@@ -248,7 +248,7 @@ and only migrate the `build` CI/CD job in the first iteration.
 The CI/CD template migration involves the following steps:
 
 1. Analyze the CI/CD jobs and dependencies, and define migration actions:
-   - The `image` configuration is global, [needs to be moved into the job definitions](index.md#avoid-using-global-keywords).
+   - The `image` configuration is global, [needs to be moved into the job definitions](_index.md#avoid-using-global-keywords).
    - The `format` job runs multiple `go` commands in one job. The `go test` command should be moved
      into a separate job to increase pipeline efficiency.
    - The `compile` job runs `go build` and should be renamed to `build`.
@@ -259,13 +259,13 @@ The CI/CD template migration involves the following steps:
      the Docker Hub image tag values.
    - The `compile` job builds the binaries into a hard-coded target directory `mybinaries`,
      which can be enhanced with a dynamic [input](../yaml/inputs.md) and default value `mybinaries`.
-1. Create a template [directory structure](index.md#directory-structure) for the new component,
+1. Create a template [directory structure](_index.md#directory-structure) for the new component,
    based on one template for each job.
 
    - The name of the template should follow the `go` command, for example `format.yml`, `build.yml`, and `test.yml`.
    - Create a new project, initialize a Git repository, add/commit all changes, set a remote origin and push.
      Modify the URL for your CI/CD component project path.
-   - Create additional files as outlined in the guidance to [write a component](index.md#write-a-component):
+   - Create additional files as outlined in the guidance to [write a component](_index.md#write-a-component):
      `README.md`, `LICENSE.md`, `.gitlab-ci.yml`, `.gitignore`. The following shell commands
      initialize the Go component structure:
 
@@ -360,7 +360,7 @@ The CI/CD template migration involves the following steps:
      ```
 
 1. In order to test the component, modify the `.gitlab-ci.yml` configuration file,
-   and add [tests](index.md#test-the-component).
+   and add [tests](_index.md#test-the-component).
 
    - Specify a different value for `golang_version` as input for the `build` job.
    - Modify the URL for your CI/CD component path.
@@ -420,12 +420,12 @@ The CI/CD template migration involves the following steps:
          └── test.yml
      ```
 
-Follow the remaining steps in the [converting a CI/CD template into a component](index.md#convert-a-cicd-template-to-a-component)
+Follow the remaining steps in the [converting a CI/CD template into a component](_index.md#convert-a-cicd-template-to-a-component)
 section to complete the migration:
 
 1. Commit and push the changes, and verify the CI/CD pipeline results.
-1. Follow the guidance on [writing a component](index.md#write-a-component) to update the `README.md` and `LICENSE.md` files.
-1. [Release the component](index.md#publish-a-new-release) and verify it in the CI/CD catalog.
+1. Follow the guidance on [writing a component](_index.md#write-a-component) to update the `README.md` and `LICENSE.md` files.
+1. [Release the component](_index.md#publish-a-new-release) and verify it in the CI/CD catalog.
 1. Add the CI/CD component into your staging/production environment.
 
 The [GitLab-maintained Go component](https://gitlab.com/components/go) provides an example
diff --git a/doc/ci/debugging.md b/doc/ci/debugging.md
index 7db28feef002006fd18931736dfbfb3df717899c..ecba27ed3c214a467872673e1ccbfc536dd9a0d2 100644
--- a/doc/ci/debugging.md
+++ b/doc/ci/debugging.md
@@ -19,7 +19,7 @@ If you are unable to resolve pipeline issues, you can get help from:
 If you are having issues with a specific CI/CD feature, see the related troubleshooting section
 for that feature:
 
-- [Caching](caching/index.md#troubleshooting).
+- [Caching](caching/_index.md#troubleshooting).
 - [CI/CD job tokens](jobs/ci_job_token.md#troubleshooting).
 - [Container registry](../user/packages/container_registry/troubleshoot_container_registry.md).
 - [Docker](docker/using_docker_build.md#troubleshooting).
@@ -32,7 +32,7 @@ for that feature:
 - [Merge request pipelines](pipelines/mr_pipeline_troubleshooting.md),
   [merged results pipelines](pipelines/merged_results_pipelines.md#troubleshooting),
   and [merge trains](pipelines/merge_trains.md#troubleshooting).
-- [Pipeline editor](pipeline_editor/index.md#troubleshooting).
+- [Pipeline editor](pipeline_editor/_index.md#troubleshooting).
 - [Variables](variables/_index.md#troubleshooting).
 - [YAML `includes` keyword](yaml/includes.md#troubleshooting).
 - [YAML `script` keyword](yaml/script.md#troubleshooting).
@@ -46,12 +46,12 @@ badge and does not start running if any syntax or formatting problems are found.
 
 #### Edit `.gitlab-ci.yml` with the pipeline editor
 
-The [pipeline editor](pipeline_editor/index.md) is the recommended editing
+The [pipeline editor](pipeline_editor/_index.md) is the recommended editing
 experience (rather than the single file editor or the Web IDE). It includes:
 
 - Code completion suggestions that ensure you are only using accepted keywords.
 - Automatic syntax highlighting and validation.
-- The [CI/CD configuration visualization](pipeline_editor/index.md#visualize-ci-configuration),
+- The [CI/CD configuration visualization](pipeline_editor/_index.md#visualize-ci-configuration),
   a graphical representation of your `.gitlab-ci.yml` file.
 
 #### Edit `.gitlab-ci.yml` locally
@@ -126,7 +126,7 @@ and check if their values are what you expect.
 
 You can define CI/CD variables that are not used in standard pipeline runs, but can
 be used for debugging on demand. If you add a variable like in the following example,
-you can add it during manual runs of the [pipeline](pipelines/index.md#run-a-pipeline-manually)
+you can add it during manual runs of the [pipeline](pipelines/_index.md#run-a-pipeline-manually)
 or [individual job](jobs/job_control.md#run-a-manual-job) to modify the command's behavior.
 For example:
 
@@ -339,7 +339,7 @@ configuration into more independent [parent-child pipelines](pipelines/pipeline_
 Pipeline configuration warnings are shown when you:
 
 - [Validate configuration with the CI Lint tool](yaml/lint.md).
-- [Manually run a pipeline](pipelines/index.md#run-a-pipeline-manually).
+- [Manually run a pipeline](pipelines/_index.md#run-a-pipeline-manually).
 
 ### `Job may allow multiple pipelines to run for a single action` warning
 
@@ -420,7 +420,7 @@ likely to hit the default memory limit.
 To reduce the configuration size, you can:
 
 - Check the length of the expanded CI/CD configuration in the pipeline editor's
-  [Full configuration](pipeline_editor/index.md#view-full-configuration) tab. Look for
+  [Full configuration](pipeline_editor/_index.md#view-full-configuration) tab. Look for
   duplicated configuration that can be removed or simplified.
 - Move long or repeated `script` sections into standalone scripts in the project.
 - Use [parent and child pipelines](pipelines/downstream_pipelines.md#parent-child-pipelines) to move some
@@ -430,7 +430,7 @@ On GitLab Self-Managed, you can [increase the size limits](../administration/ins
 
 ### `500` error when editing the `.gitlab-ci.yml` file
 
-A [loop of included configuration files](pipeline_editor/index.md#configuration-validation-currently-not-available-message)
+A [loop of included configuration files](pipeline_editor/_index.md#configuration-validation-currently-not-available-message)
 can cause a `500` error when editing the `.gitlab-ci.yml` file with the [web editor](../user/project/repository/web_editor.md).
 
 Ensure that included configuration files do not create a loop of references to each other.
diff --git a/doc/ci/docker/index.md b/doc/ci/docker/_index.md
similarity index 100%
rename from doc/ci/docker/index.md
rename to doc/ci/docker/_index.md
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 667e1dc35bc996222a7dd7dfb18988a7990b616a..1310165af7fdcbdacec37289d1eadf80721048fe 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -91,7 +91,7 @@ The Docker image includes all of the `docker` tools and can run
 the job script in context of the image in privileged mode.
 
 You should use Docker-in-Docker with TLS enabled,
-which is supported by [GitLab.com instance runners](../runners/index.md).
+which is supported by [GitLab.com instance runners](../runners/_index.md).
 
 You should always pin a specific version of the image, like `docker:24.0.5`.
 If you use a tag like `docker:latest`, you have no control over which version is used.
@@ -815,7 +815,7 @@ You might get an error that says
 `docker: error during connect: Post https://docker:2376/v1.40/containers/create: dial tcp: lookup docker on x.x.x.x:53: no such host`.
 
 This issue can occur when the service's image name
-[includes a registry hostname](../services/index.md#available-settings-for-services). For example:
+[includes a registry hostname](../services/_index.md#available-settings-for-services). For example:
 
 ```yaml
 default:
@@ -824,7 +824,7 @@ default:
     - registry.hub.docker.com/library/docker:24.0.5-dind
 ```
 
-A service's hostname is [derived from the full image name](../services/index.md#accessing-the-services).
+A service's hostname is [derived from the full image name](../services/_index.md#accessing-the-services).
 However, the shorter service hostname `docker` is expected.
 To allow service resolution and access, add an explicit alias for the service name `docker`:
 
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 075657df55405ceac5517dbb1bc6bcda1d0a1e0c..518df3a40aa1253a5c7e33954feaf183ae9ba5d7 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -15,7 +15,7 @@ To run CI/CD jobs in a Docker container, you need to:
 
 1. Register a runner and configure it to use the [Docker executor](https://docs.gitlab.com/runner/executors/docker.html).
 1. Specify the container image where you want to run the CI/CD jobs in the `.gitlab-ci.yml` file.
-1. Optional. Run other services, like MySQL, in containers. Do this by specifying [services](../services/index.md)
+1. Optional. Run other services, like MySQL, in containers. Do this by specifying [services](../services/_index.md)
    in your `.gitlab-ci.yml` file.
 
 ## Register a runner that uses the Docker executor
@@ -202,7 +202,7 @@ In the `config.toml` file, you can define:
 - In the [`[runners.docker]`](https://docs.gitlab.com/runner/configuration/advanced-configuration#the-runnersdocker-section) section,
   the container image used to run CI/CD jobs
 - In the [`[[runners.docker.services]]`](https://docs.gitlab.com/runner/configuration/advanced-configuration#the-runnersdockerservices-section) section,
-  the [services](../services/index.md) container
+  the [services](../services/_index.md) container
 
 ```toml
 [runners.docker]
@@ -494,7 +494,7 @@ secure and streamlined interactions with AWS services, especially for containeri
 to manage, deploy, and update Docker images on Amazon ECR. This setup helps avoid time consuming, error-prone configurations,
 and manual credential management.
 
-1. [Authenticate GitLab with AWS](../cloud_deployment/index.md#authenticate-gitlab-with-aws).
+1. [Authenticate GitLab with AWS](../cloud_deployment/_index.md#authenticate-gitlab-with-aws).
 1. Create a `Dockerfile` with the following content:
 
    ```Dockerfile
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 7bf05fe49623c22bc504b778ab06c3097c71f20a..b63d940030d9bc91af92d848ef447d9620ea12bd 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -145,7 +145,7 @@ The [Least Privilege Container Builds with Kaniko on GitLab](https://www.youtube
 video is a walkthrough of the [Kaniko Docker Build](https://gitlab.com/guided-explorations/containers/kaniko-docker-build)
 Guided Exploration project pipeline. It was tested on:
 
-- [GitLab.com instance runners](../runners/index.md)
+- [GitLab.com instance runners](../runners/_index.md)
 - [The Kubernetes runner executor](https://docs.gitlab.com/runner/executors/kubernetes/index.html)
 
 The example can be copied to your own group or instance for testing. More details
diff --git a/doc/ci/environments/_index.md b/doc/ci/environments/_index.md
index 79afcd5b70af6260532b30cba0e15153b0c366be..449d84dd6ca6babf12b3582cabb9996d0045884a 100644
--- a/doc/ci/environments/_index.md
+++ b/doc/ci/environments/_index.md
@@ -66,7 +66,7 @@ For example:
 
 #### Go from source files to public pages
 
-With GitLab [Route Maps](../review_apps/index.md#route-maps), you can go directly
+With GitLab [Route Maps](../review_apps/_index.md#route-maps), you can go directly
 from source files to public pages in the environment set for review apps.
 
 ## Types of environments
@@ -83,7 +83,7 @@ Dynamic environments:
 
 - Are usually created in a CI/CD pipeline and are used by only a single deployment, then either stopped or deleted.
 - Have dynamic names, usually based on the value of a CI/CD variable.
-- Are a feature of [review apps](../review_apps/index.md).
+- Are a feature of [review apps](../review_apps/_index.md).
 
 An environment has one of three states, depending on whether its [stop job](../yaml/_index.md#environmenton_stop) has run:
 
@@ -239,7 +239,7 @@ Note the following:
 - If the script that runs in `stop_review` exists only in your repository and therefore can't use
   `GIT_STRATEGY: none` or `GIT_STRATEGY: empty`, configure [merge request pipelines](../pipelines/merge_request_pipelines.md)
   for these jobs. This ensures that runners can fetch the repository even after a feature branch is
-  deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
+  deleted. For more information, see [Ref Specs for Runners](../pipelines/_index.md#ref-specs-for-runners).
 
 NOTE:
 For Windows runners, you should use the PowerShell `Add-Content` command to write to `.env` files.
@@ -265,7 +265,7 @@ you can use tiers:
 | `production`     | Production, Live                                   |
 | `staging`        | Staging, Model, Demo                               |
 | `testing`        | Test, QC                                           |
-| `development`    | Dev, [Review apps](../review_apps/index.md), Trunk |
+| `development`    | Dev, [Review apps](../review_apps/_index.md), Trunk |
 | `other`          |                                                    |
 
 By default, GitLab assumes a tier based on [the environment name](../yaml/_index.md#environmentname).
@@ -307,7 +307,7 @@ the variable's environment scope to `production` to only allow jobs with an [env
 of `production` to access the variable.
 
 You can also use wildcard matching (`*`) to select a particular environment group,
-like all [review apps](../review_apps/index.md) with `review/*`.
+like all [review apps](../review_apps/_index.md) with `review/*`.
 
 For example, with these four environments:
 
@@ -614,7 +614,7 @@ stop_review_app:
 
 To configure multiple **parallel** stop actions on an environment, specify the
 [`on_stop`](../yaml/_index.md#environmenton_stop) keyword across multiple
-[deployment jobs](../jobs/index.md#deployment-jobs) for the same `environment`, as defined in the
+[deployment jobs](../jobs/_index.md#deployment-jobs) for the same `environment`, as defined in the
 `.gitlab-ci.yml` file.
 
 When an environment is stopped, the matching `on_stop` actions from only successful deployment jobs are run in parallel, in no particular order.
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index c9eb57f819b82d3ab19e85b9d9c0c8a9fc5cc95d..9a9e7ba821d572c0b83e6aac667d727e01043523 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-[Deployment jobs](../jobs/index.md#deployment-jobs) are a specific kind of CI/CD
+[Deployment jobs](../jobs/_index.md#deployment-jobs) are a specific kind of CI/CD
 job. They can be more sensitive than other jobs in a pipeline,
 and might need to be treated with extra care. GitLab has several features
 that help maintain deployment security and stability.
@@ -68,14 +68,14 @@ The improved pipeline flow **after** using the resource group:
 1. `deploy` job in Pipeline-A finishes.
 1. `deploy` job in Pipeline-B starts running.
 
-For more information, see [Resource Group documentation](../resource_groups/index.md).
+For more information, see [Resource Group documentation](../resource_groups/_index.md).
 
 ## Prevent outdated deployment jobs
 
 > - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/363328) in GitLab 15.5 to prevent outdated job runs.
 
 The effective execution order of pipeline jobs can vary from run to run, which
-could cause undesired behavior. For example, a [deployment job](../jobs/index.md#deployment-jobs)
+could cause undesired behavior. For example, a [deployment job](../jobs/_index.md#deployment-jobs)
 in a newer pipeline could finish before a deployment job in an older pipeline.
 This creates a race condition where the older deployment finishes later,
 overwriting the "newer" deployment.
@@ -149,7 +149,7 @@ secrets aren't exposed unintentionally. You can also define production secrets o
 This prevents other users with the Maintainer role from reading the secrets and makes sure
 that the runner only runs on protected branches.
 
-For more information, see [pipeline security](../pipelines/index.md#pipeline-security-on-protected-branches).
+For more information, see [pipeline security](../pipelines/_index.md#pipeline-security-on-protected-branches).
 
 ## Separate project for deployments
 
diff --git a/doc/ci/environments/deployments.md b/doc/ci/environments/deployments.md
index 11d13c51147c5c56332684205cb72b0202541e65..c107d2dd548839cb2eed5f12ea6fb4d3b873db60 100644
--- a/doc/ci/environments/deployments.md
+++ b/doc/ci/environments/deployments.md
@@ -114,7 +114,7 @@ It points to the commit you're rolling back to.
 For the rollback to succeed, the deployment process must be defined in
 the job's `script`.
 
-Only the [deployment jobs](../jobs/index.md#deployment-jobs) are run.
+Only the [deployment jobs](../jobs/_index.md#deployment-jobs) are run.
 In cases where a previous job generates artifacts that must be regenerated
 on deploy, you must manually run the necessary jobs from the pipelines page.
 For example, if you use Terraform and your `plan` and `apply` commands are separated
@@ -143,7 +143,7 @@ In this case, see [job retries for rollback deployments](deployment_safety.md#jo
 - [Environments](_index.md)
 - [Downstream pipelines for deployments](../pipelines/downstream_pipelines.md#downstream-pipelines-for-deployments)
 - [Deploy to multiple environments with GitLab CI/CD (blog post)](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/)
-- [Review apps](../review_apps/index.md)
+- [Review apps](../review_apps/_index.md)
 - [Track deployments of an external deployment tool](external_deployment_tools.md)
 
 ## Troubleshooting
diff --git a/doc/ci/examples/index.md b/doc/ci/examples/_index.md
similarity index 99%
rename from doc/ci/examples/index.md
rename to doc/ci/examples/_index.md
index 3155d7a475a04ea4fbf760bdece1e6ac30163ce5..a1e088cf343ee2255b0ff8354687d16a03e90173 100644
--- a/doc/ci/examples/index.md
+++ b/doc/ci/examples/_index.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
 This page contains links to a variety of examples that can help you understand how to
-implement [GitLab CI/CD](../index.md) for your specific use case.
+implement [GitLab CI/CD](../_index.md) for your specific use case.
 
 Examples are available in several forms. As a collection of:
 
@@ -25,7 +25,7 @@ The following table lists examples with step-by-step tutorials that are containe
 
 | Use case                      | Resource |
 |-------------------------------|----------|
-| Deployment with Dpl           | [Using `dpl` as deployment tool](deployment/index.md). |
+| Deployment with Dpl           | [Using `dpl` as deployment tool](deployment/_index.md). |
 | GitLab Pages                  | See the [GitLab Pages](../../user/project/pages/index.md) documentation for a complete example of deploying a static site. |
 | Multi project pipeline        | [Build, test deploy using multi project pipeline](https://gitlab.com/gitlab-examples/upstream-project). |
 | npm with semantic-release     | [Publish npm packages to the GitLab package registry using semantic-release](semantic-release.md). |
diff --git a/doc/ci/examples/deployment/index.md b/doc/ci/examples/deployment/_index.md
similarity index 100%
rename from doc/ci/examples/deployment/index.md
rename to doc/ci/examples/deployment/_index.md
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 72e7900a77e5ffd9a7f2b83d754c310402cf97c3..f7ce61f42134aaf588c2c5172c91bddc3dfebe1d 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../index.md).
+This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../_index.md).
 
 While it is possible to create your own image with custom PHP and Node.js versions, for brevity we use an existing [Docker image](https://hub.docker.com/r/tetraweb/php/) that contains both PHP and Node.js installed.
 
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/_index.md
similarity index 92%
rename from doc/ci/examples/end_to_end_testing_webdriverio/index.md
rename to doc/ci/examples/end_to_end_testing_webdriverio/_index.md
index c2779a50e3171d3deaeafda73d26dabcda10def1..471cb612bd574b5f731a60789ed65209bbc75c55 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/_index.md
@@ -1,11 +1,11 @@
 ---
-redirect_to: '../index.md'
+redirect_to: '../_index.md'
 remove_date: '2025-04-27'
 ---
 
 <!-- markdownlint-disable -->
 
-This document was removed. You can check other [CI/CD examples](../index.md).
+This document was removed. You can check other [CI/CD examples](../_index.md).
 
 <!-- This redirect file can be deleted after <2025-04-27>. -->
 <!-- Redirects that point to other docs in the same project expire in three months. -->
diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/_index.md
similarity index 92%
rename from doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
rename to doc/ci/examples/laravel_with_gitlab_and_envoy/_index.md
index c2779a50e3171d3deaeafda73d26dabcda10def1..471cb612bd574b5f731a60789ed65209bbc75c55 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/_index.md
@@ -1,11 +1,11 @@
 ---
-redirect_to: '../index.md'
+redirect_to: '../_index.md'
 remove_date: '2025-04-27'
 ---
 
 <!-- markdownlint-disable -->
 
-This document was removed. You can check other [CI/CD examples](../index.md).
+This document was removed. You can check other [CI/CD examples](../_index.md).
 
 <!-- This redirect file can be deleted after <2025-04-27>. -->
 <!-- Redirects that point to other docs in the same project expire in three months. -->
diff --git a/doc/ci/examples/php.md b/doc/ci/examples/php.md
index f51a3ed9ea9e4a8e38b473596151b52cd08bbb5f..a4d486f32acb13a5399fa4ca15d75443bb92b6ba 100644
--- a/doc/ci/examples/php.md
+++ b/doc/ci/examples/php.md
@@ -252,7 +252,7 @@ run. If you're using the Docker executor, you can leverage Docker to
 link to other containers. With GitLab Runner, this can be achieved by defining
 a `service`.
 
-This functionality is covered in [the CI services](../services/index.md)
+This functionality is covered in [the CI services](../services/_index.md)
 documentation.
 
 ## Testing things locally
@@ -272,7 +272,7 @@ gitlab-runner exec shell test:app
 
 We have set up an [Example PHP Project](https://gitlab.com/gitlab-examples/php) for your convenience
 that runs on [GitLab.com](https://gitlab.com) using our publicly available
-[instance runners](../runners/index.md).
+[instance runners](../runners/_index.md).
 
 Want to hack on it? Fork it, commit, and push your changes. Within a few
 moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/gitlab_google_cloud_integration/index.md b/doc/ci/gitlab_google_cloud_integration/_index.md
similarity index 100%
rename from doc/ci/gitlab_google_cloud_integration/index.md
rename to doc/ci/gitlab_google_cloud_integration/_index.md
diff --git a/doc/ci/interactive_web_terminal/index.md b/doc/ci/interactive_web_terminal/_index.md
similarity index 98%
rename from doc/ci/interactive_web_terminal/index.md
rename to doc/ci/interactive_web_terminal/_index.md
index 1666572318bb46721e0e1cc4f4098259c224016f..18f82b1b716f2218b30f829d8182746dec0e542e 100644
--- a/doc/ci/interactive_web_terminal/index.md
+++ b/doc/ci/interactive_web_terminal/_index.md
@@ -17,7 +17,7 @@ is deployed, some [security precautions](../../administration/integration/termin
 taken to protect the users.
 
 NOTE:
-[Instance runners on GitLab.com](../runners/index.md) do not
+[Instance runners on GitLab.com](../runners/_index.md) do not
 provide an interactive web terminal. Follow
 [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/24674) for progress on
 adding support. For groups and projects hosted on GitLab.com, interactive web
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/_index.md
similarity index 95%
rename from doc/ci/jobs/index.md
rename to doc/ci/jobs/_index.md
index f395071b32aa9d873c6f66049ed0be5714127761..124f74c9c6455b04d69e92e0316e8a50b8738b27 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/_index.md
@@ -9,13 +9,13 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-CI/CD jobs are the fundamental elements of a [GitLab CI/CD pipeline](../pipelines/index.md).
+CI/CD jobs are the fundamental elements of a [GitLab CI/CD pipeline](../pipelines/_index.md).
 Jobs are configured in the `.gitlab-ci.yml` file with a list of commands to execute
 to accomplish tasks like building, testing, or deploying code.
 
 Jobs:
 
-- Execute on a [runner](../runners/index.md), for example in a Docker container.
+- Execute on a [runner](../runners/_index.md), for example in a Docker container.
 - Run independently from other jobs.
 - Have a [job log](job_logs.md) with the full execution log for the job.
 
@@ -26,7 +26,7 @@ of the job's execution, including keywords that:
 - Group jobs together in collections called [stages](../yaml/_index.md#stages).
   Stages run in sequence, while all jobs in a stage can run in parallel.
 - Define [CI/CD variables](../variables/_index.md) for flexible configuration.
-- Define [caches](../caching/index.md) to speed up job execution.
+- Define [caches](../caching/_index.md) to speed up job execution.
 - Save files as [artifacts](job_artifacts.md) which can be used by other jobs.
 
 ## Add a job to a pipeline
@@ -190,8 +190,8 @@ When you access a pipeline, you can see the related jobs for that pipeline.
 
 The order of jobs in a pipeline depends on the type of pipeline graph.
 
-- For [full pipeline graphs](../pipelines/index.md#pipeline-details), jobs are sorted by name.
-- For [pipeline mini graphs](../pipelines/index.md#pipeline-mini-graphs), jobs are sorted by status, and then by name.
+- For [full pipeline graphs](../pipelines/_index.md#pipeline-details), jobs are sorted by name.
+- For [pipeline mini graphs](../pipelines/_index.md#pipeline-mini-graphs), jobs are sorted by status, and then by name.
   The job status order is:
 
   1. failed
@@ -233,7 +233,7 @@ You can filter the list by [job status](#view-jobs-in-a-pipeline) and [job name]
 
 ### Group similar jobs together in pipeline views
 
-If you have many similar jobs, your [pipeline graph](../pipelines/index.md#pipeline-details)
+If you have many similar jobs, your [pipeline graph](../pipelines/_index.md#pipeline-details)
 becomes long and hard to read.
 
 You can automatically group similar jobs together. If the job names are formatted in a certain way,
@@ -289,7 +289,7 @@ job names are not removed.
 When a pipeline fails or is allowed to fail, there are several places where you
 can find the reason:
 
-- In the [pipeline graph](../pipelines/index.md#pipeline-details), in the pipeline details view.
+- In the [pipeline graph](../pipelines/_index.md#pipeline-details), in the pipeline details view.
 - In the pipeline widgets, in the merge requests and commit pages.
 - In the job views, in the global and detailed views of a job.
 
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index d7c90fb6a61ea78ffc1673c11aba62013c7a8feb..cb19cd6ce6ec91b154b2390d12af62618aadb03a 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -47,7 +47,7 @@ The CI/CD job token can only access the following features and API endpoints:
 | [Release links API](../../api/releases/links.md)                                                      |         |
 | [Releases API](../../api/releases/_index.md)                                                           | `GET` requests are public by default. |
 | [Repositories API](../../api/repositories.md#generate-changelog-data)                                 | Generates changelog data based on commits in a repository. |
-| [Secure files](../secure_files/index.md#use-secure-files-in-cicd-jobs)                                | The `download-secure-files` tool authenticates with a CI/CD job token by default. |
+| [Secure files](../secure_files/_index.md#use-secure-files-in-cicd-jobs)                                | The `download-secure-files` tool authenticates with a CI/CD job token by default. |
 | [Terraform plan](../../user/infrastructure/index.md)                                                  |         |
 
 Other API endpoints are not accessible using a job token. There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559)
@@ -62,7 +62,7 @@ GitLab:
 - Masks the job token in job logs.
 - Grants permissions to the job token only when the job is running.
 
-You should also configure your [runners](../runners/index.md) to be secure:
+You should also configure your [runners](../runners/_index.md) to be secure:
 
 - Avoid using Docker `privileged` mode if the machines are re-used.
 - Avoid using the [`shell` executor](https://docs.gitlab.com/runner/executors/shell.html) when jobs
diff --git a/doc/ci/jobs/job_artifacts_troubleshooting.md b/doc/ci/jobs/job_artifacts_troubleshooting.md
index a5ea9d43cd698ea833cd195bd2843e1586f7b632..15a7551b6222c3d8b399a922691a3516bcce32a2 100644
--- a/doc/ci/jobs/job_artifacts_troubleshooting.md
+++ b/doc/ci/jobs/job_artifacts_troubleshooting.md
@@ -167,7 +167,7 @@ To toggle feature flags, you must be an administrator.
 
 On GitLab SaaS:
 
-- Run the following [ChatOps](../chatops/index.md) command:
+- Run the following [ChatOps](../chatops/_index.md) command:
 
   ```ruby
   /chatops run feature set ci_unlock_pipelines_extra_low true
diff --git a/doc/ci/jobs/job_logs.md b/doc/ci/jobs/job_logs.md
index 594c8ee981e573dafd333aad6e8d9b323d363c10..7cb7481b2564d36966f9d6c5ddea4516e705917b 100644
--- a/doc/ci/jobs/job_logs.md
+++ b/doc/ci/jobs/job_logs.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-A job log displays the full execution history of a [CI/CD job](index.md).
+A job log displays the full execution history of a [CI/CD job](_index.md).
 
 ## View job logs
 
diff --git a/doc/ci/jobs/job_rules.md b/doc/ci/jobs/job_rules.md
index 125426a7538e03ef8d3f7cfb127de0ff3cadca07..b4991736425837eb60e41e3e7a7975aefdbc21d8 100644
--- a/doc/ci/jobs/job_rules.md
+++ b/doc/ci/jobs/job_rules.md
@@ -211,9 +211,9 @@ Use the `CI_PIPELINE_SOURCE` variable to control when to add jobs for these pipe
 | Value                           | Description |
 |---------------------------------|-------------|
 | `api`                           | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline). |
-| `chat`                          | For pipelines created by using a [GitLab ChatOps](../chatops/index.md) command. |
+| `chat`                          | For pipelines created by using a [GitLab ChatOps](../chatops/_index.md) command. |
 | `external`                      | When you use CI services other than GitLab. |
-| `external_pull_request_event`   | When an [external pull request on GitHub](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests) is created or updated. |
+| `external_pull_request_event`   | When an [external pull request on GitHub](../ci_cd_for_external_repos/_index.md#pipelines-for-external-pull-requests) is created or updated. |
 | `merge_request_event`           | For pipelines created when a merge request is created or updated. Required to enable [merge request pipelines](../pipelines/merge_request_pipelines.md), [merged results pipelines](../pipelines/merged_results_pipelines.md), and [merge trains](../pipelines/merge_trains.md). |
 | `ondemand_dast_scan`            | For [DAST on-demand scan](../../user/application_security/dast/on-demand_scan.md) pipelines. |
 | `ondemand_dast_validation`      | For [DAST on-demand validation](../../user/application_security/dast/on-demand_scan.md#site-profile-validation) pipelines |
@@ -222,7 +222,7 @@ Use the `CI_PIPELINE_SOURCE` variable to control when to add jobs for these pipe
 | `push`                          | For pipelines triggered by a Git push event, including for branches and tags. |
 | `schedule`                      | For [scheduled pipelines](../pipelines/schedules.md). |
 | `security_orchestration_policy` | For [security orchestration policy](../../user/application_security/policies/index.md) pipelines. |
-| `trigger`                       | For pipelines created by using a [trigger token](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
+| `trigger`                       | For pipelines created by using a [trigger token](../triggers/_index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
 | `web`                           | For pipelines created by selecting **New pipeline** in the GitLab UI, from the project's **Build > Pipelines** section. |
 | `webide`                        | For pipelines created by using the [Web IDE](../../user/project/web_ide/index.md). |
 
diff --git a/doc/ci/jobs/mobile_devops.md b/doc/ci/jobs/mobile_devops.md
index 609e1c65d802b9f19adad9d84bb1bee02684f9dc..4decc9c2fe18fb540cd630978e8388ecbcd6325e 100644
--- a/doc/ci/jobs/mobile_devops.md
+++ b/doc/ci/jobs/mobile_devops.md
@@ -1,11 +1,11 @@
 ---
-redirect_to: '../mobile_devops/index.md'
+redirect_to: '../mobile_devops/_index.md'
 remove_date: '2025-04-24'
 ---
 
 <!-- markdownlint-disable -->
 
-This document was moved to [another location](../mobile_devops/index.md).
+This document was moved to [another location](../mobile_devops/_index.md).
 
 <!-- This redirect file can be deleted after <2025-04-24>. -->
 <!-- Redirects that point to other docs in the same project expire in three months. -->
diff --git a/doc/ci/migration/bamboo.md b/doc/ci/migration/bamboo.md
index a6dd2773ff7fb8516e46f10bfc7a99a62926d3bd..5e81b18d1d0d94a87f3b26f2a14c8f8e6ea72150 100644
--- a/doc/ci/migration/bamboo.md
+++ b/doc/ci/migration/bamboo.md
@@ -15,8 +15,8 @@ exported from the Bamboo UI or stored in Spec repositories.
 
 ## GitLab CI/CD Primer
 
-If you are new to GitLab CI/CD, use the [Getting started guide](../index.md) to learn
-the basic concepts and how to create your first [`.gitlab-ci.yml` file](../quick_start/index.md).
+If you are new to GitLab CI/CD, use the [Getting started guide](../_index.md) to learn
+the basic concepts and how to create your first [`.gitlab-ci.yml` file](../quick_start/_index.md).
 If you already have some experience using GitLab CI/CD, you can review [CI/CD YAML syntax reference](../yaml/_index.md)
 to see the full list of available keywords.
 
@@ -45,7 +45,7 @@ remote agents running external to the server.
 GitLab uses a similar concept to agents called [runners](https://docs.gitlab.com/runner/)
 which use [executors](https://docs.gitlab.com/runner/executors/) to run builds.
 
-Examples of executors are shell, Docker, or Kubernetes. You can choose to use [GitLab.com runners](../runners/index.md)
+Examples of executors are shell, Docker, or Kubernetes. You can choose to use [GitLab.com runners](../runners/_index.md)
 or deploy your own [self-managed runners](https://docs.gitlab.com/runner/install/index.html).
 
 ### Workflow
@@ -85,7 +85,7 @@ Alternatively, [Auto DevOps](../../topics/autodevops/_index.md) can automaticall
 test, and deploy your application without a manually configured `.gitlab-ci.yml` file.
 
 GitLab CI/CD configuration can be organized into templates that are reusable across projects.
-GitLab also provides pre-built [templates](../examples/index.md#cicd-templates)
+GitLab also provides pre-built [templates](../examples/_index.md#cicd-templates)
 that help you get started quickly and avoid re-inventing the wheel.
 
 ### Configuration
@@ -389,7 +389,7 @@ In both GitLab and Bamboo, jobs in the same stage run in parallel, except where
 that needs to be met before a job runs.
 
 The number of jobs that can run in Bamboo depends on availability of Bamboo agents
-and Bamboo license Size. With [GitLab CI/CD](../jobs/index.md), the number of parallel
+and Bamboo license Size. With [GitLab CI/CD](../jobs/_index.md), the number of parallel
 jobs depends on the number of runners integrated with the GitLab instance and the
 concurrency set in the runners.
 
@@ -441,7 +441,7 @@ job2:
 ```
 
 With GitLab, you can use [CI/CD templates](https://gitlab.com/gitlab-org/gitlab-foss/tree/master/lib/gitlab/ci/templates)
-and [CI/CD components](../components/index.md) to compose your pipelines without the need to write
+and [CI/CD components](../components/_index.md) to compose your pipelines without the need to write
 everything yourself.
 
 #### Conditionals
@@ -588,7 +588,7 @@ In Bamboo, [Git caches](https://confluence.atlassian.com/bamkb/how-stored-git-ca
 can be used to speed up builds. Git caches are configured in Bamboo administration settings
 and are stored either on the Bamboo server or remote agents.
 
-GitLab supports both Git Caches and Job cache. [Caches](../caching/index.md) are defined per job
+GitLab supports both Git Caches and Job cache. [Caches](../caching/_index.md) are defined per job
 using the `cache` keyword.
 
 For example, in a GitLab CI/CD `.gitlab-ci.yml` file:
@@ -643,7 +643,7 @@ Production:
     - ./.ci/deploy_prod.sh
 ```
 
-In GitLab CI/CD, You can create a [deployment job](../jobs/index.md#deployment-jobs)
+In GitLab CI/CD, You can create a [deployment job](../jobs/_index.md#deployment-jobs)
 that deploys to an [environment](../environments/_index.md) or creates a [release](../../user/project/releases/index.md).
 
 For example, in a GitLab CI/CD `.gitlab-ci.yml` file:
@@ -752,14 +752,14 @@ the following questions in preparation:
 Before doing any migration work, you should first:
 
 1. Get familiar with GitLab.
-   - Read about the [key GitLab CI/CD features](../index.md).
-   - Follow tutorials to create [your first GitLab pipeline](../quick_start/index.md)
+   - Read about the [key GitLab CI/CD features](../_index.md).
+   - Follow tutorials to create [your first GitLab pipeline](../quick_start/_index.md)
      and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploy
      a static site.
    - Review the [CI/CD YAML syntax reference](../yaml/_index.md).
 1. Set up and configure GitLab.
 1. Test your GitLab instance.
-   - Ensure [runners](../runners/index.md) are available, either by using shared GitLab.com runners or installing new runners.
+   - Ensure [runners](../runners/_index.md) are available, either by using shared GitLab.com runners or installing new runners.
 
 #### Migration Steps
 
@@ -770,7 +770,7 @@ Before doing any migration work, you should first:
 1. Create a `.gitlab-ci.yml` file in each project.
 1. Export your Bamboo Projects/Plans as YAML Spec
 1. Migrate Bamboo YAML Spec configuration to GitLab CI/CD jobs and configure them to show results directly in merge requests.
-1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/index.md),
+1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/_index.md),
    [environments](../environments/_index.md), and the [GitLab agent for Kubernetes](../../user/clusters/agent/_index.md).
 1. Check if any CI/CD configuration can be reused across different projects, then create
    and share CI/CD templates.
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index 909e8b7ea507b9699643862fcb6aba92b95ae7d0..9ad8506f0535d011ff6eecb5ee4f191ed71e3e60 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -9,12 +9,12 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-If you are currently using CircleCI, you can migrate your CI/CD pipelines to [GitLab CI/CD](../index.md),
+If you are currently using CircleCI, you can migrate your CI/CD pipelines to [GitLab CI/CD](../_index.md),
 and start making use of all its powerful features.
 
 We have collected several resources that you may find useful before starting to migrate.
 
-The [Quick Start Guide](../quick_start/index.md) is a good overview of how GitLab CI/CD works. You may also be interested in [Auto DevOps](../../topics/autodevops/_index.md) which can be used to build, test, and deploy your applications with little to no configuration needed at all.
+The [Quick Start Guide](../quick_start/_index.md) is a good overview of how GitLab CI/CD works. You may also be interested in [Auto DevOps](../../topics/autodevops/_index.md) which can be used to build, test, and deploy your applications with little to no configuration needed at all.
 
 For advanced CI/CD teams, [custom project templates](../../administration/custom_project_templates.md) can enable the reuse of pipeline configurations.
 
@@ -26,7 +26,7 @@ CircleCI's `config.yml` configuration file defines scripts, jobs, and workflows
 
 ### Jobs
 
-In CircleCI, jobs are a collection of steps to perform a specific task. In GitLab, [jobs](../jobs/index.md) are also a fundamental element in the configuration file. The `checkout` keyword is not necessary in GitLab CI/CD as the repository is automatically fetched.
+In CircleCI, jobs are a collection of steps to perform a specific task. In GitLab, [jobs](../jobs/_index.md) are also a fundamental element in the configuration file. The `checkout` keyword is not necessary in GitLab CI/CD as the repository is automatically fetched.
 
 CircleCI example job definition:
 
@@ -228,7 +228,7 @@ deploy:
 
 ### Caching
 
-GitLab provides a caching mechanism to speed up build times for your jobs by reusing previously downloaded dependencies. It's important to know the different between [cache and artifacts](../caching/index.md#how-cache-is-different-from-artifacts) to make the best use of these features.
+GitLab provides a caching mechanism to speed up build times for your jobs by reusing previously downloaded dependencies. It's important to know the different between [cache and artifacts](../caching/_index.md#how-cache-is-different-from-artifacts) to make the best use of these features.
 
 CircleCI example of a job using a cache:
 
diff --git a/doc/ci/migration/github_actions.md b/doc/ci/migration/github_actions.md
index 1d3645c6b59dd4f122b6d99fb1e112019207c4fb..be38915c8eb0262fc1d867cce4c2e9dce90521d0 100644
--- a/doc/ci/migration/github_actions.md
+++ b/doc/ci/migration/github_actions.md
@@ -463,7 +463,7 @@ deploy_staging:
 #### Runners
 
 Runners are the services that execute jobs. If you are using GitLab.com, you can use the
-[instance runner fleet](../runners/index.md) to run jobs without provisioning your own self-managed runners.
+[instance runner fleet](../runners/_index.md) to run jobs without provisioning your own self-managed runners.
 
 Some key details about runners:
 
@@ -561,7 +561,7 @@ use_cat:
 
 #### Caching
 
-A [cache](../caching/index.md) is created when a job downloads one or more files and
+A [cache](../caching/_index.md) is created when a job downloads one or more files and
 saves them for faster access in the future. Subsequent jobs that use the same cache don't have to download the files again,
 so they execute more quickly. The cache is stored on the runner and uploaded to S3 if
 [distributed cache is enabled](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching).
@@ -674,12 +674,12 @@ Before starting a migration you should create a [migration plan](plan_a_migratio
 Before doing any migration work, you should first:
 
 1. Get familiar with GitLab.
-   - Read about the [key GitLab CI/CD features](../index.md).
-   - Follow tutorials to create [your first GitLab pipeline](../quick_start/index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
+   - Read about the [key GitLab CI/CD features](../_index.md).
+   - Follow tutorials to create [your first GitLab pipeline](../quick_start/_index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
    - Review the [CI/CD YAML syntax reference](../yaml/_index.md).
 1. Set up and configure GitLab.
 1. Test your GitLab instance.
-   - Ensure [runners](../runners/index.md) are available, either by using shared GitLab.com runners or installing new runners.
+   - Ensure [runners](../runners/_index.md) are available, either by using shared GitLab.com runners or installing new runners.
 
 ### Migration Steps
 
@@ -689,7 +689,7 @@ Before doing any migration work, you should first:
    - You can [import repositories by URL](../../user/project/import/repo_by_url.md).
 1. Create a `.gitlab-ci.yml` in each project.
 1. Migrate GitHub Actions jobs to GitLab CI/CD jobs and configure them to show results directly in merge requests.
-1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/index.md),
+1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/_index.md),
    [environments](../environments/_index.md), and the [GitLab agent for Kubernetes](../../user/clusters/agent/_index.md).
 1. Check if any CI/CD configuration can be reused across different projects, then create
    and share [CI/CD templates](../../development/cicd/templates.md)
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index f992c46174bfd3f339581dd2849997bbf41bb8a2..d284a60d69f4cdf5deca98190ea6e56240e204f3 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -477,11 +477,11 @@ deploy_staging:
 #### Runners
 
 Like Jenkins agents, GitLab runners are the hosts that run jobs. If you are using GitLab.com,
-you can use the [instance runner fleet](../runners/index.md) to run jobs without provisioning
+you can use the [instance runner fleet](../runners/_index.md) to run jobs without provisioning
 your own runners.
 
 To convert a Jenkins agent for use with GitLab CI/CD, uninstall the agent and then
-[install and register a runner](../runners/index.md). Runners do not require much overhead,
+[install and register a runner](../runners/_index.md). Runners do not require much overhead,
 so you might be able to use similar provisioning as the Jenkins agents you were using.
 
 Some key details about runners:
@@ -596,7 +596,7 @@ use_cat:
 
 #### Caching
 
-A [cache](../caching/index.md) is created when a job downloads one or more files and
+A [cache](../caching/_index.md) is created when a job downloads one or more files and
 saves them for faster access in the future. Subsequent jobs that use the same cache don't have to download the files again,
 so they execute more quickly. The cache is stored on the runner and uploaded to S3 if
 [distributed cache is enabled](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching).
@@ -629,7 +629,7 @@ in GitLab with keywords and features that offer similar functionality. For examp
 | [Mailer](https://plugins.jenkins.io/mailer/)                                      | [Notification emails](../../user/profile/notifications.md) |
 | [Parameterized Trigger Plugin](https://plugins.jenkins.io/parameterized-trigger/) | [`trigger` keyword](../yaml/_index.md#trigger) and [downstream pipelines](../pipelines/downstream_pipelines.md) |
 | [Role-based Authorization Strategy](https://plugins.jenkins.io/role-strategy/)    | GitLab [permissions and roles](../../user/permissions.md) |
-| [Timestamper](https://plugins.jenkins.io/timestamper/)                            | [Job](../jobs/index.md) logs are time stamped by default |
+| [Timestamper](https://plugins.jenkins.io/timestamper/)                            | [Job](../jobs/_index.md) logs are time stamped by default |
 
 ### Security Scanning features
 
@@ -704,12 +704,12 @@ Before starting a migration you should create a [migration plan](plan_a_migratio
 Before doing any migration work, you should first:
 
 1. Get familiar with GitLab.
-   - Read about the [key GitLab CI/CD features](../index.md).
-   - Follow tutorials to create [your first GitLab pipeline](../quick_start/index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
+   - Read about the [key GitLab CI/CD features](../_index.md).
+   - Follow tutorials to create [your first GitLab pipeline](../quick_start/_index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
    - Review the [CI/CD YAML syntax reference](../yaml/_index.md).
 1. Set up and configure GitLab.
 1. Test your GitLab instance.
-   - Ensure [runners](../runners/index.md) are available, either by using shared GitLab.com runners or installing new runners.
+   - Ensure [runners](../runners/_index.md) are available, either by using shared GitLab.com runners or installing new runners.
 
 ### Migration Steps
 
@@ -719,7 +719,7 @@ Before doing any migration work, you should first:
    - You can [import repositories by URL](../../user/project/import/repo_by_url.md).
 1. Create a `.gitlab-ci.yml` file in each project.
 1. Migrate Jenkins configuration to GitLab CI/CD jobs and configure them to show results directly in merge requests.
-1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/index.md),
+1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/_index.md),
    [environments](../environments/_index.md), and the [GitLab agent for Kubernetes](../../user/clusters/agent/_index.md).
 1. Check if any CI/CD configuration can be reused across different projects, then create
    and share CI/CD templates.
diff --git a/doc/ci/migration/teamcity.md b/doc/ci/migration/teamcity.md
index 0389e5851ac5b5cefcf4bf1f7784b36b524e3713..f73d6b198ac2f360ad7fe0fdadf526e642711eff 100644
--- a/doc/ci/migration/teamcity.md
+++ b/doc/ci/migration/teamcity.md
@@ -22,7 +22,7 @@ GitLab CI/CD and TeamCity are CI/CD tools with some similarities. Both GitLab an
 Additionally, there are some important differences between the two:
 
 - GitLab CI/CD pipelines are configured in a YAML format configuration file, which
-  you can edit manually or with the [pipeline editor](../pipeline_editor/index.md).
+  you can edit manually or with the [pipeline editor](../pipeline_editor/_index.md).
   TeamCity pipelines can be configured from the UI or using Kotlin DSL.
 - GitLab is a DevSecOps platform with built-in SCM, container registry, security scanning, and more.
   TeamCity requires separate solutions for these capabilities, usually provided by integrations.
@@ -141,7 +141,7 @@ run_unit_tests:
 [TeamCity Triggers](https://www.jetbrains.com/help/teamcity/configuring-build-triggers.html) define conditions that initiate a build, including VCS changes,
 scheduled triggers, or builds triggered by other builds.
 
-In GitLab CI/CD, pipelines can be triggered automatically for various events, like changes to branches or merge requests and new tags. Pipelines can also be triggered manually, using an [API](../triggers/index.md), or with [scheduled pipelines](../pipelines/schedules.md). For more information, see [CI/CD pipelines](../pipelines/index.md).
+In GitLab CI/CD, pipelines can be triggered automatically for various events, like changes to branches or merge requests and new tags. Pipelines can also be triggered manually, using an [API](../triggers/_index.md), or with [scheduled pipelines](../pipelines/schedules.md). For more information, see [CI/CD pipelines](../pipelines/_index.md).
 
 ### Variables
 
@@ -215,7 +215,7 @@ use_cat:
 The equivalent of [TeamCity agents](https://www.jetbrains.com/help/teamcity/build-agent.html) in GitLab are Runners.
 
 In GitLab CI/CD, runners are the services that execute jobs. If you are using GitLab.com, you can use the
-[instance runner fleet](../runners/index.md) to run jobs without provisioning your own self-managed runners.
+[instance runner fleet](../runners/_index.md) to run jobs without provisioning your own self-managed runners.
 
 Some key details about runners:
 
@@ -264,12 +264,12 @@ For a migration from TeamCity, ask yourself the following questions in preparati
 Before doing any migration work, you should first:
 
 1. Get familiar with GitLab.
-   - Read about the [key GitLab CI/CD features](../index.md).
-   - Follow tutorials to create [your first GitLab pipeline](../quick_start/index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
+   - Read about the [key GitLab CI/CD features](../_index.md).
+   - Follow tutorials to create [your first GitLab pipeline](../quick_start/_index.md) and [more complex pipelines](../quick_start/tutorial.md) that build, test, and deploys a static site.
    - Review the [CI/CD YAML syntax reference](../yaml/_index.md).
 1. Set up and configure GitLab.
 1. Test your GitLab instance.
-   - Ensure [runners](../runners/index.md) are available, either by using shared GitLab.com runners or installing new runners.
+   - Ensure [runners](../runners/_index.md) are available, either by using shared GitLab.com runners or installing new runners.
 
 ### Migration steps
 
@@ -279,10 +279,10 @@ Before doing any migration work, you should first:
    - You can [import repositories by URL](../../user/project/import/repo_by_url.md).
 1. Create a `.gitlab-ci.yml` file in each project.
 1. Migrate TeamCity configuration to GitLab CI/CD jobs and configure them to show results directly in merge requests.
-1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/index.md),
+1. Migrate deployment jobs by using [cloud deployment templates](../cloud_deployment/_index.md),
    [environments](../environments/_index.md), and the [GitLab agent for Kubernetes](../../user/clusters/agent/_index.md).
 1. Check if any CI/CD configuration can be reused across different projects, then create
-   and share [CI/CD templates](../examples/index.md#cicd-templates) or [CI/CD components](../components/index.md).
+   and share [CI/CD templates](../examples/_index.md#cicd-templates) or [CI/CD components](../components/_index.md).
 1. See [pipeline efficiency](../pipelines/pipeline_efficiency.md)
    to learn how to make your GitLab CI/CD pipelines faster and more efficient.
 
diff --git a/doc/ci/mobile_devops/index.md b/doc/ci/mobile_devops/_index.md
similarity index 93%
rename from doc/ci/mobile_devops/index.md
rename to doc/ci/mobile_devops/_index.md
index 8b505f19f7e343fd45c38e5a5b6a7abd351b303f..5512caf3fbd63cce082e91fdf610a2736334af61 100644
--- a/doc/ci/mobile_devops/index.md
+++ b/doc/ci/mobile_devops/_index.md
@@ -20,7 +20,7 @@ GitLab Mobile DevOps integrates key mobile development capabilities into the Git
 
 ## Build environments
 
-For complete control over the build environment, you can use [GitLab-hosted runners](../runners/index.md),
+For complete control over the build environment, you can use [GitLab-hosted runners](../runners/_index.md),
 or set up [self-managed runners](https://docs.gitlab.com/runner/#use-self-managed-runners).
 
 ## Code signing
@@ -29,7 +29,7 @@ All Android and iOS apps must be securely signed before being distributed throug
 the various app stores. Signing ensures that applications haven't been tampered with
 before reaching a user's device.
 
-With [project-level secure files](../secure_files/index.md), you can store the following
+With [project-level secure files](../secure_files/_index.md), you can store the following
 in GitLab, so that they can be used to securely sign apps in CI/CD builds:
 
 - Keystores
diff --git a/doc/ci/mobile_devops/mobile_devops_tutorial_android.md b/doc/ci/mobile_devops/mobile_devops_tutorial_android.md
index 6c6bda4dc7b84eccc24f71208926073a68eb54c2..9e105861f94c771e12400ba0d73e8a2e47c90820 100644
--- a/doc/ci/mobile_devops/mobile_devops_tutorial_android.md
+++ b/doc/ci/mobile_devops/mobile_devops_tutorial_android.md
@@ -25,7 +25,7 @@ Before you start this tutorial, make sure you have:
 
 ## Set up your build environment
 
-Use [GitLab-hosted runners](../runners/index.md),
+Use [GitLab-hosted runners](../runners/_index.md),
 or set up [self-managed runners](https://docs.gitlab.com/runner/#use-self-managed-runners)
 for complete control over the build environment.
 
@@ -64,7 +64,7 @@ To set up code signing for Android:
       storePassword=password
       ```
 
-   1. Upload both files as [Secure Files](../secure_files/index.md) in your project settings.
+   1. Upload both files as [Secure Files](../secure_files/_index.md) in your project settings.
    1. Add both files to your `.gitignore` file so they aren't committed to version control.
 1. Configure Gradle to use the newly created keystore. In the app's `build.gradle` file:
 
diff --git a/doc/ci/mobile_devops/mobile_devops_tutorial_ios.md b/doc/ci/mobile_devops/mobile_devops_tutorial_ios.md
index a186f5dc19d502f3b8b4c395db4c7177306719f7..4ad4d9a835e0a1c8977f4d771bb3828dd44d2dd4 100644
--- a/doc/ci/mobile_devops/mobile_devops_tutorial_ios.md
+++ b/doc/ci/mobile_devops/mobile_devops_tutorial_ios.md
@@ -25,7 +25,7 @@ Before you start this tutorial, make sure you have:
 
 ## Set up your build environment
 
-Use [GitLab-hosted runners](../runners/index.md),
+Use [GitLab-hosted runners](../runners/_index.md),
 or set up [self-managed runners](https://docs.gitlab.com/runner/#use-self-managed-runners)
 for complete control over the build environment.
 
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/_index.md
similarity index 100%
rename from doc/ci/pipeline_editor/index.md
rename to doc/ci/pipeline_editor/_index.md
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/_index.md
similarity index 98%
rename from doc/ci/pipelines/index.md
rename to doc/ci/pipelines/_index.md
index 5efe45727cb996d3f9da03fc317d92f4d4bb6411..ecd5b30da1fa50bdc2095acfb3eb3c4f9b05be0d 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/_index.md
@@ -19,9 +19,9 @@ Pipelines are composed of:
 
 - [Global YAML keywords](../yaml/_index.md#global-keywords) that control the overall
   behavior of the project's pipelines.
-- [Jobs](../jobs/index.md) that execute commands to accomplish a task. For example,
+- [Jobs](../jobs/_index.md) that execute commands to accomplish a task. For example,
   a job could compile, test, or deploy code. Jobs run independently from each other,
-  and are executed by [runners](../runners/index.md).
+  and are executed by [runners](../runners/_index.md).
 - Stages, which define how to group jobs together. Stages run in sequence, while the jobs
   in a stage run in parallel. For example, an early stage could have jobs that lint and compile
   code, while later stages could have jobs that test and deploy code. If all jobs in a stage succeed,
@@ -36,7 +36,7 @@ A small pipeline could consist of three stages, executed in the following order:
 - A `deploy` stage, with a job called `deploy-to-production`. This job would only run
   if both jobs in the `test` stage started and completed successfully.
 
-To get started with your first pipeline, see [Create and run your first GitLab CI/CD pipeline](../quick_start/index.md).
+To get started with your first pipeline, see [Create and run your first GitLab CI/CD pipeline](../quick_start/_index.md).
 
 ## Types of pipelines
 
@@ -62,7 +62,7 @@ Pipelines can be configured in many different ways:
 
 Pipelines and their component jobs and stages are defined with [YAML keywords](../yaml/_index.md)
 in the CI/CD pipeline configuration file for each project. When editing CI/CD configuration
-in GitLab, you should use the [pipeline editor](../pipeline_editor/index.md).
+in GitLab, you should use the [pipeline editor](../pipeline_editor/_index.md).
 
 You can also configure specific aspects of your pipelines through the GitLab UI:
 
@@ -273,7 +273,7 @@ DETAILS:
 
 WARNING:
 This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/501460) in GitLab 17.6
-and is planned for removal in 19.0. Use [CI/CD jobs with pipeline trigger tokens](../triggers/index.md#use-a-cicd-job) instead.
+and is planned for removal in 19.0. Use [CI/CD jobs with pipeline trigger tokens](../triggers/_index.md#use-a-cicd-job) instead.
 This is a breaking change.
 
 You can set up your project to automatically trigger a pipeline based on tags in a different project.
@@ -466,7 +466,7 @@ GitLab provides API endpoints to:
 - Perform basic functions. For more information, see [Pipelines API](../../api/pipelines.md).
 - Maintain pipeline schedules. For more information, see [Pipeline schedules API](../../api/pipeline_schedules.md).
 - Trigger pipeline runs. For more information, see:
-  - [Triggering pipelines through the API](../triggers/index.md).
+  - [Triggering pipelines through the API](../triggers/_index.md).
   - [Pipeline triggers API](../../api/pipeline_triggers.md).
 
 ## Ref specs for runners
diff --git a/doc/ci/pipelines/compute_minutes.md b/doc/ci/pipelines/compute_minutes.md
index 9e405dbac216d71e05a5a94cc324fb58b59346ef..8fc844bc5b2581eea56d61498e83bc51b3b6cdd3 100644
--- a/doc/ci/pipelines/compute_minutes.md
+++ b/doc/ci/pipelines/compute_minutes.md
@@ -207,7 +207,7 @@ use to reduce your usage:
 - If you are using project mirrors, ensure that [pipelines for mirror updates](../../user/project/repository/mirror/pull.md#trigger-pipelines-for-mirror-updates)
   is disabled.
 - Reduce the frequency of [scheduled pipelines](schedules.md).
-- [Skip pipelines](index.md#skip-a-pipeline) when not needed.
+- [Skip pipelines](_index.md#skip-a-pipeline) when not needed.
 - Use [interruptible](../yaml/_index.md#interruptible) jobs which can be auto-canceled
   if a new pipeline starts.
 - If a job doesn't have to run in every pipeline, use [`rules`](../jobs/job_control.md)
diff --git a/doc/ci/pipelines/downstream_pipelines.md b/doc/ci/pipelines/downstream_pipelines.md
index 553729448b631218eee8e534c42a88cba1784c35..af37b109c5367e2dd02cc295fe4071942093095c 100644
--- a/doc/ci/pipelines/downstream_pipelines.md
+++ b/doc/ci/pipelines/downstream_pipelines.md
@@ -312,7 +312,7 @@ trigger_pipeline:
 
 ## View a downstream pipeline
 
-In the [pipeline details page](index.md#pipeline-details), downstream pipelines display
+In the [pipeline details page](_index.md#pipeline-details), downstream pipelines display
 as a list of cards on the right of the graph. From this view, you can:
 
 - Select a trigger job to see the triggered downstream pipeline's jobs.
@@ -436,9 +436,9 @@ trigger_job:
 > - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/422282) from GitLab Premium to GitLab Free in 16.8.
 
 After you trigger a multi-project pipeline, the downstream pipeline displays
-to the right of the [pipeline graph](index.md#view-pipelines).
+to the right of the [pipeline graph](_index.md#view-pipelines).
 
-In [pipeline mini graphs](index.md#pipeline-mini-graphs), the downstream pipeline
+In [pipeline mini graphs](_index.md#pipeline-mini-graphs), the downstream pipeline
 displays to the right of the mini graph.
 
 ## Fetch artifacts from an upstream pipeline
diff --git a/doc/ci/pipelines/downstream_pipelines_troubleshooting.md b/doc/ci/pipelines/downstream_pipelines_troubleshooting.md
index 91750687b73874a7c65330c12533c37634c322a2..70df2d50e44c5d4c87f7888be6bad5c229c985b0 100644
--- a/doc/ci/pipelines/downstream_pipelines_troubleshooting.md
+++ b/doc/ci/pipelines/downstream_pipelines_troubleshooting.md
@@ -13,7 +13,7 @@ With multi-project pipelines, the trigger job fails and does not create the down
 - The user that creates the upstream pipeline does not have [permission](../../user/permissions.md)
   to create pipelines in the downstream project.
 - The downstream pipeline targets a protected branch and the user does not have permission
-  to run pipelines against the protected branch. See [pipeline security for protected branches](index.md#pipeline-security-on-protected-branches)
+  to run pipelines against the protected branch. See [pipeline security for protected branches](_index.md#pipeline-security-on-protected-branches)
   for more information.
 
 To identify which user is having permission issues in the downstream project, you can check the trigger job using the following command in the [Rails console](../../administration/operations/rails_console.md) and look at the `user_id` attribute.
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
index 00450d69c1aed557a6d884a9c1492a83cc913cde..b12c3ab9d32acd68620d7e734b6a00403aa15741 100644
--- a/doc/ci/pipelines/merge_request_pipelines.md
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -38,7 +38,7 @@ To use merge request pipelines:
   [configured with jobs that run in merge request pipelines](#add-jobs-to-merge-request-pipelines).
 - You must have at least the Developer role for the
   source project to run a merge request pipeline.
-- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/index.md).
+- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/_index.md).
 
 ## Add jobs to merge request pipelines
 
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index af13f8819f4785b50bf6020605f6a5e26e050d97..cf92c841c078928437697a830ae21d89aa67f87c 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -93,7 +93,7 @@ are canceled.
 Prerequisites:
 
 - You must have the Maintainer role.
-- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/index.md).
+- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/_index.md).
 - Your pipeline must be [configured to use merge request pipelines](merge_request_pipelines.md#prerequisites).
   Otherwise your merge requests may become stuck in an unresolved state or your pipelines
   might be dropped.
diff --git a/doc/ci/pipelines/merged_results_pipelines.md b/doc/ci/pipelines/merged_results_pipelines.md
index c01c2fcda3ad5f3eca53a53cd17c4184d67e1766..f12025acbe7e594f898ea7af858967b45a8b3223 100644
--- a/doc/ci/pipelines/merged_results_pipelines.md
+++ b/doc/ci/pipelines/merged_results_pipelines.md
@@ -34,7 +34,7 @@ To use merged results pipelines:
 - Your project's `.gitlab-ci.yml` file must be configured to
   [run jobs in merge request pipelines](merge_request_pipelines.md#prerequisites).
 - Your repository must be a GitLab repository, not an
-  [external repository](../ci_cd_for_external_repos/index.md).
+  [external repository](../ci_cd_for_external_repos/_index.md).
 
 ## Enable merged results pipelines
 
diff --git a/doc/ci/pipelines/mr_pipeline_troubleshooting.md b/doc/ci/pipelines/mr_pipeline_troubleshooting.md
index 65c5802bd3cf1e00cf8f97a9cf6884204e6dfb5f..0cc9321f1137242c00e46d62ace6205907baaec8 100644
--- a/doc/ci/pipelines/mr_pipeline_troubleshooting.md
+++ b/doc/ci/pipelines/mr_pipeline_troubleshooting.md
@@ -29,7 +29,7 @@ the other is a failed merge request pipeline.
 When the configuration syntax is fixed, no further failed pipelines should appear.
 To find and fix the configuration problem, you can use:
 
-- The [pipeline editor](../pipeline_editor/index.md).
+- The [pipeline editor](../pipeline_editor/_index.md).
 - The [CI lint tool](../yaml/lint.md).
 
 ## The merge request's pipeline is marked as failed but the latest pipeline succeeded
@@ -86,7 +86,7 @@ This does not happen when a branch pipeline fails.
 If a merge request pipeline or a merged results pipeline was canceled or failed, you can:
 
 - Re-run the entire pipeline by selecting **Run pipeline** in the pipeline tab in the merge request.
-- [Retry only the jobs that failed](index.md#view-pipelines). If you re-run the entire pipeline, this is not necessary.
+- [Retry only the jobs that failed](_index.md#view-pipelines). If you re-run the entire pipeline, this is not necessary.
 - Push a new commit to fix the failure.
 
 If the merge train pipeline has failed, you can:
diff --git a/doc/ci/pipelines/pipeline_efficiency.md b/doc/ci/pipelines/pipeline_efficiency.md
index 70225ec65fe80249b96e9b97cb8e5e5b5be2cb27..9fc77409c0d4defb4b5e36aef7ba3946b91be77e 100644
--- a/doc/ci/pipelines/pipeline_efficiency.md
+++ b/doc/ci/pipelines/pipeline_efficiency.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-[CI/CD Pipelines](index.md) are the fundamental building blocks for [GitLab CI/CD](../index.md).
+[CI/CD Pipelines](_index.md) are the fundamental building blocks for [GitLab CI/CD](../_index.md).
 Making pipelines more efficient helps you save developer time, which:
 
 - Speeds up your DevOps processes
@@ -21,8 +21,8 @@ and improve their configuration over time through trial and error. A better proc
 to use pipeline features that improve efficiency right away, and get a faster software
 development lifecycle earlier.
 
-First ensure you are familiar with [GitLab CI/CD fundamentals](../index.md)
-and understand the [quick start guide](../quick_start/index.md).
+First ensure you are familiar with [GitLab CI/CD fundamentals](../_index.md)
+and understand the [quick start guide](../quick_start/_index.md).
 
 ## Identify bottlenecks and common failures
 
@@ -36,7 +36,7 @@ heavily influenced by the:
 - The ["critical path"](#needs-dependency-visualization), which represents
   the minimum and maximum pipeline duration.
 
-Additional points to pay attention relate to [GitLab Runners](../runners/index.md):
+Additional points to pay attention relate to [GitLab Runners](../runners/_index.md):
 
 - Availability of the runners and the resources they are provisioned with.
 - Build dependencies, their installation time, and storage space requirements.
@@ -65,7 +65,7 @@ It's important to understand and document the pipeline workflows, and discuss po
 actions and changes. Refactoring pipelines may need careful interaction between teams
 in the DevSecOps lifecycle.
 
-Pipeline analysis can help identify issues with cost efficiency. For example, [runners](../runners/index.md)
+Pipeline analysis can help identify issues with cost efficiency. For example, [runners](../runners/_index.md)
 hosted with a paid cloud service may be provisioned with:
 
 - More resources than needed for CI/CD pipelines, wasting money.
@@ -73,7 +73,7 @@ hosted with a paid cloud service may be provisioned with:
 
 ### Pipeline Insights
 
-The [Pipeline success and duration charts](index.md#pipeline-success-and-duration-charts)
+The [Pipeline success and duration charts](_index.md#pipeline-success-and-duration-charts)
 give information about pipeline runtime and failed job counts.
 
 Tests like [unit tests](../testing/unit_test_reports.md), integration tests, end-to-end tests,
@@ -90,13 +90,13 @@ provide an example of a complex testing strategy with many components involved.
 
 ### `needs` dependency visualization
 
-Viewing the `needs` dependencies in the [full pipeline graph](../pipelines/index.md#group-jobs-by-stage-or-needs-configuration)
+Viewing the `needs` dependencies in the [full pipeline graph](../pipelines/_index.md#group-jobs-by-stage-or-needs-configuration)
 can help analyze the critical path in the pipeline and understand possible blockers.
 
 ### Pipeline Monitoring
 
 Global pipeline health is a key indicator to monitor along with job and pipeline duration.
-[CI/CD analytics](index.md#pipeline-success-and-duration-charts) give a visual
+[CI/CD analytics](_index.md#pipeline-success-and-duration-charts) give a visual
 representation of pipeline health.
 
 Instance administrators have access to additional [performance metrics and self-monitoring](../../administration/monitoring/_index.md).
@@ -193,8 +193,8 @@ be more efficient, but can also make pipelines harder to understand and analyze.
 
 ### Caching
 
-Another optimization method is to [cache](../caching/index.md) dependencies. If your
-dependencies change rarely, like [NodeJS `/node_modules`](../caching/index.md#cache-nodejs-dependencies),
+Another optimization method is to [cache](../caching/_index.md) dependencies. If your
+dependencies change rarely, like [NodeJS `/node_modules`](../caching/_index.md#cache-nodejs-dependencies),
 caching can make pipeline execution much faster.
 
 You can use [`cache:when`](../yaml/_index.md#cachewhen) to cache downloaded dependencies
@@ -239,7 +239,7 @@ Methods to reduce Docker image size:
   to analyze and shrink images.
 
 To simplify Docker image management, you can create a dedicated group for managing
-[Docker images](../docker/index.md) and test, build and publish them with CI/CD pipelines.
+[Docker images](../docker/_index.md) and test, build and publish them with CI/CD pipelines.
 
 ## Test, document, and learn
 
diff --git a/doc/ci/pipelines/pipeline_security.md b/doc/ci/pipelines/pipeline_security.md
index 86ca40ad98177fcc9c6bfd2da817b2fa8278edd5..53a5d81086ce37e31ffdc42c7dc3c8675f1c0d4f 100644
--- a/doc/ci/pipelines/pipeline_security.md
+++ b/doc/ci/pipelines/pipeline_security.md
@@ -30,7 +30,7 @@ of the GitLab instance. There are a number of providers in this space, including
 [HashiCorp's Vault](https://www.vaultproject.io), [Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault),
 and [Google Cloud Secret Manager](https://cloud.google.com/security/products/secret-manager).
 
-You can use the GitLab native integrations for certain [external secret management providers](../secrets/index.md) to retrieve those secrets in CI/CD pipelines when they are needed.
+You can use the GitLab native integrations for certain [external secret management providers](../secrets/_index.md) to retrieve those secrets in CI/CD pipelines when they are needed.
 
 ### CI/CD variables
 
diff --git a/doc/ci/pipelines/schedules.md b/doc/ci/pipelines/schedules.md
index 2bf8b1bdc5dec8184d38afc0ca7b533eaf2d6a30..17872df6c9086d4a0276ecc235da8fa777172482 100644
--- a/doc/ci/pipelines/schedules.md
+++ b/doc/ci/pipelines/schedules.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-Use scheduled pipelines to run GitLab CI/CD [pipelines](index.md) at regular intervals.
+Use scheduled pipelines to run GitLab CI/CD [pipelines](_index.md) at regular intervals.
 
 ## Prerequisites
 
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 28e6dbf9f114f85f5f8622bad435660351363980..1b5d5ebec8171549c146045bedc6e562a3948074 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -144,7 +144,7 @@ To customize the path:
 1. Select **Save changes**.
 
 NOTE:
-You cannot use your project's [pipeline editor](../pipeline_editor/index.md) to
+You cannot use your project's [pipeline editor](../pipeline_editor/_index.md) to
 edit CI/CD configuration files in other projects or on an external site.
 
 ### Custom CI/CD configuration file examples
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/_index.md
similarity index 97%
rename from doc/ci/quick_start/index.md
rename to doc/ci/quick_start/_index.md
index 5e19706ed21e0b5ca0fe51b8c14f555b2a2dc643..0a1fbb952f5392a0efee4cb906bca7b3b5292af7 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/_index.md
@@ -11,7 +11,7 @@ DETAILS:
 
 This tutorial shows you how to configure and run your first CI/CD pipeline in GitLab.
 
-If you are already familiar with [basic CI/CD concepts](../index.md), you can learn about
+If you are already familiar with [basic CI/CD concepts](../_index.md), you can learn about
 common keywords in [Tutorial: Create a complex pipeline](tutorial.md).
 
 ## Prerequisites
@@ -144,7 +144,7 @@ Here are some tips to get started working with the `.gitlab-ci.yml` file.
 
 For the complete `.gitlab-ci.yml` syntax, see the full [CI/CD YAML syntax reference](../yaml/_index.md).
 
-- Use the [pipeline editor](../pipeline_editor/index.md) to edit your `.gitlab-ci.yml` file.
+- Use the [pipeline editor](../pipeline_editor/_index.md) to edit your `.gitlab-ci.yml` file.
 - Each job contains a script section and belongs to a stage:
   - [`stage`](../yaml/_index.md#stage) describes the sequential execution of jobs.
     If there are runners available, jobs in a single stage run in parallel.
diff --git a/doc/ci/quick_start/tutorial.md b/doc/ci/quick_start/tutorial.md
index ec837667bd0842f820ba93017c21f4553dc7df9b..6ce65f9181d788aba3ceba2395764f7324ec687f 100644
--- a/doc/ci/quick_start/tutorial.md
+++ b/doc/ci/quick_start/tutorial.md
@@ -95,8 +95,8 @@ in the project and runners are available to run jobs.
 
 This step introduces:
 
-- [Jobs](../jobs/index.md): These are self-contained parts of a pipeline that run your commands.
-  Jobs run on [runners](../runners/index.md), separate from the GitLab instance.
+- [Jobs](../jobs/_index.md): These are self-contained parts of a pipeline that run your commands.
+  Jobs run on [runners](../runners/_index.md), separate from the GitLab instance.
 - [`script`](../yaml/_index.md#script): This section of a job's configuration is
   where you define the commands for jobs. If there are multiple commands (in an array),
   they run in order. Each command executes as if it was run as a CLI command.
@@ -119,7 +119,7 @@ Commit and push this change to GitLab, then:
    followed by the date.
 
 Now that you have a `.gitlab-ci.yml` file in your project, you can make all future changes
-to pipeline configuration with the [pipeline editor](../pipeline_editor/index.md).
+to pipeline configuration with the [pipeline editor](../pipeline_editor/_index.md).
 
 ## Add a job to build the site
 
@@ -427,7 +427,7 @@ single sources of truth.
 
 This step introduces:
 
-- [Hidden jobs](../jobs/index.md#hide-a-job): Jobs that start with `.` are never
+- [Hidden jobs](../jobs/_index.md#hide-a-job): Jobs that start with `.` are never
   added to a pipeline. Use them to hold configuration you want to reuse.
 - [`extends`](../yaml/_index.md#extends): Use extends to repeat configuration in
   multiple places, often from hidden jobs. If you update the hidden job's configuration,
diff --git a/doc/ci/resource_groups/index.md b/doc/ci/resource_groups/_index.md
similarity index 99%
rename from doc/ci/resource_groups/index.md
rename to doc/ci/resource_groups/_index.md
index 44c009b7224f0151c8e23080e85676be916f8584..bb41b76463db1e8dfb25684c791e61d762190ffe 100644
--- a/doc/ci/resource_groups/index.md
+++ b/doc/ci/resource_groups/_index.md
@@ -59,7 +59,7 @@ can still run `build` jobs concurrently for maximizing the pipeline efficiency.
 
 ## Prerequisites
 
-- The basic knowledge of the [GitLab CI/CD pipelines](../pipelines/index.md)
+- The basic knowledge of the [GitLab CI/CD pipelines](../pipelines/_index.md)
 - The basic knowledge of the [GitLab Environments and Deployments](../environments/_index.md)
 - At least the Developer role for the project to configure CI/CD pipelines.
 
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/_index.md
similarity index 100%
rename from doc/ci/review_apps/index.md
rename to doc/ci/review_apps/_index.md
diff --git a/doc/ci/runners/index.md b/doc/ci/runners/_index.md
similarity index 97%
rename from doc/ci/runners/index.md
rename to doc/ci/runners/_index.md
index 955b9ed869ae86fc892467a113a923b9ead203b3..ce3378c6e6b035d2471465f4a722cca6ef0f210c 100644
--- a/doc/ci/runners/index.md
+++ b/doc/ci/runners/_index.md
@@ -36,7 +36,7 @@ The assigned runner receives the job details. The runner prepares the environmen
 
 When deciding on which runners you want to execute your CI/CD jobs, you can choose:
 
-- [GitLab-hosted runners](index.md) for GitLab.com or GitLab Dedicated users.
+- [GitLab-hosted runners](hosted_runners/_index.md) for GitLab.com or GitLab Dedicated users.
 - [Self-managed runners](https://docs.gitlab.com/runner/) for all GitLab installations.
 
 Runners can be group, project, or instance runners. GitLab-hosted runners are instance runners.
diff --git a/doc/ci/runners/hosted_runners/index.md b/doc/ci/runners/hosted_runners/_index.md
similarity index 99%
rename from doc/ci/runners/hosted_runners/index.md
rename to doc/ci/runners/hosted_runners/_index.md
index e2b23464b303c767c992d3dea212a328747f3e2d..d2925dbec3ff3e527f7ec04dec21685170ccaad0 100644
--- a/doc/ci/runners/hosted_runners/index.md
+++ b/doc/ci/runners/hosted_runners/_index.md
@@ -85,7 +85,7 @@ stored in a Google Cloud Storage (GCS) bucket. Cache contents not updated in the
 removed, based on the [object lifecycle management policy](https://cloud.google.com/storage/docs/lifecycle).
 The maximum size of an uploaded cache artifact can be 5 GB after the cache becomes a compressed archive.
 
-For more information about how caching works, see [Architecture diagram of hosted runners for GitLab.com](#architecture-diagram-of-hosted-runners-for-gitlabcom), and [Caching in GitLab CI/CD](../../caching/index.md).
+For more information about how caching works, see [Architecture diagram of hosted runners for GitLab.com](#architecture-diagram-of-hosted-runners-for-gitlabcom), and [Caching in GitLab CI/CD](../../caching/_index.md).
 
 ### Pricing of hosted runners for GitLab.com
 
diff --git a/doc/ci/runners/hosted_runners/macos.md b/doc/ci/runners/hosted_runners/macos.md
index c084689474d14287b43c466b7fe966079829de0f..3a63e1734d36b0f78aa29fd89a87cc841beba701 100644
--- a/doc/ci/runners/hosted_runners/macos.md
+++ b/doc/ci/runners/hosted_runners/macos.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com
 **Status:** Beta
 
-Hosted runners on macOS provide an on-demand macOS environment, fully integrated with GitLab [CI/CD](../../index.md).
+Hosted runners on macOS provide an on-demand macOS environment, fully integrated with GitLab [CI/CD](../../_index.md).
 You can use these runners to build, test, and deploy apps for the Apple ecosystem (macOS, iOS, watchOS, tvOS).
 Our [Mobile DevOps section](../../mobile_devops/mobile_devops_tutorial_ios.md#set-up-your-build-environment) provides features, documentation, and guidance on building and deploying mobile applications for iOS.
 
@@ -49,7 +49,7 @@ The images and installed components are updated with each GitLab release, to kee
 Major and minor releases of macOS and Xcode are made available in the milestone subsequent to the Apple release.
 
 A new major release image is initially made available as beta, and becomes generally available with the release of the first minor release.
-Because only two generally available images are supported at a time, the oldest image becomes deprecated and will be removed after three months according to the [supported image lifecycle](index.md#supported-image-lifecycle).
+Because only two generally available images are supported at a time, the oldest image becomes deprecated and will be removed after three months according to the [supported image lifecycle](_index.md#supported-image-lifecycle).
 
 When a new major release is generally available, it becomes the default image for all macOS jobs.
 
@@ -129,7 +129,7 @@ source 'https://cdn.cocoapods.org/'
 Use caching in Cocoapods packages in GitLab to only run `pod install`
 when pods change, which can improve build performance.
 
-To [configure caching](../../caching/index.md) for your project:
+To [configure caching](../../caching/_index.md) for your project:
 
 1. Add the `cache` configuration to your `.gitlab-ci.yml` file:
 
diff --git a/doc/ci/runners/runners_scope.md b/doc/ci/runners/runners_scope.md
index 7f36ce09031d91a8a74bafe1cfbe5bca11a9c1d3..e5c5f70d11dd815df1529acdac7179da5de3d849 100644
--- a/doc/ci/runners/runners_scope.md
+++ b/doc/ci/runners/runners_scope.md
@@ -31,7 +31,7 @@ If you are using GitLab Self-Managed, administrators can:
 
 If you are using GitLab.com:
 
-- You can select from a list of [instance runners that GitLab maintains](index.md).
+- You can select from a list of [instance runners that GitLab maintains](_index.md).
 - The instance runners consume the [compute minutes](../pipelines/compute_minutes.md)
   included with your account.
 
@@ -130,7 +130,7 @@ To delete a single or multiple instance runners:
 
 ### Enable instance runners for a project
 
-On GitLab.com, [instance runners](index.md) are enabled in all projects by
+On GitLab.com, [instance runners](_index.md) are enabled in all projects by
 default.
 
 On GitLab Self-Managed, an administrator can
diff --git a/doc/ci/secrets/index.md b/doc/ci/secrets/_index.md
similarity index 100%
rename from doc/ci/secrets/index.md
rename to doc/ci/secrets/_index.md
diff --git a/doc/ci/secrets/azure_key_vault.md b/doc/ci/secrets/azure_key_vault.md
index 0550de0c0b4a058c2d0e8dac1792d220444aead7..40d9a098b034a2560c2069b4e17ec8aabfdc6c6f 100644
--- a/doc/ci/secrets/azure_key_vault.md
+++ b/doc/ci/secrets/azure_key_vault.md
@@ -20,7 +20,7 @@ Prerequisites:
 - Have a [Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/quick-create-portal) on Azure.
   - Your IAM user must be [granted the **Key Vault Administrator** role assignment](https://learn.microsoft.com/en-us/azure/role-based-access-control/quickstart-assign-role-user-portal#grant-access)
     for the **resource group** assigned to the Key Vault. Otherwise, you can't create secrets inside the Key Vault.
-- [Configure OpenID Connect in Azure to retrieve temporary credentials](../cloud_services/azure/index.md). These
+- [Configure OpenID Connect in Azure to retrieve temporary credentials](../cloud_services/azure/_index.md). These
   steps include instructions on how to create an Azure AD application for Key Vault access.
 - Add [CI/CD variables to your project](../variables/_index.md#for-a-project) to provide details about your Vault server:
   - `AZURE_KEY_VAULT_SERVER_URL`: The URL of your Azure Key Vault server, such as `https://vault.example.com`.
@@ -47,7 +47,7 @@ job:
 
 In this example:
 
-- `aud` is the audience, which must match the audience used when [creating the federated identity credentials](../cloud_services/azure/index.md#create-azure-ad-federated-identity-credentials)
+- `aud` is the audience, which must match the audience used when [creating the federated identity credentials](../cloud_services/azure/_index.md#create-azure-ad-federated-identity-credentials)
 - `name` is the name of the secret in Azure Key Vault.
 - `version` is the version of the secret in Azure Key Vault. The version is a generated
   GUID without dashes, which can be found on the Azure Key Vault secrets page.
@@ -57,7 +57,7 @@ In this example:
 
 ## Troubleshooting
 
-Refer to [OIDC for Azure troubleshooting](../cloud_services/azure/index.md#troubleshooting) for general
+Refer to [OIDC for Azure troubleshooting](../cloud_services/azure/_index.md#troubleshooting) for general
 problems when setting up OIDC with Azure.
 
 ### `JWT token is invalid or malformed` message
diff --git a/doc/ci/secrets/gcp_secret_manager.md b/doc/ci/secrets/gcp_secret_manager.md
index a537cdcdc5b731ea8a9d4283cc2865950ed6a7a4..9c942a1684121a9906aeda3a795e34ae8e9bc96a 100644
--- a/doc/ci/secrets/gcp_secret_manager.md
+++ b/doc/ci/secrets/gcp_secret_manager.md
@@ -44,7 +44,7 @@ The principal is used to authorize access to the Secret Manager resources:
 1. Under **Attribute Mapping**, create the following mappings, where:
 
    - `attribute.X` is the name of the attribute to include as a claim in the Google token.
-   - `assertion.X` is the value to extract from the [GitLab claim](../cloud_services/index.md#how-it-works).
+   - `assertion.X` is the value to extract from the [GitLab claim](../cloud_services/_index.md#how-it-works).
 
    | Attribute (on Google)         | Assertion (from GitLab) |
    |-------------------------------|-------------------------|
diff --git a/doc/ci/secure_files/index.md b/doc/ci/secure_files/_index.md
similarity index 96%
rename from doc/ci/secure_files/index.md
rename to doc/ci/secure_files/_index.md
index e5aaef82259a0a979b81ab16e5ef00ba044e3d94..b4d8eeefe68e1385b6154e3a5005bc09945084d8 100644
--- a/doc/ci/secure_files/index.md
+++ b/doc/ci/secure_files/_index.md
@@ -11,7 +11,7 @@ DETAILS:
 
 > - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/350748) and feature flag `ci_secure_files` removed in GitLab 15.7.
 
-This feature is part of [Mobile DevOps](../mobile_devops/index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
+This feature is part of [Mobile DevOps](../mobile_devops/_index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
 The feature is still in development, but you can:
 
 - [Request a feature](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=feature_request).
diff --git a/doc/ci/services/index.md b/doc/ci/services/_index.md
similarity index 100%
rename from doc/ci/services/index.md
rename to doc/ci/services/_index.md
diff --git a/doc/ci/services/gitlab.md b/doc/ci/services/gitlab.md
index e4f23ee5733c04e31b7a0f314bf04b57d5e04e52..43a877df246a6f326940bb4ccc085d3bba5b73d3 100644
--- a/doc/ci/services/gitlab.md
+++ b/doc/ci/services/gitlab.md
@@ -13,7 +13,7 @@ Many applications need to access JSON APIs, so application tests might need acce
 to APIs too. The following example shows how to use GitLab as a microservice to give
 tests access to the GitLab API.
 
-1. Configure a [runner](../runners/index.md) with the Docker or Kubernetes executor.
+1. Configure a [runner](../runners/_index.md) with the Docker or Kubernetes executor.
 1. In your `.gitlab-ci.yml` add:
 
    ```yaml
diff --git a/doc/ci/services/mysql.md b/doc/ci/services/mysql.md
index 64d8e08aa51d48497a3db3028db130923c79a03e..c29553221c4842493975ac717ca1cb93da70b13c 100644
--- a/doc/ci/services/mysql.md
+++ b/doc/ci/services/mysql.md
@@ -14,7 +14,7 @@ need it for your tests to run.
 
 ## Use MySQL with the Docker executor
 
-If you want to use a MySQL container, you can use [GitLab Runner](../runners/index.md) with the Docker executor.
+If you want to use a MySQL container, you can use [GitLab Runner](../runners/_index.md) with the Docker executor.
 
 This example shows you how to set a username and password that GitLab uses to access the MySQL container. If you do not set a username and password, you must use `root`.
 
@@ -130,5 +130,5 @@ GitLab Runner with the Shell executor.
 ## Example project
 
 To view a MySQL example, create a fork of this [sample project](https://gitlab.com/gitlab-examples/mysql).
-This project uses publicly-available [instance runners](../runners/index.md) on [GitLab.com](https://gitlab.com).
+This project uses publicly-available [instance runners](../runners/_index.md) on [GitLab.com](https://gitlab.com).
 Update the README.md file, commit your changes, and view the CI/CD pipeline to see it in action.
diff --git a/doc/ci/services/postgres.md b/doc/ci/services/postgres.md
index 7c9b94d37a8ed5c5522127865edfa36691873b91..cef11817b32dbdcc83d5d58255a8c58334859c3c 100644
--- a/doc/ci/services/postgres.md
+++ b/doc/ci/services/postgres.md
@@ -48,7 +48,7 @@ The workaround is to set your variables in [GitLab CI/CD variables](../variables
      POSTGRES_HOST_AUTH_METHOD: trust
    ```
 
-   For more information about using `postgres` for the `Host`, see [How services are linked to the job](../services/index.md#how-services-are-linked-to-the-job).
+   For more information about using `postgres` for the `Host`, see [How services are linked to the job](../services/_index.md#how-services-are-linked-to-the-job).
 
 1. Configure your application to use the database, for example:
 
@@ -143,7 +143,7 @@ Database: nice_marmot
 
 We have set up an [Example PostgreSQL Project](https://gitlab.com/gitlab-examples/postgres) for your
 convenience that runs on [GitLab.com](https://gitlab.com) using our publicly
-available [instance runners](../runners/index.md).
+available [instance runners](../runners/_index.md).
 
 Want to hack on it? Fork it, commit, and push your changes. Within a few
 moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/services/redis.md b/doc/ci/services/redis.md
index eb13bad67992b7dddfd6084245c0dc7e01d91a08..6d32f599bca62d87f103f47f2a4b747c0f2d04db 100644
--- a/doc/ci/services/redis.md
+++ b/doc/ci/services/redis.md
@@ -15,7 +15,7 @@ do this with the Docker and Shell executors of GitLab Runner.
 
 ## Use Redis with the Docker executor
 
-If you are using [GitLab Runner](../runners/index.md) with the Docker executor
+If you are using [GitLab Runner](../runners/_index.md) with the Docker executor
 you basically have everything set up already.
 
 First, in your `.gitlab-ci.yml` add:
@@ -69,7 +69,7 @@ Host: localhost
 
 We have set up an [Example Redis Project](https://gitlab.com/gitlab-examples/redis) for your convenience
 that runs on [GitLab.com](https://gitlab.com) using our publicly available
-[instance runners](../runners/index.md).
+[instance runners](../runners/_index.md).
 
 Want to hack on it? Fork it, commit and push your changes. Within a few
 moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/steps/index.md b/doc/ci/steps/_index.md
similarity index 99%
rename from doc/ci/steps/index.md
rename to doc/ci/steps/_index.md
index d839a5c1b3afd30f20e6bea9b74b053d98f1f0b6..0bb710d8e212b8dd54fc0752083bd7fba58e43f6 100644
--- a/doc/ci/steps/index.md
+++ b/doc/ci/steps/_index.md
@@ -560,7 +560,7 @@ delegate: install_java
 
 ## Combine CI/CD Components and CI/CD Steps
 
-[CI/CD components](../components/index.md) are reusable single pipeline configuration units. They are included in a pipeline when it is
+[CI/CD components](../components/_index.md) are reusable single pipeline configuration units. They are included in a pipeline when it is
 created, adding jobs and configuration to the pipeline. Files such as common scripts or programs
 from the component project cannot be referenced from a CI/CD job.
 
diff --git a/doc/ci/test_cases/index.md b/doc/ci/test_cases/_index.md
similarity index 100%
rename from doc/ci/test_cases/index.md
rename to doc/ci/test_cases/_index.md
diff --git a/doc/ci/testing/index.md b/doc/ci/testing/_index.md
similarity index 100%
rename from doc/ci/testing/index.md
rename to doc/ci/testing/_index.md
diff --git a/doc/ci/testing/accessibility_testing.md b/doc/ci/testing/accessibility_testing.md
index 6e92d6c45128cd8a6465189a7b9e33993c39caa4..76ed3757648a8012cf06662ce5e9f3fdf5641a1a 100644
--- a/doc/ci/testing/accessibility_testing.md
+++ b/doc/ci/testing/accessibility_testing.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
 If your application offers a web interface, you can use
-[GitLab CI/CD](../index.md) to determine the accessibility
+[GitLab CI/CD](../_index.md) to determine the accessibility
 impact of pending code changes.
 
 [Pa11y](https://pa11y.org/) is a free and open source tool for
diff --git a/doc/ci/testing/browser_performance_testing.md b/doc/ci/testing/browser_performance_testing.md
index cb6c11c954e07d67eeb800b2a08d45ae3eb8d748..48f98ffae7d6dc4034f4f114fffd951fa485f0a8 100644
--- a/doc/ci/testing/browser_performance_testing.md
+++ b/doc/ci/testing/browser_performance_testing.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
 If your application offers a web interface and you're using
-[GitLab CI/CD](../index.md), you can quickly determine the rendering performance
+[GitLab CI/CD](../_index.md), you can quickly determine the rendering performance
 impact of pending code changes in the browser.
 
 NOTE:
diff --git a/doc/ci/testing/code_quality.md b/doc/ci/testing/code_quality.md
index 7c7e35c1bfd546f4d87e1ca90e814db174e4345a..248d0f5464316b7a88f2f4b32482792a2eb15428 100644
--- a/doc/ci/testing/code_quality.md
+++ b/doc/ci/testing/code_quality.md
@@ -200,7 +200,7 @@ Because the [report format](#code-quality-report-format) has only a few required
 If you already use a tool in your CI/CD pipeline, you should adapt the existing job to add a Code Quality report.
 Adapting the existing job prevents you from running a separate job that may confuse developers and make your pipelines take longer to run.
 
-If you don't already use a tool, you can write a CI/CD job from scratch or adopt the tool by using a component from [the CI/CD Catalog](../components/index.md#cicd-catalog).
+If you don't already use a tool, you can write a CI/CD job from scratch or adopt the tool by using a component from [the CI/CD Catalog](../components/_index.md#cicd-catalog).
 
 ### Code scanning tools
 
diff --git a/doc/ci/testing/code_quality_codeclimate_scanning.md b/doc/ci/testing/code_quality_codeclimate_scanning.md
index cbb7fc523fc87e7f8101143296fcd33a2e3cdd8f..9bffa0aa9b3e9312b56fde9077da4c92de362ae4 100644
--- a/doc/ci/testing/code_quality_codeclimate_scanning.md
+++ b/doc/ci/testing/code_quality_codeclimate_scanning.md
@@ -2,10 +2,10 @@
 stage: Secure
 group: Static Analysis
 info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
+title: Configure CodeClimate-based Code Quality scanning (deprecated)
 ---
 
 <!--- start_remove The following content will be removed on remove_date: '2025-08-15' -->
-# Configure CodeClimate-based Code Quality scanning (deprecated)
 
 DETAILS:
 **Tier:** Free, Premium, Ultimate
@@ -68,7 +68,7 @@ is present. For more information about how to define a variable, see
 To disable Code Quality, create a custom CI/CD variable named `CODE_QUALITY_DISABLED`, for either:
 
 - [The whole project](../variables/_index.md#for-a-project).
-- [A single pipeline](../pipelines/index.md#run-a-pipeline-manually).
+- [A single pipeline](../pipelines/_index.md#run-a-pipeline-manually).
 
 ## Configure CodeClimate analysis plugins
 
diff --git a/doc/ci/testing/load_performance_testing.md b/doc/ci/testing/load_performance_testing.md
index d1978819932604fc625120128364c0111547fee5..dc942686d388cecabcf2f9f24340141e7aa50ae0 100644
--- a/doc/ci/testing/load_performance_testing.md
+++ b/doc/ci/testing/load_performance_testing.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
 With Load Performance Testing, you can test the impact of any pending code changes
-to your application's backend in [GitLab CI/CD](../index.md).
+to your application's backend in [GitLab CI/CD](../_index.md).
 
 GitLab uses [k6](https://k6.io/), a free and open source
 tool, for measuring the system performance of applications under
@@ -149,7 +149,7 @@ If [GitLab Pages](../../user/project/pages/index.md) is enabled, you can view th
 ### Load Performance testing in review apps
 
 The CI/CD YAML configuration example above works for testing against static environments,
-but it can be extended to work with [review apps](../review_apps/index.md) or
+but it can be extended to work with [review apps](../review_apps/_index.md) or
 [dynamic environments](../environments/_index.md) with a few extra steps.
 
 The best approach is to capture the dynamic URL in a [`.env` file](https://docs.docker.com/compose/environment-variables/env-file/)
diff --git a/doc/ci/testing/test_coverage_visualization/index.md b/doc/ci/testing/test_coverage_visualization/_index.md
similarity index 100%
rename from doc/ci/testing/test_coverage_visualization/index.md
rename to doc/ci/testing/test_coverage_visualization/_index.md
diff --git a/doc/ci/testing/unit_test_reports.md b/doc/ci/testing/unit_test_reports.md
index 516553ede7ed006a1a124b605b72c7a3662cb9f7..74d4993f151835a54349e2c0353b8fefab14ed28 100644
--- a/doc/ci/testing/unit_test_reports.md
+++ b/doc/ci/testing/unit_test_reports.md
@@ -9,7 +9,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-You can configure your [CI/CD pipeline](../pipelines/index.md) to display unit test results directly in merge requests and pipeline details.
+You can configure your [CI/CD pipeline](../pipelines/_index.md) to display unit test results directly in merge requests and pipeline details.
 This makes it easier to identify test failures without searching through job logs.
 
 Unit test reports:
@@ -140,7 +140,7 @@ You can also retrieve the reports via the [GitLab API](../../api/pipelines.md#ge
 
 ### Unit test reports parsing errors
 
-If parsing JUnit report XML results in an error, an indicator is shown next to the job name. Hovering over the icon shows the parser error in a tooltip. If multiple parsing errors come from [grouped jobs](../jobs/index.md#group-similar-jobs-together-in-pipeline-views), GitLab shows only the first error from the group.
+If parsing JUnit report XML results in an error, an indicator is shown next to the job name. Hovering over the icon shows the parser error in a tooltip. If multiple parsing errors come from [grouped jobs](../jobs/_index.md#group-similar-jobs-together-in-pipeline-views), GitLab shows only the first error from the group.
 
 ![Test Reports With Errors](img/pipelines_junit_test_report_with_errors_v13_10.png)
 
diff --git a/doc/ci/triggers/index.md b/doc/ci/triggers/_index.md
similarity index 100%
rename from doc/ci/triggers/index.md
rename to doc/ci/triggers/_index.md
diff --git a/doc/ci/variables/_index.md b/doc/ci/variables/_index.md
index 8c76ab7815091f6265421176c05883d75c7d36b4..93391cd1177fbaed092211c6f11dfb37948e5716 100644
--- a/doc/ci/variables/_index.md
+++ b/doc/ci/variables/_index.md
@@ -11,12 +11,12 @@ DETAILS:
 
 CI/CD variables are a type of environment variable. You can use them to:
 
-- Control the behavior of jobs and [pipelines](../pipelines/index.md).
+- Control the behavior of jobs and [pipelines](../pipelines/_index.md).
 - Store values you want to re-use.
 - Avoid hard-coding values in your `.gitlab-ci.yml` file.
 
-You can [override variable values](#cicd-variable-precedence) for a specific pipeline when you [run a pipeline manually](../pipelines/index.md#run-a-pipeline-manually), [run a manual job](../jobs/job_control.md#specify-variables-when-running-manual-jobs),
-or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-variables-in-manual-pipelines).
+You can [override variable values](#cicd-variable-precedence) for a specific pipeline when you [run a pipeline manually](../pipelines/_index.md#run-a-pipeline-manually), [run a manual job](../jobs/job_control.md#specify-variables-when-running-manual-jobs),
+or have them [prefilled in manual pipelines](../pipelines/_index.md#prefill-variables-in-manual-pipelines).
 
 Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
 to execute scripts. Each shell has its own set of reserved variable names.
@@ -91,8 +91,8 @@ In this example:
 - `job2` outputs: `Variables are 'Different value than default', 'Job 2 variable', and ''`
 
 Use the [`value` and `description`](../yaml/_index.md#variablesdescription) keywords
-to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
-for [manually-triggered pipelines](../pipelines/index.md#run-a-pipeline-manually).
+to define [variables that are prefilled](../pipelines/_index.md#prefill-variables-in-manual-pipelines)
+for [manually-triggered pipelines](../pipelines/_index.md#run-a-pipeline-manually).
 
 ### Skip default variables in a single job
 
@@ -264,7 +264,7 @@ You can also [limit a variable to protected branches and tags only](#protect-a-c
 Alternatively, use one of the native GitLab integrations to connect with third party
 secrets manager providers to store and retrieve secrets:
 
-- [HashiCorp Vault](../secrets/index.md)
+- [HashiCorp Vault](../secrets/_index.md)
 - [Azure Key Vault](../secrets/azure_key_vault.md)
 - [Google Secret Manager](../secrets/gcp_secret_manager.md)
 
@@ -284,7 +284,7 @@ valid [secrets file](../../administration/backup_restore/troubleshooting_backup_
 WARNING:
 Masking a CI/CD variable is not a guaranteed way to prevent malicious users from
 accessing variable values. To ensure security of sensitive information,
-consider using [external secrets](../secrets/index.md) and [file type variables](#use-file-type-cicd-variables)
+consider using [external secrets](../secrets/_index.md) and [file type variables](#use-file-type-cicd-variables)
 to prevent commands such as `env`/`printenv` from printing secret variables.
 
 You can mask a project, group, or instance CI/CD variable so the value of the variable
@@ -322,13 +322,13 @@ variable has the same value, that value is also masked, including when a variabl
 references a masked variable. The string `[MASKED]` is shown instead of the value,
 possibly with some trailing `x` characters.
 
-Different versions of [GitLab Runner](../runners/index.md) have different masking limitations:
+Different versions of [GitLab Runner](../runners/_index.md) have different masking limitations:
 
 | Version             | Limitations |
 | ------------------- | ----------- |
 | v14.1.0 and earlier | Masking of large secrets (greater than 4 KiB) could potentially be [revealed](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28128). No sensitive URL parameter masking. |
 | v14.2.0 to v15.3.0  | The tail of a large secret (greater than 4 KiB) could potentially be [revealed](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28128). No sensitive URL parameter masking. |
-| v15.7.0 and later   | Secrets could be revealed when `CI_DEBUG_SERVICES` is enabled. For details, read about [service container logging](../services/index.md#capturing-service-container-logs). |
+| v15.7.0 and later   | Secrets could be revealed when `CI_DEBUG_SERVICES` is enabled. For details, read about [service container logging](../services/_index.md#capturing-service-container-logs). |
 
 ### Hide a CI/CD variable
 
@@ -758,9 +758,9 @@ The order of precedence for variables is (from highest to lowest):
 1. [Scan execution policy variables](../../user/application_security/policies/scan_execution_policies.md).
 1. [Pipeline variables](#use-pipeline-variables). These variables all have the same precedence:
    - [Variables passed to downstream pipelines](../pipelines/downstream_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline).
-   - [Trigger variables](../triggers/index.md#pass-cicd-variables-in-the-api-call).
+   - [Trigger variables](../triggers/_index.md#pass-cicd-variables-in-the-api-call).
    - [Scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule).
-   - [Manual pipeline run variables](../pipelines/index.md#run-a-pipeline-manually).
+   - [Manual pipeline run variables](../pipelines/_index.md#run-a-pipeline-manually).
    - Variables added when [creating a pipeline with the API](../../api/pipelines.md#create-a-new-pipeline).
    - [Manual job variables](../jobs/job_control.md#specify-variables-when-running-manual-jobs).
 1. Project [variables](#for-a-project).
@@ -801,14 +801,14 @@ Prerequisites:
 
 You can specify a pipeline variable when you:
 
-- [Run a pipeline manually](../pipelines/index.md#run-a-pipeline-manually) in the UI.
+- [Run a pipeline manually](../pipelines/_index.md#run-a-pipeline-manually) in the UI.
 - Create a pipeline by using [the `pipelines` API endpoint](../../api/pipelines.md#create-a-new-pipeline).
-- Create a pipeline by using [the `triggers` API endpoint](../triggers/index.md#pass-cicd-variables-in-the-api-call).
+- Create a pipeline by using [the `triggers` API endpoint](../triggers/_index.md#pass-cicd-variables-in-the-api-call).
 - Use [push options](../../topics/git/commit.md#push-options-for-gitlab-cicd).
 - Pass variables to a downstream pipeline by using either the [`variables` keyword](../pipelines/downstream_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline),
   [`trigger:forward` keyword](../yaml/_index.md#triggerforward) or [`dotenv` variables](../pipelines/downstream_pipelines.md#pass-dotenv-variables-created-in-a-job).
 - Specify variables when creating a [pipeline schedule](../pipelines/schedules.md#add-a-pipeline-schedule).
-- Specify variables when [running a manual job](../pipelines/index.md#run-a-pipeline-manually).
+- Specify variables when [running a manual job](../pipelines/_index.md#run-a-pipeline-manually).
 
 These variables have [higher precedence](#cicd-variable-precedence) and can override
 other defined variables, including [predefined variables](predefined_variables.md).
@@ -988,7 +988,7 @@ by the runner and makes job logs more verbose. It also exposes all variables and
 available to the job.
 
 Before you enable debug logging, make sure only team members
-can view job logs. You should also [delete job logs](../jobs/index.md#view-jobs-in-a-pipeline)
+can view job logs. You should also [delete job logs](../jobs/_index.md#view-jobs-in-a-pipeline)
 with debug output before you make logs public again.
 
 To enable debug logging, set the `CI_DEBUG_TRACE` variable to `true`:
@@ -1100,7 +1100,7 @@ For more information, see [issue 392406](https://gitlab.com/gitlab-org/gitlab/-/
 As a workaround you can either:
 
 - Use [File-type](#use-file-type-cicd-variables) CI/CD variables for large environment variables where possible.
-- If a single large variable is larger than `ARG_MAX`, try using [Secure Files](../secure_files/index.md), or
+- If a single large variable is larger than `ARG_MAX`, try using [Secure Files](../secure_files/_index.md), or
   bring the file to the job through some other mechanism.
 
 ### Default variable doesn't expand in job variable of the same name
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index d1a0332f34b0c8a29d498a16a5c2514c4e261861..cca608434ae504913c85c4b9a163bfd63f18d8a7 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -35,9 +35,9 @@ Predefined variables become available at three different phases of pipeline exec
 
 | Variable                                        | Availability | Description                                                                                                                                                                                                                                                                                                                                                                                                                               |
 |-------------------------------------------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `CHAT_CHANNEL`                                  | Pipeline     | The Source chat channel that triggered the [ChatOps](../chatops/index.md) command.                                                                                                                                                                                                                                                                                                                                                        |
-| `CHAT_INPUT`                                    | Pipeline     | The additional arguments passed with the [ChatOps](../chatops/index.md) command.                                                                                                                                                                                                                                                                                                                                                          |
-| `CHAT_USER_ID`                                  | Pipeline     | The chat service's user ID of the user who triggered the [ChatOps](../chatops/index.md) command.                                                                                                                                                                                                                                                                                                                                          |
+| `CHAT_CHANNEL`                                  | Pipeline     | The Source chat channel that triggered the [ChatOps](../chatops/_index.md) command.                                                                                                                                                                                                                                                                                                                                                       |
+| `CHAT_INPUT`                                    | Pipeline     | The additional arguments passed with the [ChatOps](../chatops/_index.md) command.                                                                                                                                                                                                                                                                                                                                                         |
+| `CHAT_USER_ID`                                  | Pipeline     | The chat service's user ID of the user who triggered the [ChatOps](../chatops/_index.md) command.                                                                                                                                                                                                                                                                                                                                         |
 | `CI`                                            | Pre-pipeline | Available for all jobs executed in CI/CD. `true` when available.                                                                                                                                                                                                                                                                                                                                                                          |
 | `CI_API_V4_URL`                                 | Pre-pipeline | The GitLab API v4 root URL.                                                                                                                                                                                                                                                                                                                                                                                                               |
 | `CI_API_GRAPHQL_URL`                            | Pre-pipeline | The GitLab API GraphQL root URL. Introduced in GitLab 15.11.                                                                                                                                                                                                                                                                                                                                                                              |
@@ -60,7 +60,7 @@ Predefined variables become available at three different phases of pipeline exec
 | `CI_CONCURRENT_PROJECT_ID`                      | Job-only     | The unique ID of build execution in a single executor and project.                                                                                                                                                                                                                                                                                                                                                                        |
 | `CI_CONFIG_PATH`                                | Pre-pipeline | The path to the CI/CD configuration file. Defaults to `.gitlab-ci.yml`.                                                                                                                                                                                                                                                                                                                                                                   |
 | `CI_DEBUG_TRACE`                                | Pipeline     | `true` if [debug logging (tracing)](_index.md#enable-debug-logging) is enabled.                                                                                                                                                                                                                                                                                                                                                            |
-| `CI_DEBUG_SERVICES`                             | Pipeline     | `true` if [service container logging](../services/index.md#capturing-service-container-logs) is enabled. Introduced in GitLab 15.7. Requires GitLab Runner 15.7.                                                                                                                                                                                                                                                                          |
+| `CI_DEBUG_SERVICES`                             | Pipeline     | `true` if [service container logging](../services/_index.md#capturing-service-container-logs) is enabled. Introduced in GitLab 15.7. Requires GitLab Runner 15.7.                                                                                                                                                                                                                                                                         |
 | `CI_DEFAULT_BRANCH`                             | Pre-pipeline | The name of the project's default branch.                                                                                                                                                                                                                                                                                                                                                                                                 |
 | `CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX` | Pre-pipeline | The direct group image prefix for pulling images through the Dependency Proxy.                                                                                                                                                                                                                                                                                                                                                            |
 | `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`        | Pre-pipeline | The top-level group image prefix for pulling images through the Dependency Proxy.                                                                                                                                                                                                                                                                                                                                                         |
@@ -99,7 +99,7 @@ Predefined variables become available at three different phases of pipeline exec
 | `CI_PIPELINE_ID`                                | Job-only     | The instance-level ID of the current pipeline. This ID is unique across all projects on the GitLab instance.                                                                                                                                                                                                                                                                                                                              |
 | `CI_PIPELINE_IID`                               | Pipeline     | The project-level IID (internal ID) of the current pipeline. This ID is unique only in the current project.                                                                                                                                                                                                                                                                                                                               |
 | `CI_PIPELINE_SOURCE`                            | Pre-pipeline | How the pipeline was triggered. The value can be one of the [pipeline sources](../jobs/job_rules.md#ci_pipeline_source-predefined-variable).                                                                                                                                                                                                                                                                                              |
-| `CI_PIPELINE_TRIGGERED`                         | Pipeline     | `true` if the job was [triggered](../triggers/index.md).                                                                                                                                                                                                                                                                                                                                                                                  |
+| `CI_PIPELINE_TRIGGERED`                         | Pipeline     | `true` if the job was [triggered](../triggers/_index.md).                                                                                                                                                                                                                                                                                                                                                                                  |
 | `CI_PIPELINE_URL`                               | Job-only     | The URL for the pipeline details.                                                                                                                                                                                                                                                                                                                                                                                                         |
 | `CI_PIPELINE_CREATED_AT`                        | Pre-pipeline | The date and time when the pipeline was created, in [ISO 8601](https://www.rfc-editor.org/rfc/rfc3339#appendix-A) format. For example, `2022-01-31T16:47:55Z`. [UTC by default](../../administration/timezone.md).                                                                                                                                                                                                                        |
 | `CI_PIPELINE_NAME`                              | Pre-pipeline | The pipeline name defined in [`workflow:name`](../yaml/_index.md#workflowname). Introduced in GitLab 16.3.                                                                                                                                                                                                                                                                                                                                 |
@@ -150,7 +150,7 @@ Predefined variables become available at three different phases of pipeline exec
 | `CI_SERVER`                                     | Job-only     | Available for all jobs executed in CI/CD. `yes` when available.                                                                                                                                                                                                                                                                                                                                                                           |
 | `CI_SHARED_ENVIRONMENT`                         | Pipeline     | Only available if the job is executed in a shared environment (something that is persisted across CI/CD invocations, like the `shell` or `ssh` executor). `true` when available.                                                                                                                                                                                                                                                          |
 | `CI_TEMPLATE_REGISTRY_HOST`                     | Pre-pipeline | The host of the registry used by CI/CD templates. Defaults to `registry.gitlab.com`. Introduced in GitLab 15.3.                                                                                                                                                                                                                                                                                                                           |
-| `CI_TRIGGER_SHORT_TOKEN`                        | Job-only     | First 4 characters of the [trigger token](../triggers/index.md#create-a-pipeline-trigger-token) of the current job. Only available if the pipeline was [triggered with a trigger token](../triggers/index.md). For example, for a trigger token of `glptt-1234567890abcdefghij`, `CI_TRIGGER_SHORT_TOKEN` would be `1234`. Introduced in GitLab 17.0. <!-- gitleaks:allow -->                                                             |
+| `CI_TRIGGER_SHORT_TOKEN`                        | Job-only     | First 4 characters of the [trigger token](../triggers/_index.md#create-a-pipeline-trigger-token) of the current job. Only available if the pipeline was [triggered with a trigger token](../triggers/_index.md). For example, for a trigger token of `glptt-1234567890abcdefghij`, `CI_TRIGGER_SHORT_TOKEN` would be `1234`. Introduced in GitLab 17.0. <!-- gitleaks:allow -->                                                             |
 | `GITLAB_CI`                                     | Pre-pipeline | Available for all jobs executed in CI/CD. `true` when available.                                                                                                                                                                                                                                                                                                                                                                          |
 | `GITLAB_FEATURES`                               | Pre-pipeline | The comma-separated list of licensed features available for the GitLab instance and license.                                                                                                                                                                                                                                                                                                                                              |
 | `GITLAB_USER_EMAIL`                             | Pipeline     | The email of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the email of the user who started the job.                                                                                                                                                                                                                                                                                   |
@@ -158,7 +158,7 @@ Predefined variables become available at three different phases of pipeline exec
 | `GITLAB_USER_LOGIN`                             | Pipeline     | The unique username of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the username of the user who started the job.                                                                                                                                                                                                                                                                      |
 | `GITLAB_USER_NAME`                              | Pipeline     | The display name (user-defined **Full name** in the profile settings) of the user who started the pipeline, unless the job is a manual job. In manual jobs, the value is the name of the user who started the job.                                                                                                                                                                                                                        |
 | `KUBECONFIG`                                    | Pipeline     | The path to the `kubeconfig` file with contexts for every shared agent connection. Only available when a [GitLab agent is authorized to access the project](../../user/clusters/agent/ci_cd_workflow.md#authorize-the-agent).                                                                                                                                                                                                             |
-| `TRIGGER_PAYLOAD`                               | Pipeline     | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/index.md#access-webhook-payload).                                                                                                                                                                                                                                                                                                           |
+| `TRIGGER_PAYLOAD`                               | Pipeline     | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/_index.md#access-webhook-payload).                                                                                                                                                                                                                                                                                                           |
 
 ## Predefined variables for merge request pipelines
 
@@ -202,7 +202,7 @@ and the merge request must be open.
 
 These variables are only available when:
 
-- The pipelines are [external pull requests pipelines](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)
+- The pipelines are [external pull requests pipelines](../ci_cd_for_external_repos/_index.md#pipelines-for-external-pull-requests)
 - The pull request is open.
 
 | Variable                                      | Description |
diff --git a/doc/ci/yaml/_index.md b/doc/ci/yaml/_index.md
index 5b633c50e48b1c21f8ee4ddc34c29cc73c98a90e..4b5971660beb15c0a92a30ab47fb97ac8aa27585 100644
--- a/doc/ci/yaml/_index.md
+++ b/doc/ci/yaml/_index.md
@@ -12,10 +12,10 @@ DETAILS:
 This document lists the configuration options for the GitLab `.gitlab-ci.yml` file.
 This file is where you define the CI/CD jobs that make up your pipeline.
 
-- If you are already familiar with [basic CI/CD concepts](../index.md), try creating
-  your own `.gitlab-ci.yml` file by following a tutorial that demonstrates a [simple](../quick_start/index.md)
+- If you are already familiar with [basic CI/CD concepts](../_index.md), try creating
+  your own `.gitlab-ci.yml` file by following a tutorial that demonstrates a [simple](../quick_start/_index.md)
   or [complex](../quick_start/tutorial.md) pipeline.
-- For a collection of examples, see [GitLab CI/CD examples](../examples/index.md).
+- For a collection of examples, see [GitLab CI/CD examples](../examples/_index.md).
 - To view a large `.gitlab-ci.yml` file used in an enterprise, see the
   [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
 
@@ -43,7 +43,7 @@ A GitLab CI/CD pipeline configuration includes:
   |-----------------|:------------|
   | [`spec`](#spec) | Define specifications for external configuration files. |
 
-- [Jobs](../jobs/index.md) configured with [job keywords](#job-keywords):
+- [Jobs](../jobs/_index.md) configured with [job keywords](#job-keywords):
 
   | Keyword                                       | Description                                                                                                 |
   |:----------------------------------------------|:------------------------------------------------------------------------------------------------------------|
@@ -203,7 +203,7 @@ And optionally:
 
 #### `include:component`
 
-Use `include:component` to add a [CI/CD component](../components/index.md) to the
+Use `include:component` to add a [CI/CD component](../components/_index.md) to the
 pipeline configuration.
 
 **Keyword type**: Global keyword.
@@ -220,7 +220,7 @@ include:
 
 **Related topics**:
 
-- [Use a CI/CD component](../components/index.md#use-a-component).
+- [Use a CI/CD component](../components/_index.md#use-a-component).
 
 #### `include:local`
 
@@ -361,7 +361,7 @@ Use `include:template` to include [`.gitlab-ci.yml` templates](https://gitlab.co
 
 **Supported values**:
 
-A [CI/CD template](../examples/index.md#cicd-templates):
+A [CI/CD template](../examples/_index.md#cicd-templates):
 
 - All templates can be viewed in [`lib/gitlab/ci/templates`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
   Not all templates are designed to be used with `include:template`, so check template
@@ -1664,15 +1664,15 @@ Caches are:
 - Shared between pipelines and jobs.
 - By default, not shared between [protected](../../user/project/repository/branches/protected.md) and unprotected branches.
 - Restored before [artifacts](#artifacts).
-- Limited to a maximum of four [different caches](../caching/index.md#use-multiple-caches).
+- Limited to a maximum of four [different caches](../caching/_index.md#use-multiple-caches).
 
-You can [disable caching for specific jobs](../caching/index.md#disable-cache-for-specific-jobs),
+You can [disable caching for specific jobs](../caching/_index.md#disable-cache-for-specific-jobs),
 for example to override:
 
 - A default cache defined with [`default`](#default).
 - The configuration for a job added with [`include`](#include).
 
-For more information about caches, see [Caching in GitLab CI/CD](../caching/index.md).
+For more information about caches, see [Caching in GitLab CI/CD](../caching/_index.md).
 
 #### `cache:paths`
 
@@ -1714,7 +1714,7 @@ rspec:
 
 **Related topics**:
 
-- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more
+- See the [common `cache` use cases](../caching/_index.md#common-use-cases-for-caches) for more
   `cache:paths` examples.
 
 #### `cache:key`
@@ -1763,10 +1763,10 @@ cache-job:
 
 **Related topics**:
 
-- You can specify a [fallback cache key](../caching/index.md#use-a-fallback-cache-key)
+- You can specify a [fallback cache key](../caching/_index.md#use-a-fallback-cache-key)
   to use if the specified `cache:key` is not found.
-- You can [use multiple cache keys](../caching/index.md#use-multiple-caches) in a single job.
-- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more
+- You can [use multiple cache keys](../caching/_index.md#use-multiple-caches) in a single job.
+- See the [common `cache` use cases](../caching/_index.md#common-use-cases-for-caches) for more
   `cache:key` examples.
 
 ##### `cache:key:files`
@@ -2007,7 +2007,7 @@ faster-test-job:
 
 **Related topics**:
 
-- You can [use a variable to control a job's cache policy](../caching/index.md#use-a-variable-to-control-a-jobs-cache-policy).
+- You can [use a variable to control a job's cache policy](../caching/_index.md#use-a-variable-to-control-a-jobs-cache-policy).
 
 #### `cache:fallback_keys`
 
@@ -2515,7 +2515,7 @@ rubocop:
 - You can use multiple parents for `extends`.
 - The `extends` keyword supports up to eleven levels of inheritance, but you should
   avoid using more than three levels.
-- In the example above, `.tests` is a [hidden job](../jobs/index.md#hide-a-job),
+- In the example above, `.tests` is a [hidden job](../jobs/_index.md#hide-a-job),
   but you can extend configuration from regular jobs as well.
 
 **Related topics**:
@@ -2642,7 +2642,7 @@ job_with_id_tokens:
 **Related topics**:
 
 - [ID token authentication](../secrets/id_token_authentication.md).
-- [Connect to cloud services](../cloud_services/index.md).
+- [Connect to cloud services](../cloud_services/_index.md).
 - [Keyless signing with Sigstore](signing_examples.md).
 
 ### `image`
@@ -2820,7 +2820,7 @@ job2:
 
 ### `inherit`
 
-Use `inherit` to [control inheritance of default keywords and variables](../jobs/index.md#control-the-inheritance-of-default-keywords-and-variables).
+Use `inherit` to [control inheritance of default keywords and variables](../jobs/_index.md#control-the-inheritance-of-default-keywords-and-variables).
 
 #### `inherit:default`
 
@@ -3696,7 +3696,7 @@ deploystacks: [vultr, processing]
 
 - `parallel:matrix` jobs add the variable values to the job names to differentiate
   the jobs from each other, but [large values can cause names to exceed limits](https://gitlab.com/gitlab-org/gitlab/-/issues/362262):
-  - [Job names](../jobs/index.md#job-names) must be 255 characters or fewer.
+  - [Job names](../jobs/_index.md#job-names) must be 255 characters or fewer.
   - When using [`needs`](#needs), job names must be 128 characters or fewer.
 - You cannot create multiple matrix configurations with the same variable values but different variable names.
   Job names are generated from the variable values, not the variable names, so matrix entries
@@ -3964,7 +3964,7 @@ assets:
 
 ### `resource_group`
 
-Use `resource_group` to create a [resource group](../resource_groups/index.md) that
+Use `resource_group` to create a [resource group](../resource_groups/_index.md) that
 ensures a job is mutually exclusive across different pipelines for the same project.
 
 For example, if multiple jobs that belong to the same resource group are queued simultaneously,
@@ -3972,7 +3972,7 @@ only one of the jobs starts. The other jobs wait until the `resource_group` is f
 
 Resource groups behave similar to semaphores in other programming languages.
 
-You can choose a [process mode](../resource_groups/index.md#process-modes) to strategically control the job concurrency for your deployment preferences. The default process mode is `unordered`. To change the process mode of a resource group, use the [API](../../api/resource_groups.md#edit-an-existing-resource-group) to send a request to edit an existing resource group.
+You can choose a [process mode](../resource_groups/_index.md#process-modes) to strategically control the job concurrency for your deployment preferences. The default process mode is `unordered`. To change the process mode of a resource group, use the [API](../../api/resource_groups.md#edit-an-existing-resource-group) to send a request to edit an existing resource group.
 
 You can define multiple resource groups per environment. For example,
 when deploying to physical devices, you might have multiple physical devices. Each device
@@ -3998,7 +3998,7 @@ you can ensure that concurrent deployments never happen to the production enviro
 
 **Related topics**:
 
-- [Pipeline-level concurrency control with cross-project/parent-child pipelines](../resource_groups/index.md#pipeline-level-concurrency-control-with-cross-projectparent-child-pipelines).
+- [Pipeline-level concurrency control with cross-project/parent-child pipelines](../resource_groups/_index.md#pipeline-level-concurrency-control-with-cross-projectparent-child-pipelines).
 
 ### `retry`
 
@@ -4732,7 +4732,7 @@ DETAILS:
 NOTE:
 This feature is available for testing, but not ready for production use.
 
-Use `run` to define a series of [steps](../steps/index.md) to be executed in a job. Each step can be either a script or a predefined step.
+Use `run` to define a series of [steps](../steps/_index.md) to be executed in a job. Each step can be either a script or a predefined step.
 
 You can also provide optional environment variables and inputs.
 
@@ -4821,7 +4821,7 @@ DETAILS:
 **Tier:** Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-Use `secrets` to specify [CI/CD secrets](../secrets/index.md) to:
+Use `secrets` to specify [CI/CD secrets](../secrets/_index.md) to:
 
 - Retrieve from an external secrets provider.
 - Make available in the job as [CI/CD variables](../variables/_index.md)
@@ -4999,7 +4999,7 @@ job:
 
 ### `services`
 
-Use `services` to specify any additional Docker images that your scripts require to run successfully. The [`services` image](../services/index.md) is linked
+Use `services` to specify any additional Docker images that your scripts require to run successfully. The [`services` image](../services/_index.md) is linked
 to the image specified in the [`image`](#image) keyword.
 
 **Keyword type**: Job keyword. You can use it only as part of a job or in the
@@ -5043,8 +5043,8 @@ In this example, GitLab launches two containers for the job:
 
 **Related topics**:
 
-- [Available settings for `services`](../services/index.md#available-settings-for-services).
-- [Define `services` in the `.gitlab-ci.yml` file](../services/index.md#define-services-in-the-gitlab-ciyml-file).
+- [Available settings for `services`](../services/_index.md#available-settings-for-services).
+- [Define `services` in the `.gitlab-ci.yml` file](../services/_index.md#define-services-in-the-gitlab-ciyml-file).
 - [Run your CI/CD jobs in Docker containers](../docker/using_docker_images.md).
 - [Use Docker to build Docker images](../docker/using_docker_build.md).
 
@@ -5384,7 +5384,7 @@ trigger-multi-project-pipeline:
 **Related topics**:
 
 - [Multi-project pipeline configuration examples](../pipelines/downstream_pipelines.md#trigger-a-downstream-pipeline-from-a-job-in-the-gitlab-ciyml-file).
-- To run a pipeline for a specific branch, tag, or commit, you can use a [trigger token](../triggers/index.md)
+- To run a pipeline for a specific branch, tag, or commit, you can use a [trigger token](../triggers/_index.md)
   to authenticate with the [pipeline triggers API](../../api/pipeline_triggers.md).
   The trigger token is different than the `trigger` keyword.
 
@@ -5448,7 +5448,7 @@ trigger-multi-project-pipeline:
 **Related topics**:
 
 - [Multi-project pipeline configuration examples](../pipelines/downstream_pipelines.md#trigger-a-downstream-pipeline-from-a-job-in-the-gitlab-ciyml-file).
-- To run a pipeline for a specific branch, tag, or commit, you can also use a [trigger token](../triggers/index.md)
+- To run a pipeline for a specific branch, tag, or commit, you can also use a [trigger token](../triggers/_index.md)
   to authenticate with the [pipeline triggers API](../../api/pipeline_triggers.md).
   The trigger token is different than the `trigger` keyword.
 
@@ -5507,7 +5507,7 @@ unless the nested downstream trigger job also uses `trigger:forward`.
 
 **Example of `trigger:forward`**:
 
-[Run this pipeline manually](../pipelines/index.md#run-a-pipeline-manually), with
+[Run this pipeline manually](../pipelines/_index.md#run-a-pipeline-manually), with
 the CI/CD variable `MYVAR = my value`:
 
 ```yaml
@@ -5657,9 +5657,9 @@ Variables can be [defined in a CI/CD job](#job-variables), or as a top-level (gl
 
 **Additional details**:
 
-- All YAML-defined variables are also set to any linked [Docker service containers](../services/index.md).
+- All YAML-defined variables are also set to any linked [Docker service containers](../services/_index.md).
 - YAML-defined variables are meant for non-sensitive project configuration. Store sensitive information
-  in [protected variables](../variables/_index.md#protect-a-cicd-variable) or [CI/CD secrets](../secrets/index.md).
+  in [protected variables](../variables/_index.md#protect-a-cicd-variable) or [CI/CD secrets](../secrets/_index.md).
 - [Manual pipeline variables](../variables/_index.md#use-pipeline-variables)
   and [scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule)
   are not passed to downstream pipelines by default. Use [trigger:forward](#triggerforward)
@@ -5758,7 +5758,7 @@ In this example:
 #### `variables:description`
 
 Use the `description` keyword to define a description for a default variable.
-The description displays with [the prefilled variable name when running a pipeline manually](../pipelines/index.md#prefill-variables-in-manual-pipelines).
+The description displays with [the prefilled variable name when running a pipeline manually](../pipelines/_index.md#prefill-variables-in-manual-pipelines).
 
 **Keyword type**: You can only use this keyword with default `variables`, not job `variables`.
 
@@ -5782,7 +5782,7 @@ variables:
 #### `variables:value`
 
 Use the `value` keyword to define a pipeline-level (default) variable's value. When used with
-[`variables: description`](#variablesdescription), the variable value is [prefilled when running a pipeline manually](../pipelines/index.md#prefill-variables-in-manual-pipelines).
+[`variables: description`](#variablesdescription), the variable value is [prefilled when running a pipeline manually](../pipelines/_index.md#prefill-variables-in-manual-pipelines).
 
 **Keyword type**: You can only use this keyword with default `variables`, not job `variables`.
 
@@ -5808,7 +5808,7 @@ variables:
 
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/105502) in GitLab 15.7.
 
-Use `variables:options` to define an array of values that are [selectable in the UI when running a pipeline manually](../pipelines/index.md#configure-a-list-of-selectable-prefilled-variable-values).
+Use `variables:options` to define an array of values that are [selectable in the UI when running a pipeline manually](../pipelines/_index.md#configure-a-list-of-selectable-prefilled-variable-values).
 
 Must be used with `variables: value`, and the string defined for `value`:
 
@@ -5937,15 +5937,15 @@ pipeline based on branch names or pipeline types.
   | -------------------------|-----------------|
   | `api`                    | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline). |
   | `branches`               | When the Git reference for a pipeline is a branch. |
-  | `chat`                   | For pipelines created by using a [GitLab ChatOps](../chatops/index.md) command. |
+  | `chat`                   | For pipelines created by using a [GitLab ChatOps](../chatops/_index.md) command. |
   | `external`               | When you use CI services other than GitLab. |
-  | `external_pull_requests` | When an external pull request on GitHub is created or updated (See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)). |
+  | `external_pull_requests` | When an external pull request on GitHub is created or updated (See [Pipelines for external pull requests](../ci_cd_for_external_repos/_index.md#pipelines-for-external-pull-requests)). |
   | `merge_requests`         | For pipelines created when a merge request is created or updated. Enables [merge request pipelines](../pipelines/merge_request_pipelines.md), [merged results pipelines](../pipelines/merged_results_pipelines.md), and [merge trains](../pipelines/merge_trains.md). |
   | `pipelines`              | For [multi-project pipelines](../pipelines/downstream_pipelines.md#multi-project-pipelines) created by [using the API with `CI_JOB_TOKEN`](../pipelines/downstream_pipelines.md#trigger-a-multi-project-pipeline-by-using-the-api), or the [`trigger`](#trigger) keyword. |
   | `pushes`                 | For pipelines triggered by a `git push` event, including for branches and tags. |
   | `schedules`              | For [scheduled pipelines](../pipelines/schedules.md). |
   | `tags`                   | When the Git reference for a pipeline is a tag. |
-  | `triggers`               | For pipelines created by using a [trigger token](../triggers/index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
+  | `triggers`               | For pipelines created by using a [trigger token](../triggers/_index.md#configure-cicd-jobs-to-run-in-triggered-pipelines). |
   | `web`                    | For pipelines created by selecting **New pipeline** in the GitLab UI, from the project's **Build > Pipelines** section. |
 
 **Example of `only:refs` and `except:refs`**:
diff --git a/doc/ci/yaml/artifacts_reports.md b/doc/ci/yaml/artifacts_reports.md
index bc046564c70108274091d1a740e3e33b34caf039..2500affd28af2a413ec92b21f208b0c0b6ec3715 100644
--- a/doc/ci/yaml/artifacts_reports.md
+++ b/doc/ci/yaml/artifacts_reports.md
@@ -121,7 +121,7 @@ GitLab cannot display the combined results of multiple `browser_performance` rep
 
 ## `artifacts:reports:coverage_report`
 
-Use `coverage_report:` to collect [coverage report](../testing/index.md) in Cobertura or JaCoCo formats.
+Use `coverage_report:` to collect [coverage report](../testing/_index.md) in Cobertura or JaCoCo formats.
 
 The `coverage_format:` Can be either [`cobertura`](../testing/test_coverage_visualization/cobertura.md) or
 [`jacoco`](../testing/test_coverage_visualization/jacoco.md).
@@ -144,7 +144,7 @@ job artifact using [wildcards](../jobs/job_artifacts.md#with-wildcards).
 The results of the reports are aggregated in the final coverage report.
 
 GitLab can display the results of coverage report in the merge request
-[diff annotations](../testing/test_coverage_visualization/index.md).
+[diff annotations](../testing/test_coverage_visualization/_index.md).
 
 ## `artifacts:reports:codequality`
 
diff --git a/doc/ci/yaml/includes.md b/doc/ci/yaml/includes.md
index aa08aa9d346904d864b65b0acdf7a186d3535fcf..f4511269a1d444ef580e39625eae7e4f13b4f0c0 100644
--- a/doc/ci/yaml/includes.md
+++ b/doc/ci/yaml/includes.md
@@ -406,9 +406,9 @@ In `include` sections in your `.gitlab-ci.yml` file, you can use:
 - [Group variables](../variables/_index.md#for-a-group).
 - [Instance variables](../variables/_index.md#for-an-instance).
 - Project [predefined variables](../variables/predefined_variables.md) (`CI_PROJECT_*`).
-- [Trigger variables](../triggers/index.md#pass-cicd-variables-in-the-api-call).
+- [Trigger variables](../triggers/_index.md#pass-cicd-variables-in-the-api-call).
 - [Scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule).
-- [Manual pipeline run variables](../pipelines/index.md#run-a-pipeline-manually).
+- [Manual pipeline run variables](../pipelines/_index.md#run-a-pipeline-manually).
 - The `CI_PIPELINE_SOURCE` and `CI_PIPELINE_TRIGGERED` [predefined variables](../variables/predefined_variables.md).
 - The `$CI_COMMIT_REF_NAME` [predefined variable](../variables/predefined_variables.md).
 
@@ -625,7 +625,7 @@ it's likely that either:
   `include2.yml` which includes `include1.yml`, creating a recursive loop.
 
 To help reduce the risk of this happening, edit the pipeline configuration file
-with the [pipeline editor](../pipeline_editor/index.md), which validates if the
+with the [pipeline editor](../pipeline_editor/_index.md), which validates if the
 limit is reached. You can remove one included file at a time to try to narrow down
 which configuration file is the source of the loop or excessive included files.
 
diff --git a/doc/ci/yaml/lint.md b/doc/ci/yaml/lint.md
index ed6139461786484e9970002d4625cc672c610766..ef2e7184e495b3a4f01d661bcfcbd52126dd72c1 100644
--- a/doc/ci/yaml/lint.md
+++ b/doc/ci/yaml/lint.md
@@ -14,7 +14,7 @@ You can validate the syntax from a `.gitlab-ci.yml` file or any other sample CI/
 This tool checks for syntax and logic errors, and can simulate pipeline
 creation to try to find more complicated configuration problems.
 
-If you use the [pipeline editor](../pipeline_editor/index.md), it verifies configuration
+If you use the [pipeline editor](../pipeline_editor/_index.md), it verifies configuration
 syntax automatically.
 
 If you use VS Code, you can validate your CI/CD configuration with the
diff --git a/doc/ci/yaml/workflow.md b/doc/ci/yaml/workflow.md
index f821d8b27c220200d4ab0390a3b1d4d55a5e5444..4c70199471efb62720ab4446b36df2a79afe0c2d 100644
--- a/doc/ci/yaml/workflow.md
+++ b/doc/ci/yaml/workflow.md
@@ -111,7 +111,7 @@ workflow:
     - ...                # Previously defined workflow rules here
 ```
 
-[Triggered pipelines](../triggers/index.md) that run on a branch have a `$CI_COMMIT_BRANCH`
+[Triggered pipelines](../triggers/_index.md) that run on a branch have a `$CI_COMMIT_BRANCH`
 set and could be blocked by a similar rule. Triggered pipelines have a pipeline source
 of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
 does not block triggered pipelines.
diff --git a/doc/ci/yaml/yaml_optimization.md b/doc/ci/yaml/yaml_optimization.md
index a432463f61aa837345de34b8e273c8d264294f90..08fcb21e122cd1ec1ddb18e99ae8f8765a65edc5 100644
--- a/doc/ci/yaml/yaml_optimization.md
+++ b/doc/ci/yaml/yaml_optimization.md
@@ -22,7 +22,7 @@ files by using:
 YAML has a feature called 'anchors' that you can use to duplicate
 content across your document.
 
-Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](../jobs/index.md#hide-a-job)
+Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](../jobs/_index.md#hide-a-job)
 to provide templates for your jobs. When there are duplicate keys, the latest included key wins, overriding the other keys.
 
 In certain cases (see [YAML anchors for scripts](#yaml-anchors-for-scripts)), you can use YAML anchors to build arrays with multiple components defined elsewhere. For example:
@@ -67,7 +67,7 @@ test2:
 
 `&` sets up the name of the anchor (`job_configuration`), `<<` means "merge the
 given hash into the current one," and `*` includes the named anchor
-(`job_configuration` again). The [expanded](../pipeline_editor/index.md#view-full-configuration) version of this example is:
+(`job_configuration` again). The [expanded](../pipeline_editor/_index.md#view-full-configuration) version of this example is:
 
 ```yaml
 .job_template:
@@ -125,7 +125,7 @@ test:mysql:
   services: *mysql_configuration
 ```
 
-The [expanded](../pipeline_editor/index.md#view-full-configuration) version is:
+The [expanded](../pipeline_editor/_index.md#view-full-configuration) version is:
 
 ```yaml
 .job_template:
@@ -464,7 +464,7 @@ In this example, the `nested-references` job runs all three `echo` commands.
 
 ### Configure your IDE to support `!reference` tags
 
-The [pipeline editor](../pipeline_editor/index.md) supports `!reference` tags. However, the schema rules for custom YAML
+The [pipeline editor](../pipeline_editor/_index.md) supports `!reference` tags. However, the schema rules for custom YAML
 tags like `!reference` might be treated as invalid by your editor by default.
 You can configure some editors to accept `!reference` tags. For example:
 
diff --git a/doc/cloud_seed/_index.md b/doc/cloud_seed/_index.md
index 7006447fcc4679aa1c810c4fc08cb86274c9bece..07e9f6fa122fbd95443eb00f9d6944b2dad8c1c9 100644
--- a/doc/cloud_seed/_index.md
+++ b/doc/cloud_seed/_index.md
@@ -74,7 +74,7 @@ The generated service account has the following roles:
 - `roles/cloudsql.client`
 - `roles/browser`
 
-You can enhance security by storing CI variables in secret managers. For more information, see [secret management with GitLab](../ci/secrets/index.md).
+You can enhance security by storing CI variables in secret managers. For more information, see [secret management with GitLab](../ci/secrets/_index.md).
 
 ### Configure your preferred GCP region
 
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index f0a8787cfdd7b1f5cd94f9f76ca7bea478f682f4..3f028c4ce866f311eb01ab9219fd5ad994000723 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -573,7 +573,7 @@ You can use it either for personal or business websites, such as portfolios, doc
   - [Source](https://docs.gitlab.com/runner/)
   - [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/runner.md)
 - Layer: Core Service (Processor)
-- GitLab.com: [Runners](../ci/runners/index.md)
+- GitLab.com: [Runners](../ci/runners/_index.md)
 
 GitLab Runner runs jobs and sends the results to GitLab.
 
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index df4eb4e3841f1af97617e5599e72a37374a154e3..da0a4834ed7c84b4701108e66661bec657527ec9 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -57,7 +57,7 @@ To request access to ChatOps on GitLab.com:
 
 ## See also
 
-- [ChatOps Usage](../ci/chatops/index.md)
+- [ChatOps Usage](../ci/chatops/_index.md)
 - [Feature Flag Controls](feature_flags/controls.md)
 - [Understanding EXPLAIN plans](database/understanding_explain_plans.md)
 - [Feature Groups](feature_flags/_index.md#feature-groups)
diff --git a/doc/development/cicd/_index.md b/doc/development/cicd/_index.md
index 4312da1f9e4cb19582aa38305046bad5c7bb0b22..febfadc4abea46a6f19295da282d21dc9eb4c6af 100644
--- a/doc/development/cicd/_index.md
+++ b/doc/development/cicd/_index.md
@@ -85,9 +85,9 @@ On the left side we have the events that can trigger a pipeline based on various
 - When a [merge request is created or updated](../../ci/pipelines/merge_request_pipelines.md).
 - When an MR is added to a [Merge Train](../../ci/pipelines/merge_trains.md).
 - A [scheduled pipeline](../../ci/pipelines/schedules.md).
-- When project is [subscribed to an upstream project](../../ci/pipelines/index.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated).
+- When project is [subscribed to an upstream project](../../ci/pipelines/_index.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated).
 - When [Auto DevOps](../../topics/autodevops/_index.md) is enabled.
-- When GitHub integration is used with [external pull requests](../../ci/ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests).
+- When GitHub integration is used with [external pull requests](../../ci/ci_cd_for_external_repos/_index.md#pipelines-for-external-pull-requests).
 - When an upstream pipeline contains a [bridge job](../../ci/yaml/_index.md#trigger) which triggers a downstream pipeline.
 
 Triggering any of these events invokes the [`CreatePipelineService`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/create_pipeline_service.rb)
@@ -116,7 +116,7 @@ successfully or fail. Each status transition for job within a pipeline triggers
 looks for the next jobs to be transitioned towards completion. While doing that, `ProcessPipelineService`
 updates the status of jobs, stages and the overall pipeline.
 
-On the right side of the diagram we have a list of [runners](../../ci/runners/index.md)
+On the right side of the diagram we have a list of [runners](../../ci/runners/_index.md)
 connected to the GitLab instance. These can be instance runners, group runners, or project runners.
 The communication between runners and the Rails server occurs through a set of API endpoints, grouped as
 the `Runner API Gateway`.
diff --git a/doc/development/cicd/components.md b/doc/development/cicd/components.md
index 8a7eb3c3487f73316872c0204bc580cac70c7082..4dd1da2e3bc42e736d01f0498273c99c3187196b 100644
--- a/doc/development/cicd/components.md
+++ b/doc/development/cicd/components.md
@@ -5,7 +5,7 @@ info: Any user with at least the Maintainer role can merge updates to this conte
 title: Development guide for GitLab official CI/CD components
 ---
 
-This document explains how to develop [CI/CD components](../../ci/components/index.md) that are maintained by GitLab, either the official public ones or those for internal use.
+This document explains how to develop [CI/CD components](../../ci/components/_index.md) that are maintained by GitLab, either the official public ones or those for internal use.
 
 The location for all official GitLab component projects is the [`gitlab.com/components`](https://gitlab.com/components) group.
 This group contains all components that are designed to be generic, served to all GitLab users, and maintained by GitLab.
@@ -16,7 +16,7 @@ but it needs to be moved into the `components` group before the first version ge
 Components that are for GitLab internal use only, for example specific to `gitlab-org/gitlab` project, should be
 implemented under `gitlab-org` group.
 
-Component projects that are expected to be published in the [CI/CD catalog](../../ci/components/index.md#cicd-catalog)
+Component projects that are expected to be published in the [CI/CD catalog](../../ci/components/_index.md#cicd-catalog)
 should first be dogfooded to ensure we stay on top of the project quality and have first-hand
 experience with it.
 
@@ -49,9 +49,9 @@ in the catalog.
 
 1. Create a project under [`gitlab.com/components`](https://gitlab.com/components)
    or ask one of the group owners to create an empty project for you.
-1. Follow the [standard guide for creating components](../../ci/components/index.md).
+1. Follow the [standard guide for creating components](../../ci/components/_index.md).
 1. Add a concise project description that clearly describes the capabilities offered by the component project.
-1. Make sure to follow the general guidance given to [write a component](../../ci/components/index.md#write-a-component) as well as
+1. Make sure to follow the general guidance given to [write a component](../../ci/components/_index.md#write-a-component) as well as
    the guidance [for official components](#best-practices-for-official-components).
 1. Add a `LICENSE.md` file with the MIT license ([example](https://gitlab.com/components/ruby/-/blob/d8db5288b01947e8a931d8d1a410befed69325a7/LICENSE.md)).
 1. The project must have a `.gitlab-ci.yml` file that:
@@ -70,7 +70,7 @@ in the catalog.
      - **Inputs**: A table showing the input names, types, default values (if any) and descriptions.
      - **Variables** (when applicable): The variable names, supported values, and descriptions.
    - **Contribute**: Notes and how to get in touch with the maintainers.
-     Usually the contribution process should follow the [official guide](../../ci/components/index.md).
+     Usually the contribution process should follow the [official guide](../../ci/components/_index.md).
 1. Use underscores `_` for composite input names and hyphens `-` as separators, if necessary. For example: `service_x-project_name`.
 
 ## Review and contribution process for official components
@@ -104,7 +104,7 @@ Requirements for becoming a maintainer:
 
 - Have a an in-depth understanding of the [CI/CD YAML syntax](../../ci/yaml/_index.md) and features.
 - Understand how CI components work and demonstrate experience developing them.
-- Have a solid understanding of how to [write a component](../../ci/components/index.md#write-a-component).
+- Have a solid understanding of how to [write a component](../../ci/components/_index.md#write-a-component).
 
 How to join the `gitlab-components` group of general maintainers:
 
diff --git a/doc/development/cicd/schema.md b/doc/development/cicd/schema.md
index c21adac352f3877c7ba7fece44a21d8b79b5c8e8..3b887ba337249b2044c516a661fc7fe869fb373f 100644
--- a/doc/development/cicd/schema.md
+++ b/doc/development/cicd/schema.md
@@ -5,7 +5,7 @@ info: Any user with at least the Maintainer role can merge updates to this conte
 title: Contribute to the CI/CD Schema
 ---
 
-The [pipeline editor](../../ci/pipeline_editor/index.md) uses a CI/CD schema to enhance
+The [pipeline editor](../../ci/pipeline_editor/_index.md) uses a CI/CD schema to enhance
 the authoring experience of our CI/CD configuration files. With the CI/CD schema, the editor can:
 
 - Validate the content of the CI/CD configuration file as it is being written in the editor.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index d98766608e1509135d96c0c16a8b4e99aaf6002a..f401ecae344f03d3231a39b1e7bd7951ad1b4ae6 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -6,9 +6,9 @@ title: Development guide for GitLab CI/CD templates (Deprecated)
 ---
 
 NOTE:
-With the introduction of the [CI/CD Catalog](../../ci/components/index.md#cicd-catalog),
+With the introduction of the [CI/CD Catalog](../../ci/components/_index.md#cicd-catalog),
 GitLab is no longer accepting contributions of new CI/CD templates to the codebase. Instead,
-we encourage team members to create [CI/CD components](../../ci/components/index.md)
+we encourage team members to create [CI/CD components](../../ci/components/_index.md)
 for the catalog. This transition enhances the modularity and maintainability of our
 shared CI/CD resources, and avoids the complexities of contributing new CI/CD templates.
 If you need to update an existing template, you must also update the matching CI/CD component.
@@ -16,7 +16,7 @@ If no component exists that matches the CI/CD template yet, consider [creating t
 This ensures that template and component functionality remain in sync, aligning with
 our new development practices.
 
-This document explains how to develop [GitLab CI/CD templates](../../ci/examples/index.md#cicd-templates).
+This document explains how to develop [GitLab CI/CD templates](../../ci/examples/_index.md#cicd-templates).
 
 ## Requirements for CI/CD templates
 
diff --git a/doc/development/contributing/first_contribution/mr-review.md b/doc/development/contributing/first_contribution/mr-review.md
index bbdf86c5c6aaa1d2e84e973d25e79d3bbb3656eb..00d29fa3bb2eb236c6474c62eff34a89d1b4c975 100644
--- a/doc/development/contributing/first_contribution/mr-review.md
+++ b/doc/development/contributing/first_contribution/mr-review.md
@@ -44,7 +44,7 @@ Someone from GitLab will look at your request and let you know what the next ste
 
 ## Complete the review process
 
-After you create a merge request, GitLab automatically triggers a [CI/CD pipeline](../../../ci/pipelines/index.md)
+After you create a merge request, GitLab automatically triggers a [CI/CD pipeline](../../../ci/pipelines/_index.md)
 that runs tests, linting, security scans, and more.
 
 Your pipeline must be successful for your merge request to be merged.
diff --git a/doc/development/documentation/review_apps.md b/doc/development/documentation/review_apps.md
index fa84333bb48c8becafae8fbe60cd093f45af9350..f68ba3b961c2c55b48bda1eb52665303c86ba07a 100644
--- a/doc/development/documentation/review_apps.md
+++ b/doc/development/documentation/review_apps.md
@@ -6,7 +6,7 @@ description: Learn how documentation review apps work.
 title: Documentation review apps
 ---
 
-GitLab team members can deploy a [review app](../../ci/review_apps/index.md) for merge requests with documentation
+GitLab team members can deploy a [review app](../../ci/review_apps/_index.md) for merge requests with documentation
 changes. The review app helps you preview what the changes would look like if they were deployed to either:
 
 - The [GitLab Docs site](https://docs.gitlab.com).
diff --git a/doc/development/documentation/site_architecture/deployment_process.md b/doc/development/documentation/site_architecture/deployment_process.md
index 19a3845d3ab4852aafd6f0527e6764aa88fce14f..9c5ef2e5b4a2a6c91cec2642763f95aa441f2a5d 100644
--- a/doc/development/documentation/site_architecture/deployment_process.md
+++ b/doc/development/documentation/site_architecture/deployment_process.md
@@ -27,7 +27,7 @@ Documentation deployments have dependencies on pipelines and Docker images as fo
 - The Pages deployment pipelines depend on the latest documentation images (which, in turn, depend on the stable
   pipelines and images.)
 
-For general information on using Docker with CI/CD pipelines, see [Docker integration](../../../ci/docker/index.md).
+For general information on using Docker with CI/CD pipelines, see [Docker integration](../../../ci/docker/_index.md).
 
 ## Stable branches
 
diff --git a/doc/development/feature_flags/_index.md b/doc/development/feature_flags/_index.md
index 7db7e9da6fc7a103ed9dcaa95ffb71d864f0065b..de2f77805aba50198b6270753e5eefa7c96683e4 100644
--- a/doc/development/feature_flags/_index.md
+++ b/doc/development/feature_flags/_index.md
@@ -405,7 +405,7 @@ feature flag for you by applying this patch.
 
 ## List all the feature flags
 
-To [use ChatOps](../../ci/chatops/index.md) to output all the feature flags in an environment to Slack, you can use the `run feature list`
+To [use ChatOps](../../ci/chatops/_index.md) to output all the feature flags in an environment to Slack, you can use the `run feature list`
 command. For example:
 
 ```shell
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index ab9d4a765ba5710fe383741bff14fef92e048614..b26a69642a2ce93c7c7d1c9b09f7ea9f78c13ecb 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -39,7 +39,7 @@ easier to measure the impact of both separately.
 The GitLab feature library (using
 [Flipper](https://github.com/jnunemaker/flipper), and covered in the
 [Feature flags process](https://handbook.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/) guide) supports rolling out changes to a percentage of
-time to users. This in turn can be controlled using [GitLab ChatOps](../../ci/chatops/index.md).
+time to users. This in turn can be controlled using [GitLab ChatOps](../../ci/chatops/_index.md).
 
 For an up to date list of feature flag commands see
 [the source code](https://gitlab.com/gitlab-com/chatops/blob/master/lib/chatops/commands/feature.rb).
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 6c441dbe9e8d0267e3a869a6430222eee74945f3..e5e811acb72bb5347f569a66d2d75fa68512c80d 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -12,7 +12,7 @@ When implementing new features, refer to these existing features to avoid confli
 - [Merge request Templates](../user/project/description_templates.md#create-a-merge-request-template): `.gitlab/merge_request_templates/`.
 - [GitLab agent](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent): `.gitlab/agents/`.
 - [CODEOWNERS](../user/project/codeowners/index.md#set-up-code-owners): `.gitlab/CODEOWNERS`.
-- [Route Maps](../ci/review_apps/index.md#route-maps): `.gitlab/route-map.yml`.
+- [Route Maps](../ci/review_apps/_index.md#route-maps): `.gitlab/route-map.yml`.
 - [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-helm-chart-values): `.gitlab/auto-deploy-values.yaml`.
 - [Insights](../user/project/insights/index.md#configure-project-insights): `.gitlab/insights.yml`.
 - [Service Desk Templates](../user/project/service_desk/configure.md#customize-emails-sent-to-external-participants): `.gitlab/service_desk_templates/`.
diff --git a/doc/development/go_guide/_index.md b/doc/development/go_guide/_index.md
index fb2a6778c8b80e74764bc19cb3717e1eea9d5589..f0b7db204acc6d089fdb4f55cb9b13685c10a3f7 100644
--- a/doc/development/go_guide/_index.md
+++ b/doc/development/go_guide/_index.md
@@ -193,7 +193,7 @@ In some cases, such as building a Go project for it to act as a dependency of a
 CI run for another project, removing the `vendor/` directory means the code must
 be downloaded repeatedly, which can lead to intermittent problems due to rate
 limiting or network failures. In these circumstances, you should
-[cache the downloaded code between](../../ci/caching/index.md#cache-go-dependencies).
+[cache the downloaded code between](../../ci/caching/_index.md#cache-go-dependencies).
 
 There was a
 [bug on modules checksums](https://github.com/golang/go/issues/29278) in Go versions earlier than v1.11.4, so make
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 54d0fff0c4c42419193383a3fa5333c068a747b9..bc1c5f58e013fd416f833da24c9d3d4da8b721d2 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -6,7 +6,7 @@ title: Security scanner integration
 ---
 
 Integrating a security scanner into GitLab consists of providing end users
-with a [CI/CD job definition](../../ci/jobs/index.md)
+with a [CI/CD job definition](../../ci/jobs/_index.md)
 they can add to their CI/CD configuration files to scan their GitLab projects.
 This job should then output its results in a GitLab-specified format. These results are then
 automatically presented in various places in GitLab, such as the Pipeline view, merge request
diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md
index 10c45d76e44000c6d338553755fac9b54b6b0d85..25f041e917e589433721e5e34d86389dcd8ee74c 100644
--- a/doc/development/integrations/secure_partner_integration.md
+++ b/doc/development/integrations/secure_partner_integration.md
@@ -42,7 +42,7 @@ best place to integrate your own product and its results into GitLab.
   implications for app security, corporate policy, or compliance. When complete,
   the job reports back on its status and creates a
   [job artifact](../../ci/jobs/job_artifacts.md) as a result.
-- The [Merge Request Security Widget](../../ci/testing/index.md#security-reports)
+- The [Merge Request Security Widget](../../ci/testing/_index.md#security-reports)
   displays the results of the pipeline's security checks and the developer can
   review them. The developer can review both a summary and a detailed version
   of the results.
@@ -93,7 +93,7 @@ and complete an integration with the Secure stage.
      - If you need a new kind of scan or report, [create an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new#)
        and add the label `devops::secure`.
    - Once the job is completed, the data can be seen:
-      - In the [Merge Request Security Report](../../ci/testing/index.md#security-reports) ([MR Security Report data flow](https://gitlab.com/snippets/1910005#merge-request-view)).
+      - In the [Merge Request Security Report](../../ci/testing/_index.md#security-reports) ([MR Security Report data flow](https://gitlab.com/snippets/1910005#merge-request-view)).
       - While [browsing a Job Artifact](../../ci/jobs/job_artifacts.md).
       - In the [Security Dashboard](../../user/application_security/security_dashboard/index.md) ([Dashboard data flow](https://gitlab.com/snippets/1910005#project-and-group-dashboards)).
 1. Optional: Provide a way to interact with results as Vulnerabilities:
diff --git a/doc/development/pipelines/_index.md b/doc/development/pipelines/_index.md
index 7829e6b2c4d167718577057a41d5995d68f97f0f..49f12cc20e8c6331e4960c11285406c8f9fe59df 100644
--- a/doc/development/pipelines/_index.md
+++ b/doc/development/pipelines/_index.md
@@ -12,9 +12,9 @@ which itself includes files under
 for easier maintenance.
 
 We're striving to [dogfood](https://handbook.gitlab.com/handbook/engineering/development/principles/#dogfooding)
-GitLab [CI/CD features and best-practices](../../ci/index.md) as much as possible.
+GitLab [CI/CD features and best-practices](../../ci/_index.md) as much as possible.
 
-Do not use [CI/CD components](../../ci/components/index.md) in `gitlab-org/gitlab` pipelines
+Do not use [CI/CD components](../../ci/components/_index.md) in `gitlab-org/gitlab` pipelines
 unless they are mirrored on the `dev.gitlab.com` instance. CI/CD components do not work across different instances,
 and [cause failing pipelines](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/17683#note_1795756077)
 on the `dev.gitlab.com` mirror if they do not exist on that instance.
diff --git a/doc/development/pipelines/performance.md b/doc/development/pipelines/performance.md
index c2d397b8e80afd33be536b2ff7d565103fd55de4..59df92008a8321e4bf640b9c41e15c4fd365ef1a 100644
--- a/doc/development/pipelines/performance.md
+++ b/doc/development/pipelines/performance.md
@@ -83,7 +83,7 @@ set `CI_FETCH_REPO_GIT_STRATEGY` to `none`.
    - `.qa-cache`
    - `.yarn-cache`
    - `.assets-compile-cache` (the key includes `${NODE_ENV}` so it's actually two different caches).
-1. These cache definitions are composed of [multiple atomic caches](../../ci/caching/index.md#use-multiple-caches).
+1. These cache definitions are composed of [multiple atomic caches](../../ci/caching/_index.md#use-multiple-caches).
 1. Only the following jobs, running in 2-hourly `maintenance` scheduled pipelines, are pushing (that is, updating) to the caches:
    - `update-setup-test-env-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
    - `update-gitaly-binaries-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
diff --git a/doc/install/aws/_index.md b/doc/install/aws/_index.md
index 05b0750e0835a79ebbbe99442d1591e9d7fca9e6..b66a6766ec311e0cde93b8aaf49d0d6bd1462d2c 100644
--- a/doc/install/aws/_index.md
+++ b/doc/install/aws/_index.md
@@ -842,7 +842,7 @@ that you can ping and get reports.
 
 ## GitLab Runner
 
-If you want to take advantage of [GitLab CI/CD](../../ci/index.md), you have to
+If you want to take advantage of [GitLab CI/CD](../../ci/_index.md), you have to
 set up at least one [runner](https://docs.gitlab.com/runner/).
 
 Read more on configuring an
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index 2e06dfd2a8c4b844b0fd0427384ebf2650d65c32..d18772b359a5a505dc911bb86c6b779258f0d8ab 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -16,7 +16,7 @@ building, deploying and automating projects.
 
 You should use a Jenkins integration with GitLab when:
 
-- You plan to migrate your CI from Jenkins to [GitLab CI/CD](../ci/index.md)
+- You plan to migrate your CI from Jenkins to [GitLab CI/CD](../ci/_index.md)
   in the future, but need an interim solution.
 - You're invested in [Jenkins plugins](https://plugins.jenkins.io/) and choose
   to keep using Jenkins to build your apps.
@@ -25,7 +25,7 @@ This integration can trigger a Jenkins build when a change is pushed to GitLab.
 
 You cannot use this integration to trigger GitLab CI/CD pipelines from Jenkins. Instead,
 use the [pipeline triggers API endpoint](../api/pipeline_triggers.md) in a Jenkins job,
-authenticated with a [pipeline trigger token](../ci/triggers/index.md#create-a-pipeline-trigger-token).
+authenticated with a [pipeline trigger token](../ci/triggers/_index.md#create-a-pipeline-trigger-token).
 
 After you have configured a Jenkins integration, you trigger a build in Jenkins
 when you push code to your repository or create a merge request in GitLab. The
diff --git a/doc/security/hardening_cicd_recommendations.md b/doc/security/hardening_cicd_recommendations.md
index c8288c2aeb584f4fb1ff4d807e682782f64aa316..bffa6cd3c2c8636ef4ad50a21e6bb293ab88acd8 100644
--- a/doc/security/hardening_cicd_recommendations.md
+++ b/doc/security/hardening_cicd_recommendations.md
@@ -25,7 +25,7 @@ information to help harden the CI/CD process.
   container technology should be used, such as GCP Secret Manager, AWS KMS, or
   HashiCorp Vault. For self-managed and standalone instances, HashiCorp Vault is
   recommended, and many GitLab features can take advantage of Vault and are well
-  documented in the main [Documentation](../index.md). For detailed CI/CD examples, see [using external secrets in CI](../ci/secrets/index.md).
+  documented in the main [Documentation](../index.md). For detailed CI/CD examples, see [using external secrets in CI](../ci/secrets/_index.md).
 - **External Communications**. If your CI/CD process requires connectivity to other
   hosts, ensure that these communication channels are encrypted. You should use TLS 1.2 or 1.3, and where possible implement mutual TLS.
 - **Logging**. Logging can be very important for auditing and troubleshooting, so it
@@ -45,7 +45,7 @@ By default, only the default branch gets a protected pipeline. An owner of a pro
 can ensure that other branches are protected by
 [configuring a protected branch](../user/project/repository/branches/protected.md).
 This allows for more restricted security on pipelines. For more information, see
-[pipeline security on a protected branch](../ci/pipelines/index.md#pipeline-security-on-protected-branches).
+[pipeline security on a protected branch](../ci/pipelines/_index.md#pipeline-security-on-protected-branches).
 
 Deployment is the part of the CI/CD that deploys the results of the pipeline in
 relationship to a given environment. Default settings do not impose many
diff --git a/doc/security/hardening_nist_800_53.md b/doc/security/hardening_nist_800_53.md
index a5fe5873b993167a8214aee31d70d7167e8ce30d..7224c93fe6a2352b7a2a256f5ef29a185ca08026 100644
--- a/doc/security/hardening_nist_800_53.md
+++ b/doc/security/hardening_nist_800_53.md
@@ -420,7 +420,7 @@ may violate an established authorization boundary where federal data is
 permitted to be stored and processed. GitLab provides runner container
 images configured to run on FIPS-enabled systems. GitLab provides
 hardening guidance for pipelines, including how to [configure protected branches](../user/project/repository/branches/protected.md)
-and [implement pipeline security](../ci/pipelines/index.md#pipeline-security-on-protected-branches).
+and [implement pipeline security](../ci/pipelines/_index.md#pipeline-security-on-protected-branches).
 Additionally, customers may want to consider assigning [required checks](../user/project/merge_requests/status_checks.md)
 before merging code to ensure that all checks have passed prior to
 updating the code.
diff --git a/doc/security/tokens/_index.md b/doc/security/tokens/_index.md
index 847e8a1ed0cb9a7a011b8e3a2be0b0f5ec9953f0..b1dd174e7ce06e9a21388e617153ba9743ae260b 100644
--- a/doc/security/tokens/_index.md
+++ b/doc/security/tokens/_index.md
@@ -31,7 +31,7 @@ To keep your tokens secure:
 Do not:
 
 - Store tokens in plaintext in your projects. If the token is an external secret for GitLab CI/CD,
-  review how to [use external secrets in CI/CD](../../ci/secrets/index.md) recommendations.
+  review how to [use external secrets in CI/CD](../../ci/secrets/_index.md) recommendations.
 - Include tokens when pasting code, console commands, or log outputs into an issue, MR description, comment, or any other free text inputs.
 - Log credentials in the console logs or artifacts. Consider [protecting](../../ci/variables/_index.md#protect-a-cicd-variable) and
   [masking](../../ci/variables/_index.md#mask-a-cicd-variable) your credentials.
diff --git a/doc/solutions/cloud/aws/gitlab_aws_integration.md b/doc/solutions/cloud/aws/gitlab_aws_integration.md
index ced00c1a3843eb5be68c1d4b3cfc7366fc4526dc..53e0df4107368e8c2ba16f69783321d47ffd5b71 100644
--- a/doc/solutions/cloud/aws/gitlab_aws_integration.md
+++ b/doc/solutions/cloud/aws/gitlab_aws_integration.md
@@ -147,7 +147,7 @@ Top-level groups on GitLab.com are also known as "Namespaces" and naming one aft
 
 ### Runner workload authentication and authorization integration
 
-- [Runner Job Authentication using Open ID & JWT Authentication](../../../ci/cloud_services/aws/index.md). `[GitLab Built]`
+- [Runner Job Authentication using Open ID & JWT Authentication](../../../ci/cloud_services/aws/_index.md). `[GitLab Built]`
   - [Configure OpenID Connect between GitLab and AWS](https://gitlab.com/guided-explorations/aws/configure-openid-connect-in-aws) `[GitLab Solution]` `[CI Solution]`
   - [OIDC and Multi-Account Deployment with GitLab and ECS](https://gitlab.com/guided-explorations/aws/oidc-and-multi-account-deployment-with-ecs) `[GitLab Solution]` `[CI Solution]`
 
diff --git a/doc/subscriptions/gitlab_com/_index.md b/doc/subscriptions/gitlab_com/_index.md
index d5b65bdbd6d09212ae523e5c5280b785fc9ae8f1..e0332a73f8f5a6475414d9c79255c170cf79237e 100644
--- a/doc/subscriptions/gitlab_com/_index.md
+++ b/doc/subscriptions/gitlab_com/_index.md
@@ -385,7 +385,7 @@ You cannot transfer:
 ## Compute minutes
 
 [Compute minutes](../../ci/pipelines/compute_minutes.md) is the resource consumed when running
-[CI/CD pipelines](../../ci/index.md) on GitLab instance runners. If you run out of compute minutes,
+[CI/CD pipelines](../../ci/_index.md) on GitLab instance runners. If you run out of compute minutes,
 you can [purchase additional compute minutes](compute_minutes.md).
 
 ## Enterprise Agile Planning
diff --git a/doc/subscriptions/gitlab_com/compute_minutes.md b/doc/subscriptions/gitlab_com/compute_minutes.md
index dae7265b6c5c2d8f11525e50d4d98e5920489511..252b3ff82e9dced2c34e38dc87578ef1ee492234 100644
--- a/doc/subscriptions/gitlab_com/compute_minutes.md
+++ b/doc/subscriptions/gitlab_com/compute_minutes.md
@@ -10,7 +10,7 @@ DETAILS:
 **Offering:** GitLab.com
 
 [Compute minutes](../../ci/pipelines/compute_minutes.md) is the resource consumed
-when running [CI/CD pipelines](../../ci/index.md) on GitLab instance runners. You can find
+when running [CI/CD pipelines](../../ci/_index.md) on GitLab instance runners. You can find
 pricing for additional compute minutes on the [GitLab Pricing page](https://about.gitlab.com/pricing/#compute-minutes).
 
 Additional compute minutes:
diff --git a/doc/topics/autodevops/_index.md b/doc/topics/autodevops/_index.md
index dd6c07652f72c6f40d167624102db4980c5e626a..233ba0719c97dabb71840244598d49156c9ff407 100644
--- a/doc/topics/autodevops/_index.md
+++ b/doc/topics/autodevops/_index.md
@@ -180,7 +180,7 @@ installation pods at runtime.
 
 ## Related topics
 
-- [Continuous methodologies](../../ci/index.md)
+- [Continuous methodologies](../../ci/_index.md)
 - [Docker](https://docs.docker.com)
 - [GitLab Runner](https://docs.gitlab.com/runner/)
 - [Helm](https://helm.sh/docs/)
diff --git a/doc/topics/autodevops/cicd_variables.md b/doc/topics/autodevops/cicd_variables.md
index 11a6964b0e7175e6ed5e7f9ff16c5a986249053e..38047cce4c1282c61423c45619a7d05e6f3dee59 100644
--- a/doc/topics/autodevops/cicd_variables.md
+++ b/doc/topics/autodevops/cicd_variables.md
@@ -270,7 +270,7 @@ DETAILS:
 You can use a [canary environment](../../user/project/canary_deployments.md) before
 deploying any changes to production.
 
-If you set `CANARY_ENABLED`, GitLab creates two [manual jobs](../../ci/pipelines/index.md#add-manual-interaction-to-your-pipeline):
+If you set `CANARY_ENABLED`, GitLab creates two [manual jobs](../../ci/pipelines/_index.md#add-manual-interaction-to-your-pipeline):
 
 - `canary` - Deploys the application to the canary environment.
 - `production_manual` - Deploys the application to production.
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_ec2.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_ec2.md
index 90c13c8ec5b4fa5eff5918dfd358033ee8fdfda9..a6e7c4e30f5df9d00b84d9d0f18fe6e205ce78f9 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_ec2.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_ec2.md
@@ -7,7 +7,7 @@ title: Use Auto DevOps to deploy to EC2
 
 To use [Auto DevOps](../_index.md) to deploy to EC2:
 
-1. Define [your AWS credentials as CI/CD variables](../../../ci/cloud_deployment/index.md#authenticate-gitlab-with-aws).
+1. Define [your AWS credentials as CI/CD variables](../../../ci/cloud_deployment/_index.md#authenticate-gitlab-with-aws).
 1. In your `.gitlab-ci.yml` file, reference the `Auto-Devops.gitlab-ci.yml` template.
 1. Define a job for the `build` stage named `build_artifact`. For example:
 
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_ecs.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_ecs.md
index ce4e00b24b639fe5a35a86ca1ac5c5fd06674485..a2b0e0022b48396677d4fbdae7550b9d3d53a2f4 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_ecs.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_ecs.md
@@ -19,7 +19,7 @@ To do so, follow these steps:
    - `ECS` if you're not enforcing any launch type check when deploying to ECS.
 
 When you trigger a pipeline, if you have Auto DevOps enabled and if you have correctly
-[entered AWS credentials as variables](../../../ci/cloud_deployment/index.md#authenticate-gitlab-with-aws),
+[entered AWS credentials as variables](../../../ci/cloud_deployment/_index.md#authenticate-gitlab-with-aws),
 your application is deployed to AWS ECS.
 
 If you have both a valid `AUTO_DEVOPS_PLATFORM_TARGET` variable and a Kubernetes cluster tied to your project,
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
index d15b25f8cf2fc58d2ae6f58d64323a7c5d3d9ef3..6bc269b1077e1e611686bf2cc7f761f9353aacb8 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_eks.md
@@ -12,7 +12,7 @@ The tutorial uses the GitLab native Kubernetes integration, so you don't need
 to create a Kubernetes cluster manually using the AWS console.
 
 You can also follow this tutorial on a self-managed instance.
-Ensure your own [runners are configured](../../../ci/runners/index.md).
+Ensure your own [runners are configured](../../../ci/runners/_index.md).
 
 To deploy a project to EKS:
 
diff --git a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
index 2738960a7568089400789fc44664319cd10ce629..cd772ee8b084f9be3473d4c13232da3f4d2a18e8 100644
--- a/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
+++ b/doc/topics/autodevops/cloud_deployments/auto_devops_with_gke.md
@@ -17,7 +17,7 @@ to create a Kubernetes cluster manually using the Google Cloud Platform console.
 You are creating and deploying an application that you create from a GitLab template.
 
 These instructions also work for GitLab Self-Managed.
-Ensure your own [runners are configured](../../../ci/runners/index.md) and
+Ensure your own [runners are configured](../../../ci/runners/_index.md) and
 [Google OAuth is enabled](../../../integration/google.md).
 
 To deploy a project to Google Kubernetes Engine, follow the steps below:
diff --git a/doc/topics/autodevops/multiple_clusters_auto_devops.md b/doc/topics/autodevops/multiple_clusters_auto_devops.md
index 7c051c1f8064b036ee8386e08f3ca6ae8442cca7..0776ef2fba548cb685b745b91ba9c846ecd1be3e 100644
--- a/doc/topics/autodevops/multiple_clusters_auto_devops.md
+++ b/doc/topics/autodevops/multiple_clusters_auto_devops.md
@@ -46,7 +46,7 @@ NOTE:
 
 | Cluster name | Cluster environment scope | `KUBE_INGRESS_BASE_DOMAIN` value | `KUBE CONTEXT` value               | Variable environment scope | Notes |
 | :------------| :-------------------------| :------------------------------- | :--------------------------------- | :--------------------------|:--|
-| review       | `review/*`                | `review.example.com`             | `path/to/project:review-agent`     | `review/*`                 | A review cluster that runs all [review apps](../../ci/review_apps/index.md).|
+| review       | `review/*`                | `review.example.com`             | `path/to/project:review-agent`     | `review/*`                 | A review cluster that runs all [review apps](../../ci/review_apps/_index.md). |
 | staging      | `staging`                 | `staging.example.com`            | `path/to/project:staging-agent`    | `staging`                  | Optional. A staging cluster that runs the deployments of the staging environments. You must [enable it first](cicd_variables.md#deploy-policy-for-staging-and-production-environments). |
 | production   | `production`              | `example.com`                    | `path/to/project:production-agent` | `production`               | A production cluster that runs the production environment deployments. You can use [incremental rollouts](cicd_variables.md#incremental-rollout-to-production). |
 
diff --git a/doc/topics/autodevops/prepare_deployment.md b/doc/topics/autodevops/prepare_deployment.md
index 8b9568ce79a69091100393324eebcbe849e44255..47a6521778a1220f0c5547df60c55c323787bc1b 100644
--- a/doc/topics/autodevops/prepare_deployment.md
+++ b/doc/topics/autodevops/prepare_deployment.md
@@ -16,7 +16,7 @@ recommend that you prepare them before enabling Auto DevOps.
 ## Deployment strategy
 
 When using Auto DevOps to deploy your applications, choose the
-[continuous deployment strategy](../../ci/index.md)
+[continuous deployment strategy](../../ci/_index.md)
 that works best for your needs:
 
 | Deployment strategy | Setup | Methodology |
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 175500525e458511b3fc37ebb19ba6c37ee35752..ac7472a53c2edb9908b14f2c8b2e783bdab04218 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -31,7 +31,7 @@ To prepare the deployment:
 ## Auto DevOps deployment strategy
 
 When using Auto DevOps to deploy your applications, choose the
-[continuous deployment strategy](../../ci/index.md)
+[continuous deployment strategy](../../ci/_index.md)
 that works best for your needs:
 
 | Deployment strategy | Setup | Methodology |
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index 2c454dddc06deb55c69cde684b658aa5fbe52268..b9f3567de941f02bb85e2efeed3c6b8fca0c36c1 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -224,7 +224,7 @@ This is an optional step, since many projects don't have a Kubernetes cluster
 available. If the [requirements](requirements.md) are not met, the job is
 silently skipped.
 
-[Review apps](../../ci/review_apps/index.md) are temporary application environments based on the
+[Review apps](../../ci/review_apps/_index.md) are temporary application environments based on the
 branch's code so developers, designers, QA, product managers, and other
 reviewers can actually see and interact with code changes as part of the review
 process. Auto Review Apps create a Review App for each branch.
diff --git a/doc/topics/build_your_application.md b/doc/topics/build_your_application.md
index 33ea2f8a9d937e7c4bea12cb1133894c393ead9a..0ef6406be82603e1cb64a3824645a10da87793d5 100644
--- a/doc/topics/build_your_application.md
+++ b/doc/topics/build_your_application.md
@@ -10,8 +10,8 @@ Use CI/CD to generate your application.
 
 |                                                                                                                      |                                                                                                                                                    |                                                                                                                           |
 |----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|
-| [**Getting started**](../ci/index.md)<br>Overview of how CI/CD features fit together.                                | [**CI/CD YAML syntax reference**](../ci/yaml/_index.md)<br>Pipeline configuration keywords, syntax, examples, inputs.                               | [**Runners**](../ci/runners/index.md)<br>Configuration, job execution.                                                    |
-| [**Pipelines**](../ci/pipelines/index.md)<br>Configuration, automation, stages, schedules, efficiency.               | [**Jobs**](../ci/jobs/index.md)<br>Configuration, rules, caching, artifacts, logs.                                                                 | [**CI/CD components**](../ci/components/index.md)<br>Reusable, versioned CI/CD components for pipelines.                  |
+| [**Getting started**](../ci/_index.md)<br>Overview of how CI/CD features fit together.                               | [**CI/CD YAML syntax reference**](../ci/yaml/_index.md)<br>Pipeline configuration keywords, syntax, examples, inputs.                               | [**Runners**](../ci/runners/_index.md)<br>Configuration, job execution.                                                   |
+| [**Pipelines**](../ci/pipelines/_index.md)<br>Configuration, automation, stages, schedules, efficiency.              | [**Jobs**](../ci/jobs/_index.md)<br>Configuration, rules, caching, artifacts, logs.                                                                | [**CI/CD components**](../ci/components/_index.md)<br>Reusable, versioned CI/CD components for pipelines.                  |
 | [**CI/CD variables**](../ci/variables/_index.md)<br>Configuration, usage, security.                                   | [**Pipeline security**](../ci/pipelines/pipeline_security.md)<br>Secrets management, job tokens, secure files, cloud security.                     | [**Debugging**](../ci/debugging.md)<br>Configuration validation, warnings, errors, troubleshooting.                       |
-| [**Auto DevOps**](autodevops/_index.md)<br>Automated DevOps, language detection, deployment, customization.           | [**Testing**](../ci/testing/index.md)<br>Unit tests, integration tests, test reports, coverage, quality assurance.                                 | [**Google cloud integration**](../ci/gitlab_google_cloud_integration/index.md)<br>Cloud services, Kubernetes deployments. |
-| [**Migrate to GitLab CI/CD**](../ci/migration/plan_a_migration.md)<br> Migrate from Jenkins, GitHub Actions, others. | [**External repository integrations**](../ci/ci_cd_for_external_repos/index.md)<br>GitHub, Bitbucket, external sources, mirroring, cross-platform. |                                                                                                                           |
+| [**Auto DevOps**](autodevops/_index.md)<br>Automated DevOps, language detection, deployment, customization.           | [**Testing**](../ci/testing/_index.md)<br>Unit tests, integration tests, test reports, coverage, quality assurance.                                | [**Google cloud integration**](../ci/gitlab_google_cloud_integration/_index.md)<br>Cloud services, Kubernetes deployments. |
+| [**Migrate to GitLab CI/CD**](../ci/migration/plan_a_migration.md)<br> Migrate from Jenkins, GitHub Actions, others. | [**External repository integrations**](../ci/ci_cd_for_external_repos/_index.md)<br>GitHub, Bitbucket, external sources, mirroring, cross-platform. |                                                                                                                           |
diff --git a/doc/topics/release_your_application.md b/doc/topics/release_your_application.md
index f2a69da438f23272aa1ccce4e51554c4c751b205..6393f1be9fc7b2c3b473aa985e550b759d83ac88 100644
--- a/doc/topics/release_your_application.md
+++ b/doc/topics/release_your_application.md
@@ -28,7 +28,7 @@ release features incrementally.
   deployment using GitLab CI/CD. Auto Deploy has built-in support for EC2 and ECS deployments.
 - Deploy to Kubernetes clusters by using the [GitLab agent](../user/clusters/agent/install/_index.md).
 - Use Docker images to run AWS commands from GitLab CI/CD, and a template to
-  facilitate [deployment to AWS](../ci/cloud_deployment/index.md).
+  facilitate [deployment to AWS](../ci/cloud_deployment/_index.md).
 - Use GitLab CI/CD to target any type of infrastructure accessible by GitLab Runner.
   [User and pre-defined environment variables](../ci/variables/_index.md) and CI/CD templates
   support setting up a vast number of deployment strategies.
diff --git a/doc/tutorials/build_application.md b/doc/tutorials/build_application.md
index 862c316468b64e45dbab9d1b08a73cd940f89471..74bb4912c873afd0a56df40c03805391c5527cb1 100644
--- a/doc/tutorials/build_application.md
+++ b/doc/tutorials/build_application.md
@@ -12,14 +12,14 @@ Use CI/CD pipelines to automatically build, test, and deploy your code.
 
 | Topic | Description | Good for beginners |
 |-------|-------------|--------------------|
-| [Create and run your first GitLab CI/CD pipeline](../ci/quick_start/index.md) | Create a `.gitlab-ci.yml` file and start a pipeline. | **{star}** |
+| [Create and run your first GitLab CI/CD pipeline](../ci/quick_start/_index.md) | Create a `.gitlab-ci.yml` file and start a pipeline. | **{star}** |
 | [Create a complex pipeline](../ci/quick_start/tutorial.md) | Learn about the most commonly used GitLab CI/CD keywords by building an increasingly complex pipeline. |  |
 | <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Get started: Learn about CI/CD](https://www.youtube.com/watch?v=sIegJaLy2ug) (9m 02s) | Learn about the `.gitlab-ci.yml` file and how it's used. | **{star}** |
 | [GitLab CI Fundamentals](https://university.gitlab.com/learn/learning-path/gitlab-ci-fundamentals) | Learn about GitLab CI/CD and build a pipeline in this self-paced course. | **{star}** |
 | <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [CI deep dive](https://www.youtube.com/watch?v=ZVUbmVac-m8&list=PL05JrBw4t0KorkxIFgZGnzzxjZRCGROt_&index=27) (22m 51s) | Take a closer look at pipelines and continuous integration concepts. | |
-| [Set up CI/CD in the cloud](../ci/examples/index.md#cicd-in-the-cloud) | Learn how to set up CI/CD in different cloud-based environments. | |
+| [Set up CI/CD in the cloud](../ci/examples/_index.md#cicd-in-the-cloud) | Learn how to set up CI/CD in different cloud-based environments. | |
 | [Create a GitLab pipeline to push to Google Artifact Registry](create_gitlab_pipeline_push_to_google_artifact_registry/_index.md) | Learn how to connect GitLab to Google Cloud and create a pipeline to push images to Artifact Registry. | |
-| [Find CI/CD examples and templates](../ci/examples/index.md#cicd-examples)  | Use these examples and templates to set up CI/CD for your use case. | |
+| [Find CI/CD examples and templates](../ci/examples/_index.md#cicd-examples)  | Use these examples and templates to set up CI/CD for your use case. | |
 | <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Understand CI/CD rules](https://www.youtube.com/watch?v=QjQc-zeL16Q) (8m 56s) |  Learn more about how to use CI/CD rules. | |
 | [Use Auto DevOps to deploy an application](../topics/autodevops/cloud_deployments/auto_devops_with_gke.md)  | Deploy an application to Google Kubernetes Engine (GKE). | |
 | [Using Buildah in a rootless container with GitLab Runner Operator on OpenShift](../ci/docker/buildah_rootless_tutorial.md)  | Learn how to set up GitLab Runner Operator on OpenShift to build Docker images with Buildah in a rootless container | |
diff --git a/doc/tutorials/compliance_pipeline/_index.md b/doc/tutorials/compliance_pipeline/_index.md
index 358c511ab53f38e1cc991b8c9374cd2d2d762292..81411e38ab9d38c4cdbc97f9b462fd5c30cd0dce 100644
--- a/doc/tutorials/compliance_pipeline/_index.md
+++ b/doc/tutorials/compliance_pipeline/_index.md
@@ -2,12 +2,11 @@
 stage: Software Supply Chain Security
 group: Compliance
 info: For assistance with this tutorial, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments-to-other-projects-and-subjects.
+title: 'Tutorial: Create a compliance pipeline (deprecated)'
 ---
 
 <!--- start_remove The following content will be removed on remove_date: '2025-08-15' -->
 
-# Tutorial: Create a compliance pipeline (deprecated)
-
 DETAILS:
 **Tier:** Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
diff --git a/doc/tutorials/container_scanning/_index.md b/doc/tutorials/container_scanning/_index.md
index 3612da265e909ce9ec1a7b5f03aab134912a1177..296196752ed0a831b1adf11912981585dcfeca70 100644
--- a/doc/tutorials/container_scanning/_index.md
+++ b/doc/tutorials/container_scanning/_index.md
@@ -55,7 +55,7 @@ Now you're ready to create pipeline configuration. The pipeline configuration:
 
 1. Builds a Docker image from the `Dockerfile` file, and pushes the Docker image to the container registry. The
    `build-image` job uses [Docker-in-Docker](../../ci/docker/using_docker_build.md) as a
-   [CI/CD service](../../ci/services/index.md) to build the Docker image. You can also
+   [CI/CD service](../../ci/services/_index.md) to build the Docker image. You can also
    [use kaniko](../../ci/docker/using_kaniko.md) to build Docker images in a pipeline.
 1. Includes the `Container-Scanning.gitlab-ci.yml` template, to scan the Docker image stored in the container registry.
 
diff --git a/doc/tutorials/create_and_deploy_web_service_with_google_cloud_run_component/_index.md b/doc/tutorials/create_and_deploy_web_service_with_google_cloud_run_component/_index.md
index a629f4d4db24aba4d72ba15c1e39054a2ca3ff2c..f76e71f4e79dd6bb4bf887cca1c85dc2b24c5c0c 100644
--- a/doc/tutorials/create_and_deploy_web_service_with_google_cloud_run_component/_index.md
+++ b/doc/tutorials/create_and_deploy_web_service_with_google_cloud_run_component/_index.md
@@ -141,7 +141,7 @@ registry, copies the image to Google Artifact Registry, and uses Cloud Run to de
 Google Cloud infrastructure.
 
 1. In your GitLab project, create a
-   [`.gitlab-ci.yml` file](../../ci/quick_start/index.md#create-a-gitlab-ciyml-file).
+   [`.gitlab-ci.yml` file](../../ci/quick_start/_index.md#create-a-gitlab-ciyml-file).
 
 1. To create a pipeline that builds your image, pushes it to the GitLab container
    registry, copies it to Google Artifact Registry, and uses Cloud Run to deploy,
diff --git a/doc/tutorials/create_gitlab_pipeline_push_to_google_artifact_registry/_index.md b/doc/tutorials/create_gitlab_pipeline_push_to_google_artifact_registry/_index.md
index c821466774fe9b699102010683cb84e0b137ff1e..1c2c7f7fd6e4aa006cbc1b6308429a1928788f84 100644
--- a/doc/tutorials/create_gitlab_pipeline_push_to_google_artifact_registry/_index.md
+++ b/doc/tutorials/create_gitlab_pipeline_push_to_google_artifact_registry/_index.md
@@ -109,7 +109,7 @@ Create a pipeline that builds your Docker image, pushes it to the GitLab contain
 registry, and copies the image to Google Artifact Registry.
 
 1. In your GitLab project, create a
-   [`.gitlab-ci.yml` file](../../ci/quick_start/index.md#create-a-gitlab-ciyml-file).
+   [`.gitlab-ci.yml` file](../../ci/quick_start/_index.md#create-a-gitlab-ciyml-file).
 
 1. To create a pipeline that builds your image, pushes it to the GitLab container
    registry, and copies it to Google Artifact Registry, modify the contents of your
diff --git a/doc/tutorials/hugo/_index.md b/doc/tutorials/hugo/_index.md
index b0f613a5c5284bcf99a706690703d9c33e9080b2..733da22327842f92a6fed5a31f159e7415a16f24 100644
--- a/doc/tutorials/hugo/_index.md
+++ b/doc/tutorials/hugo/_index.md
@@ -169,4 +169,4 @@ You've built, tested, and deployed your Hugo site with GitLab. Great work!
 
 Every time you change your site and push it to GitLab, your site is built, tested, and deployed automatically.
 
-To learn more about CI/CD pipelines, try [this tutorial on how to create a complex pipeline](../../ci/quick_start/tutorial.md). You can also learn more about the [different types of testing available](../../ci/testing/index.md).
+To learn more about CI/CD pipelines, try [this tutorial on how to create a complex pipeline](../../ci/quick_start/tutorial.md). You can also learn more about the [different types of testing available](../../ci/testing/_index.md).
diff --git a/doc/tutorials/merge_requests/homepage.md b/doc/tutorials/merge_requests/homepage.md
index 8c6e269bdaf4d7cea17fbd8c433d94326fd52fdc..bc80bbcf8fa62ae00e1d2efe2d8e1f26ba073be1 100644
--- a/doc/tutorials/merge_requests/homepage.md
+++ b/doc/tutorials/merge_requests/homepage.md
@@ -2,8 +2,8 @@
 stage: Create
 group: Code Review
 info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
-title: "Merge request homepage"
 description: "How the GitLab UI helps you track merge requests from creation to merging."
+title: 'Merge request homepage'
 ---
 
 DETAILS:
diff --git a/doc/tutorials/protected_workflow/_index.md b/doc/tutorials/protected_workflow/_index.md
index 593bfe60ad7e7ad584d7e1110d8ef9c398f81ead..b45be74c902617b015b0d313062a8b7b05e4d7b0 100644
--- a/doc/tutorials/protected_workflow/_index.md
+++ b/doc/tutorials/protected_workflow/_index.md
@@ -3,12 +3,11 @@ stage: Create
 group: Code Review
 info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments"
 description: "Use this tutorial to build a protected workflow for your GitLab project."
+title: 'Tutorial: Build a protected workflow for your project'
 ---
 
 <!-- vale gitlab_base.FutureTense = NO -->
 
-# Tutorial: Build a protected workflow for your project
-
 DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
diff --git a/doc/tutorials/setup_steps/_index.md b/doc/tutorials/setup_steps/_index.md
index 647c918d8e5a3b453be9d8a6b5dc7fa8a791b98f..dea12752f12185563790c621811c9060f49a473c 100644
--- a/doc/tutorials/setup_steps/_index.md
+++ b/doc/tutorials/setup_steps/_index.md
@@ -347,4 +347,4 @@ The echo step takes a single input `echo`, prints it to the logs, and outputs it
    ```
 
 That's it! You've just created and implemented steps in your pipeline.
-For more information about the syntax for steps, see [CI/CD Steps](../../ci/steps/index.md).
+For more information about the syntax for steps, see [CI/CD Steps](../../ci/steps/_index.md).
diff --git a/doc/user/application_security/api_fuzzing/configuration/requirements.md b/doc/user/application_security/api_fuzzing/configuration/requirements.md
index 12cbca1d3efa979cde2a672e94de9a6b91db40ef..1ab1ae75b5214bb723ecf0eda675f4dd247934bf 100644
--- a/doc/user/application_security/api_fuzzing/configuration/requirements.md
+++ b/doc/user/application_security/api_fuzzing/configuration/requirements.md
@@ -16,7 +16,7 @@ title: Requirements
   - [GraphQL Schema](enabling_the_analyzer.md#graphql-schema)
   - [HTTP Archive (HAR)](enabling_the_analyzer.md#http-archive-har)
   - [Postman Collection v2.0 or v2.1](enabling_the_analyzer.md#postman-collection)
-- [GitLab Runner](../../../../ci/runners/index.md) available, with the
+- [GitLab Runner](../../../../ci/runners/_index.md) available, with the
   [`docker` executor](https://docs.gitlab.com/runner/executors/docker.html) on Linux/amd64.
 - Target application deployed. For more details, read [Deployment options](#application-deployment-options).
 - `fuzz` stage added to the CI/CD pipeline definition. This should be added after the deploy step, for example:
@@ -62,7 +62,7 @@ on how to configure review apps for DAST.
 
 If your application uses Docker containers you have another option for deploying and scanning with API Fuzzing.
 After your Docker build job completes and your image is added to your container registry, you can use the image as a
-[service](../../../../ci/services/index.md).
+[service](../../../../ci/services/_index.md).
 
 By using service definitions in your `.gitlab-ci.yml`, you can scan services with the DAST analyzer.
 
diff --git a/doc/user/application_security/api_fuzzing/create_har_files.md b/doc/user/application_security/api_fuzzing/create_har_files.md
index 06b8a94cf629be05c88caa8df465a2a94a0dc96a..570b6b41a73bf5b2f4356b23632687d80307cf13 100644
--- a/doc/user/application_security/api_fuzzing/create_har_files.md
+++ b/doc/user/application_security/api_fuzzing/create_har_files.md
@@ -14,7 +14,7 @@ requests and HTTP responses. A HAR file's content is JSON formatted, containing
 with a web site. The file extension `.har` is commonly used.
 
 The HAR files can be used to perform [web API Fuzz Testing](configuration/enabling_the_analyzer.md#http-archive-har) as part of
-your [GitLab CI/CD](../../../ci/index.md) pipelines.
+your [GitLab CI/CD](../../../ci/_index.md) pipelines.
 
 WARNING:
 A HAR file stores information exchanged between web client and web server. It could also
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index ab8fa9913a153fdcac83a997147f272ae14c4750..b5bea2e2615bc8a6526bf78176b3be11e7d97cf8 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -15,7 +15,7 @@ backend. This helps you discover bugs and potential security issues that other Q
 miss.
 
 We recommend that you use fuzz testing in addition to [GitLab Secure](../index.md)'s
-other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
+other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/_index.md),
 you can run fuzz tests as part your CI/CD workflow.
 
 <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
diff --git a/doc/user/application_security/api_security_testing/configuration/requirements.md b/doc/user/application_security/api_security_testing/configuration/requirements.md
index 4752c0fb59108851f6b1feefb8ef7f0e1312cce1..640aef018ad07abd8e501d4b204e7fd130e8f76e 100644
--- a/doc/user/application_security/api_security_testing/configuration/requirements.md
+++ b/doc/user/application_security/api_security_testing/configuration/requirements.md
@@ -18,7 +18,7 @@ title: Requirements
   - [Postman Collection v2.0 or v2.1](enabling_the_analyzer.md#postman-collection)
 
   Each scan supports exactly one specification. To scan more than one specification, use multiple scans.
-- [GitLab Runner](../../../../ci/runners/index.md) available, with the
+- [GitLab Runner](../../../../ci/runners/_index.md) available, with the
   [`docker` executor](https://docs.gitlab.com/runner/executors/docker.html) on Linux/amd64.
 - Target application deployed. For more details, read [Deployment options](#application-deployment-options).
 - `dast` stage added to the CI/CD pipeline definition. This should be added after the deploy step, for example:
@@ -64,7 +64,7 @@ on how to configure review apps for DAST.
 
 If your application uses Docker containers you have another option for deploying and scanning with DAST.
 After your Docker build job completes and your image is added to your container registry, you can use the image as a
-[service](../../../../ci/services/index.md).
+[service](../../../../ci/services/_index.md).
 
 By using service definitions in your `.gitlab-ci.yml`, you can scan services with the DAST analyzer.
 
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index cecaa983ce56ce026bdd93f2ed61c65248009184..587e98bc1e05a0c8b8ec18bae42b81f96d5a3572 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -15,7 +15,7 @@ The **Security configuration** page lists the following for the security testing
 - Whether or not it is available.
 - A configuration button or a link to its configuration guide.
 
-To determine the status of each security control, GitLab checks for a [CI/CD pipeline](../../../ci/pipelines/index.md)
+To determine the status of each security control, GitLab checks for a [CI/CD pipeline](../../../ci/pipelines/_index.md)
 in the most recent commit on the default branch.
 
 If GitLab finds a CI/CD pipeline, then it inspects each job in the `.gitlab-ci.yml` file.
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index dac943bf88d85f5d7f4fdd39e880d6bc608655b3..9c3ff0b92aa3781b5d1fee542d3f3a1c19df532b 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -15,7 +15,7 @@ GitLab allows you to add coverage-guided fuzz testing to your pipelines. This he
 bugs and potential security issues that other QA processes may miss.
 
 We recommend that you use fuzz testing in addition to the other security scanners in [GitLab Secure](../index.md)
-and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
+and your own test processes. If you're using [GitLab CI/CD](../../../ci/_index.md),
 you can run your coverage-guided fuzz testing as part your CI/CD workflow.
 
 <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -104,7 +104,7 @@ my_fuzz_target:
     - ./gitlab-cov-fuzz run --regression=$REGRESSION -- <your fuzz target>
 ```
 
-The `Coverage-Fuzzing` template includes the [hidden job](../../../ci/jobs/index.md#hide-a-job)
+The `Coverage-Fuzzing` template includes the [hidden job](../../../ci/jobs/_index.md#hide-a-job)
 `.fuzz_base`, which you must [extend](../../../ci/yaml/_index.md#extends) for each of your fuzzing
 targets. Each fuzzing target **must** have a separate job. For example, the
 [go-fuzzing-example project](https://gitlab.com/gitlab-org/security-products/demos/go-fuzzing-example)
diff --git a/doc/user/application_security/dast/browser/configuration/requirements.md b/doc/user/application_security/dast/browser/configuration/requirements.md
index 648f95b7c316173d0478977842eb141384d1a089..09236395c3b09f6032e48ef4eeda0d9e3f590026 100644
--- a/doc/user/application_security/dast/browser/configuration/requirements.md
+++ b/doc/user/application_security/dast/browser/configuration/requirements.md
@@ -6,7 +6,7 @@ type: reference, howto
 title: Requirements
 ---
 
-- [GitLab Runner](../../../../../ci/runners/index.md) available, with the
+- [GitLab Runner](../../../../../ci/runners/_index.md) available, with the
   [`docker` executor](https://docs.gitlab.com/runner/executors/docker.html) on Linux/amd64.
 - Target application deployed. For more details, read [Deployment options](#application-deployment-options).
 - `dast` stage added to the CI/CD pipeline definition. This should be added after the deploy step, for example:
@@ -53,7 +53,7 @@ on how to configure review apps for DAST.
 
 If your application uses Docker containers you have another option for deploying and scanning with DAST.
 After your Docker build job completes and your image is added to your container registry, you can use the image as a
-[service](../../../../../ci/services/index.md).
+[service](../../../../../ci/services/_index.md).
 
 By using service definitions in your `.gitlab-ci.yml`, you can scan services with the DAST analyzer.
 
diff --git a/doc/user/application_security/dast/on-demand_scan.md b/doc/user/application_security/dast/on-demand_scan.md
index 1fa6f01c08eef98208a943c9053a4dba8e1e6a28..83097cc499164ae2f82376da081a2cedc2936b12 100644
--- a/doc/user/application_security/dast/on-demand_scan.md
+++ b/doc/user/application_security/dast/on-demand_scan.md
@@ -47,7 +47,7 @@ Prerequisites:
 
 - You must have permission to run an on-demand DAST scan against a protected branch. The default
   branch is automatically protected. For more information, see
-  [Pipeline security on protected branches](../../../ci/pipelines/index.md#pipeline-security-on-protected-branches).
+  [Pipeline security on protected branches](../../../ci/pipelines/_index.md#pipeline-security-on-protected-branches).
 
 To run an existing on-demand scan:
 
diff --git a/doc/user/application_security/dependency_scanning/experiment_libbehave_dependency.md b/doc/user/application_security/dependency_scanning/experiment_libbehave_dependency.md
index 8b3cbac73cd77f8ab68c7a1a0c3a4fd04dce0f94..f635688139bbc5f83f5786817262714134c14cca 100644
--- a/doc/user/application_security/dependency_scanning/experiment_libbehave_dependency.md
+++ b/doc/user/application_security/dependency_scanning/experiment_libbehave_dependency.md
@@ -91,7 +91,7 @@ Prerequisites:
   and the source branch is either a protected branch or the **Protect variable** CI/CD variable
   [option is unchecked](../../../ci/variables/_index.md#for-a-project).
 
-Libbehave is exposed through [CI/CD components](../../../ci/components/index.md). To enable it, configure your project's
+Libbehave is exposed through [CI/CD components](../../../ci/components/_index.md). To enable it, configure your project's
 `.gitlab-ci.yml` file as follows:
 
 ```yaml
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index ad47fbf643b0166c93abce363e675adf005f80c0..c5f52b9f15160320b00bb26c29c51e7ff07e145c 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -781,7 +781,7 @@ Pipelines now include a Dependency Scanning job.
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/454143) in GitLab 17.0. This feature is an [experiment](../../../policy/development_stages_support.md).
 > - The dependency scanning CI/CD component only supports Android projects.
 
-Use [CI/CD components](../../../ci/components/index.md) to perform Dependency Scanning of your
+Use [CI/CD components](../../../ci/components/_index.md) to perform Dependency Scanning of your
 application. For instructions, see the respective component's README file.
 
 ##### Available CI/CD components
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 65b5a8ca7b2321e79fdfa92d9d01ab2cb2465a5b..e287762495461b1b9ea15ce55e0e397927a3e57c 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -46,7 +46,7 @@ DETAILS:
 **Tier:** Free, Premium, Ultimate
 **Offering:** GitLab.com, GitLab Self-Managed, GitLab Dedicated
 
-If you're using [GitLab CI/CD](../../../ci/index.md), you can use Static Application Security
+If you're using [GitLab CI/CD](../../../ci/_index.md), you can use Static Application Security
 Testing (SAST) to check your source code for known vulnerabilities. You can run SAST analyzers in
 any GitLab tier. The analyzers output JSON-formatted reports as job artifacts.
 
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index dd4a4aca2abab23bc90260484b44b9e6e004140e..b6d9fbd967f66c01fcbb391debd411ecc62deb3e 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -15,7 +15,7 @@ requires authentication, usually using static methods like private
 keys and tokens. These methods are called "secrets" because they're
 not meant to be shared with anyone else.
 
-To minimize the risk of exposing your secrets, always [store secrets outside of the repository](../../../ci/secrets/index.md). However, secrets are sometimes accidentally committed to Git
+To minimize the risk of exposing your secrets, always [store secrets outside of the repository](../../../ci/secrets/_index.md). However, secrets are sometimes accidentally committed to Git
 repositories. After a sensitive value is pushed to a remote
 repository, anyone with access to the repository can use the secret to
 impersonate the authorized user.
diff --git a/doc/user/clusters/agent/gitops/flux_oci_tutorial.md b/doc/user/clusters/agent/gitops/flux_oci_tutorial.md
index 5e7ca560e6771e61803605093d7f2f467378131e..1cf9fa2cb114ff392e7f7fae9dea453635992d2a 100644
--- a/doc/user/clusters/agent/gitops/flux_oci_tutorial.md
+++ b/doc/user/clusters/agent/gitops/flux_oci_tutorial.md
@@ -65,7 +65,7 @@ First, create a repository for your Kubernetes manifests:
 
 ## Configure the manifest repository to create an OCI artifact
 
-Next, configure [GitLab CI/CD](../../../../ci/index.md) to package your manifests into an OCI artifact,
+Next, configure [GitLab CI/CD](../../../../ci/_index.md) to package your manifests into an OCI artifact,
 and push the artifact to the [GitLab container registry](../../../packages/container_registry/index.md):
 
 1. In the root of `web-app-manifests`, create and push a `.gitlab-ci.yml` file with the following contents:
diff --git a/doc/user/clusters/migrating_from_gma_to_project_template.md b/doc/user/clusters/migrating_from_gma_to_project_template.md
index 6c334da32eeb87cc87207edae2ab82c6f6a49e0f..3a72bd7b40c5768ec64598462529ec9579353609 100644
--- a/doc/user/clusters/migrating_from_gma_to_project_template.md
+++ b/doc/user/clusters/migrating_from_gma_to_project_template.md
@@ -14,7 +14,7 @@ in favor of user-controlled Cluster Management projects.
 Managing your cluster applications through a project enables you a
 lot more flexibility to manage your cluster than through the late GitLab Managed Apps.
 To migrate to the cluster management project you need
-[GitLab Runners](../../ci/runners/index.md)
+[GitLab Runners](../../ci/runners/_index.md)
 available and be familiar with [Helm](https://helm.sh/).
 
 ## Migrate to a Cluster Management Project
@@ -39,7 +39,7 @@ See also [video walk-throughs](#video-walk-throughs) with examples.
    - If you kept the default name (`gitlab-managed-apps`), then the script is already
      set up.
 
-   Either way, [run a pipeline manually](../../ci/pipelines/index.md#run-a-pipeline-manually) and read the logs of the
+   Either way, [run a pipeline manually](../../ci/pipelines/_index.md#run-a-pipeline-manually) and read the logs of the
    `detect-helm2-releases` job to know if you have any Helm v2 releases and which are they.
 
 1. If you have no Helm v2 releases, skip this step. Otherwise, follow the official Helm documentation on
@@ -110,7 +110,7 @@ See also [video walk-throughs](#video-walk-throughs) with examples.
        WARNING:
        Cert-manager v0.10 breaks when Kubernetes is upgraded to version 1.20 or later.
 
-1. After following all the previous steps, [run a pipeline manually](../../ci/pipelines/index.md#run-a-pipeline-manually)
+1. After following all the previous steps, [run a pipeline manually](../../ci/pipelines/_index.md#run-a-pipeline-manually)
    and watch the `apply` job logs to see if any of your applications were successfully detected, installed, and whether they got any
    unexpected updates.
 
diff --git a/doc/user/compliance/license_scanning_of_cyclonedx_files/_index.md b/doc/user/compliance/license_scanning_of_cyclonedx_files/_index.md
index 5b00ff692e088e1bca20d11106466df253b2cdd2..ac6ef82274ac244d888c35050129725dc4931218 100644
--- a/doc/user/compliance/license_scanning_of_cyclonedx_files/_index.md
+++ b/doc/user/compliance/license_scanning_of_cyclonedx_files/_index.md
@@ -37,7 +37,7 @@ To enable License scanning of CycloneDX files:
   - Enable [Dependency Scanning](../../application_security/dependency_scanning/index.md#enabling-the-analyzer)
       and ensure that its prerequisites are met.
   - On GitLab Self-Managed, you can [choose package registry metadata to synchronize](../../../administration/settings/security_and_compliance.md#choose-package-registry-metadata-to-sync) in the **Admin** area for the GitLab instance. For this data synchronization to work, you must allow outbound network traffic from your GitLab instance to the domain `storage.googleapis.com`. If you have limited or no network connectivity then refer to the documentation section [running in an offline environment](#running-in-an-offline-environment) for further guidance.
-- Or use the [CI/CD component](../../../ci/components/index.md) for applicable package registries.
+- Or use the [CI/CD component](../../../ci/components/_index.md) for applicable package registries.
 
 ## Supported languages and package managers
 
diff --git a/doc/user/duo_amazon_q/index.md b/doc/user/duo_amazon_q/index.md
index a401d5018b78286b3fbba35c05065b42fba7cfd1..5661f87e5af380d63dec07f088c7cada755f9e7f 100644
--- a/doc/user/duo_amazon_q/index.md
+++ b/doc/user/duo_amazon_q/index.md
@@ -60,7 +60,7 @@ Amazon Q can analyze Java 8 or 11 code and determine the necessary Java changes
 
 Prerequisites:
 
-- You must [have a runner and a CI/CD pipeline configured for your project](../../ci/index.md).
+- You must [have a runner and a CI/CD pipeline configured for your project](../../ci/_index.md).
 
 To upgrade Java:
 
diff --git a/doc/user/get_started/get_started_deploy_release.md b/doc/user/get_started/get_started_deploy_release.md
index bcebb6afeff4419b4f3f59a609f904314dabb374..aab8e12543adfe413c5d4401d000fa18f789d63a 100644
--- a/doc/user/get_started/get_started_deploy_release.md
+++ b/doc/user/get_started/get_started_deploy_release.md
@@ -53,12 +53,12 @@ the main branch. These temporary environments are called review apps.
 For more information, see:
 
 - [Environments](../../ci/environments/_index.md)
-- [Deploy to AWS](../../ci/cloud_deployment/index.md)
+- [Deploy to AWS](../../ci/cloud_deployment/_index.md)
 - [Deploy to Kubernetes](../clusters/agent/_index.md)
 - [Dashboard for Kubernetes](../../ci/environments/kubernetes_dashboard.md)
 - [Environments Dashboard](../../ci/environments/environments_dashboard.md)
 - [Operations Dashboard](../operations_dashboard/index.md)
-- [Review apps](../../ci/review_apps/index.md)
+- [Review apps](../../ci/review_apps/_index.md)
 
 ## Step 3: Stay compliant with continuous delivery features
 
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index 3e3adafae31711ab51ee7e91fc4be8b67b4349a5..86fbd36c3c7ad4d4d5cee2eb3dacce8b3883356d 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -203,7 +203,7 @@ For incoming connections to GitLab.com, you must allow CIDR blocks of Cloudflare
 
 ## GitLab CI/CD
 
-Below are the current settings regarding [GitLab CI/CD](../../ci/index.md).
+Below are the current settings regarding [GitLab CI/CD](../../ci/_index.md).
 Any settings or feature limits not listed here are using the defaults listed in
 the related documentation.
 
@@ -347,7 +347,7 @@ For self-managed instance limits, see:
 
 You can use GitLab-hosted runners to run your CI/CD jobs on GitLab.com and GitLab Dedicated to seamlessly build, test, and deploy your application on different environments.
 
-For more information, see [GitLab-hosted runners](../../ci/runners/index.md).
+For more information, see [GitLab-hosted runners](../../ci/runners/_index.md).
 
 ## Puma
 
@@ -542,7 +542,7 @@ You can view more information in our runbooks such as:
 By default, GitLab does not expire job logs. Job logs are retained indefinitely,
 and can't be configured on GitLab.com to expire. You can erase job logs
 [manually with the Jobs API](../../api/jobs.md#erase-a-job) or by
-[deleting a pipeline](../../ci/pipelines/index.md#delete-a-pipeline).
+[deleting a pipeline](../../ci/pipelines/_index.md#delete-a-pipeline).
 
 ## GitLab.com at scale
 
diff --git a/doc/user/group/compliance_pipelines.md b/doc/user/group/compliance_pipelines.md
index d551765aa8fed9196a28d7799255d3cb1766e2b3..5b8ba038ff963ab10f317dc6a0d60d5bd75ba2c3 100644
--- a/doc/user/group/compliance_pipelines.md
+++ b/doc/user/group/compliance_pipelines.md
@@ -289,7 +289,7 @@ running the pipeline.
 
 ## Ensure compliance jobs are always run
 
-Compliance pipelines [use GitLab CI/CD](../../ci/index.md) to give you an incredible amount of flexibility
+Compliance pipelines [use GitLab CI/CD](../../ci/_index.md) to give you an incredible amount of flexibility
 for defining any sort of compliance jobs you like. Depending on your goals, these jobs
 can be configured to be:
 
@@ -375,7 +375,7 @@ This configuration doesn't overwrite the compliance pipeline and you get the fol
 
 Because of a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/382857),
 compliance pipelines in GitLab 15.3 and later can prevent
-[prefilled variables](../../ci/pipelines/index.md#prefill-variables-in-manual-pipelines)
+[prefilled variables](../../ci/pipelines/_index.md#prefill-variables-in-manual-pipelines)
 from appearing when manually starting a pipeline.
 
 To workaround this issue, use `ref: '$CI_COMMIT_SHA'` instead of `ref: '$CI_COMMIT_REF_NAME'`
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index 923d1fff0ca37978f65af6779941caf07540413c..20955769bc886d1019cee09602ffe798ebe8cf46 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -437,7 +437,7 @@ To enable this setting:
 
 #### Allow merge after skipped pipelines
 
-You can configure [skipped pipelines](../../ci/pipelines/index.md#skip-a-pipeline) from preventing merge requests from being merged.
+You can configure [skipped pipelines](../../ci/pipelines/_index.md#skip-a-pipeline) from preventing merge requests from being merged.
 
 See also [the project-level setting](../project/merge_requests/auto_merge.md#allow-merge-after-skipped-pipelines).
 
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index ab5c4646c5a7e94e2cc750882e35539aeed1f49b..20ec75ac023c4699b3a426769d07d7a6ec8eeb2d 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -24,7 +24,7 @@ Subgroups can:
 - Belong to one immediate parent group.
 - Have many subgroups.
 - Be nested up to 20 levels.
-- Use [runners](../../../ci/runners/index.md) registered to parent groups:
+- Use [runners](../../../ci/runners/_index.md) registered to parent groups:
   - Secrets configured for the parent group are available to subgroup jobs.
   - Users with at least the Maintainer role in projects that belong to subgroups can see the details of runners registered to
     parent groups.
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
index e0f21e7e0c660f834b75ea04115e83aa17a41949..4bdbd5ecd3a2dc2e9b86ab8563204a7a6be78ad4 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
@@ -26,7 +26,7 @@ For GitLab Runner to function, you _must_ specify the following in your
 
 - `gitlabUrl`: The GitLab server full URL (for example, `https://gitlab.example.com`)
   to register the Runner against.
-- Runner token: This must be [retrieved](../../../../../ci/runners/index.md) from your GitLab instance. You can use
+- Runner token: This must be [retrieved](../../../../../ci/runners/_index.md) from your GitLab instance. You can use
   either of the following tokens:
 
   - `runnerToken`: The runner authentication token for the runner configuration [created in the GitLab UI](../../../../../ci/runners/runners_scope.md).
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md b/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
index 69d59225cf8f73cf9ceee8f2ec662d791a4746ba..078154522f8618367cf202b8d7b029f54eb5aab0 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
@@ -19,7 +19,7 @@ a single source of access, control, and auditability around all your sensitive
 credentials and certificates. This feature requires giving GitLab the highest level of access and
 control. Therefore, if GitLab is compromised, the security of this Vault instance is as well. To
 avoid this security risk, GitLab recommends using your own HashiCorp Vault to leverage
-[external secrets with CI](../../../../../ci/secrets/index.md).
+[external secrets with CI](../../../../../ci/secrets/_index.md).
 
 Assuming you already have a project created from a
 [management project template](../../../../clusters/management_project_template.md), to install Vault you should
@@ -36,7 +36,7 @@ Vault application causes downtime.
 
 To optimally use Vault in a production environment, it's ideal to have a good understanding
 of the internals of Vault and how to configure it. This can be done by reading
-the [Vault Configuration guide](../../../../../ci/secrets/index.md#configure-your-vault-server),
+the [Vault Configuration guide](../../../../../ci/secrets/_index.md#configure-your-vault-server),
 the [Vault documentation](https://developer.hashicorp.com/vault/docs/internals) and
 the Vault Helm chart [`values.yaml` file](https://github.com/hashicorp/vault-helm/blob/v0.3.3/values.yaml).
 
diff --git a/doc/user/infrastructure/iac/terraform_template_recipes.md b/doc/user/infrastructure/iac/terraform_template_recipes.md
index 0270678a8d97fe4b4982cc9da3cdf076b7a56379..3c76790d688fdb2f6f155ba8196f753e2bfc7f36 100644
--- a/doc/user/infrastructure/iac/terraform_template_recipes.md
+++ b/doc/user/infrastructure/iac/terraform_template_recipes.md
@@ -116,7 +116,7 @@ state-list:
 The `gitlab-terraform` command sets up a `terraform` command and runs
 it with the given arguments.
 
-To run this job in the Terraform state-specific [resource group](../../../ci/resource_groups/index.md),
+To run this job in the Terraform state-specific [resource group](../../../ci/resource_groups/_index.md),
 assign the job with `resource_group`:
 
 ```yaml
diff --git a/doc/user/packages/composer_repository/index.md b/doc/user/packages/composer_repository/index.md
index 6d1f2b6771d5b4e7e6940da6f166ad973de372d9..af8ad91bb62744fd0cc89474c30e3210c4be3179 100644
--- a/doc/user/packages/composer_repository/index.md
+++ b/doc/user/packages/composer_repository/index.md
@@ -303,7 +303,7 @@ WARNING:
 Never commit the `auth.json` file to your repository. To install packages from a CI/CD job,
 consider using the [`composer config`](https://getcomposer.org/doc/articles/handling-private-packages.md#satis) tool with your access token
 stored in a [GitLab CI/CD variable](../../../ci/variables/_index.md) or in
-[HashiCorp Vault](../../../ci/secrets/index.md).
+[HashiCorp Vault](../../../ci/secrets/_index.md).
 
 ### Install from source
 
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index ac10b72826ecf61cfe3289ffeeaeb59a33635ce4..ae34047e9101ba771439bf76adb0ba0c740b4a41 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -194,7 +194,7 @@ conan upload Hello/0.1@mycompany/beta --all
 
 ## Publish a Conan package by using CI/CD
 
-To work with Conan commands in [GitLab CI/CD](../../../ci/index.md), you can
+To work with Conan commands in [GitLab CI/CD](../../../ci/_index.md), you can
 use `CI_JOB_TOKEN` in place of the personal access token in your commands.
 
 You can provide the `CONAN_LOGIN_USERNAME` and `CONAN_PASSWORD` with each Conan
diff --git a/doc/user/packages/container_registry/build_and_push_images.md b/doc/user/packages/container_registry/build_and_push_images.md
index cacd6ef49c54b80222604ef63b74b5bfc49e68bb..d0f2380aeeedea9d9cf364a0da29e2a6f699cc0b 100644
--- a/doc/user/packages/container_registry/build_and_push_images.md
+++ b/doc/user/packages/container_registry/build_and_push_images.md
@@ -49,7 +49,7 @@ You can configure your `.gitlab-ci.yml` file to build and push container images
 
 ## Use GitLab CI/CD
 
-You can use [GitLab CI/CD](../../../ci/index.md) to build and push container images to the
+You can use [GitLab CI/CD](../../../ci/_index.md) to build and push container images to the
 Container Registry. You can use CI/CD to test, build, and deploy your project from the container
 image you created.
 
@@ -59,7 +59,7 @@ You can use your own container images for Docker-in-Docker.
 
 1. Set up [Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
 1. Update the `image` and `service` to point to your registry.
-1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
+1. Add a service [alias](../../../ci/services/_index.md#available-settings-for-services).
 
 Your `.gitlab-ci.yml` should look similar to this:
 
@@ -88,7 +88,7 @@ You can use your own container images with Dependency Proxy.
 
 1. Set up [Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-docker-in-docker).
 1. Update the `image` and `service` to point to your registry.
-1. Add a service [alias](../../../ci/services/index.md#available-settings-for-services).
+1. Add a service [alias](../../../ci/services/_index.md#available-settings-for-services).
 
 Your `.gitlab-ci.yml` should look similar to this:
 
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index e102ad0b830f38642274258d42d5e05df730c4ce..e4e51b203c6da7de132a2c405301568087960189 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -225,7 +225,7 @@ Watch how to [use the dependency proxy to help avoid Docker Hub rate limits](htt
 
 In November 2020, Docker introduced
 [rate limits on pull requests from Docker Hub](https://docs.docker.com/docker-hub/download-rate-limit/).
-If your GitLab [CI/CD configuration](../../../ci/index.md) uses
+If your GitLab [CI/CD configuration](../../../ci/_index.md) uses
 an image from Docker Hub, each time a job runs, it may count as a pull request.
 To help get around this limit, you can pull your image from the dependency proxy cache instead.
 
diff --git a/doc/user/packages/helm_repository/index.md b/doc/user/packages/helm_repository/index.md
index 69da96279218905832f79eef8e277a672f2562bb..480f0089229d3c146cc75f54a975bd848a001b4d 100644
--- a/doc/user/packages/helm_repository/index.md
+++ b/doc/user/packages/helm_repository/index.md
@@ -78,7 +78,7 @@ For example, you can use `stable` and `devel` as channels to allow users to add
 
 ## Use CI/CD to publish a Helm package
 
-To publish a Helm package automated through [GitLab CI/CD](../../../ci/index.md), you can use
+To publish a Helm package automated through [GitLab CI/CD](../../../ci/_index.md), you can use
 `CI_JOB_TOKEN` in place of the personal access token in your commands.
 
 For example:
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 9e7b535245fbfe387b85def3d40f45ce468b1dab..d8be4e1d0c0126214d8de5cbb3e12093acb02ab9 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -70,7 +70,7 @@ Accessing the package registry with a deploy token is not available when externa
 
 ## Use GitLab CI/CD
 
-You can use [GitLab CI/CD](../../../ci/index.md) to build or import packages into
+You can use [GitLab CI/CD](../../../ci/_index.md) to build or import packages into
 a package registry.
 
 ### To build packages
diff --git a/doc/user/packages/terraform_module_registry/index.md b/doc/user/packages/terraform_module_registry/index.md
index ba39d037cc2f4045162a5dd27426e63921ba644b..82c1664ab0094c05943b463536eb2e53c8e23d61 100644
--- a/doc/user/packages/terraform_module_registry/index.md
+++ b/doc/user/packages/terraform_module_registry/index.md
@@ -128,7 +128,7 @@ You can configure the pipeline with the following variables:
 
 ### Using CI/CD manually
 
-To work with Terraform modules in [GitLab CI/CD](../../../ci/index.md), you can use
+To work with Terraform modules in [GitLab CI/CD](../../../ci/_index.md), you can use
 `CI_JOB_TOKEN` in place of the personal access token in your commands.
 
 For example, this job uploads a new module for the `local` [system provider](https://registry.terraform.io/browse/providers) and uses the module version from the Git commit tag:
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 1b687f919fdafc63e2b9e6dee5fb67d47165ce85..f8e743a428b21800c95cfda85599648853ede008 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -107,7 +107,7 @@ Project permissions for [application security](application_security/secure_your_
 
 ### CI/CD
 
-[GitLab CI/CD](../ci/index.md) permissions for some roles can be modified by these settings:
+[GitLab CI/CD](../ci/_index.md) permissions for some roles can be modified by these settings:
 
 - [Public pipelines](../ci/pipelines/settings.md#change-which-users-can-view-your-pipelines):
   When set to public, gives access to certain CI/CD features to *Guest* project members.
@@ -136,14 +136,14 @@ Project Owners can perform any listed action, and can delete pipelines:
 | Delete [environments](../ci/environments/_index.md)                                                                             |            |       |         |          |     ✓     |     ✓      |       |
 | Stop [environments](../ci/environments/_index.md)                                                                               |            |       |         |          |     ✓     |     ✓      |       |
 | Run CI/CD pipeline                                                                                                             |            |       |         |          |     ✓     |     ✓      |       |
-| Run CI/CD pipeline for a protected branch                                                                                      |            |       |         |          |     ✓     |     ✓      | Developers and maintainers: Only if the user is [allowed to merge or push to the protected branch](../ci/pipelines/index.md#pipeline-security-on-protected-branches). |
+| Run CI/CD pipeline for a protected branch                                                                                      |            |       |         |          |     ✓     |     ✓      | Developers and maintainers: Only if the user is [allowed to merge or push to the protected branch](../ci/pipelines/_index.md#pipeline-security-on-protected-branches). |
 | Run CI/CD job                                                                                                                  |            |       |         |          |     ✓     |     ✓      |       |
 | Delete job logs or job artifacts                                                                                               |            |       |         |          |     ✓     |     ✓      | Developers: Only if the job was triggered by the user and runs for a non-protected branch. |
-| Enable [review apps](../ci/review_apps/index.md)                                                                               |            |       |         |          |     ✓     |     ✓      |       |
+| Enable [review apps](../ci/review_apps/_index.md)                                                                              |            |       |         |          |     ✓     |     ✓      |       |
 | Cancel jobs                                                                                                                    |            |       |         |          |     ✓     |     ✓      | Cancellation permissions can be [restricted in the pipeline settings](../ci/pipelines/settings.md#restrict-roles-that-can-cancel-pipelines-or-jobs). |
 | Retry jobs                                                                                                                     |            |       |         |          |     ✓     |     ✓      |       |
 | Read [Terraform](infrastructure/index.md) state                                                                                |            |       |         |          |     ✓     |     ✓      |       |
-| Run [interactive web terminals](../ci/interactive_web_terminal/index.md)                                                       |            |       |         |          |     ✓     |     ✓      |       |
+| Run [interactive web terminals](../ci/interactive_web_terminal/_index.md)                                                      |            |       |         |          |     ✓     |     ✓      |       |
 | Use pipeline editor                                                                                                            |            |       |         |          |     ✓     |     ✓      |       |
 | Manage [agents for Kubernetes](clusters/agent/_index.md)                                                                        |            |       |         |          |           |     ✓      |       |
 | Manage CI/CD settings                                                                                                          |            |       |         |          |           |     ✓      |       |
@@ -237,10 +237,10 @@ Project permissions for [issues](project/issues/index.md):
 | Archive or reopen [requirements](project/requirements/index.md)       |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   | Guest users can archive and reopen issues that they authored or are assigned to. |
 | Create or edit [requirements](project/requirements/index.md)          |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   | Guest users can modify the title and description that they authored or are assigned to. |
 | Import or export [requirements](project/requirements/index.md)        |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
-| Archive [test cases](../ci/test_cases/index.md)                       |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
-| Create [test cases](../ci/test_cases/index.md)                        |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
-| Move [test cases](../ci/test_cases/index.md)                          |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
-| Reopen [test cases](../ci/test_cases/index.md)                        |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
+| Archive [test cases](../ci/test_cases/_index.md)                      |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
+| Create [test cases](../ci/test_cases/_index.md)                       |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
+| Move [test cases](../ci/test_cases/_index.md)                         |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
+| Reopen [test cases](../ci/test_cases/_index.md)                       |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
 | [Import](project/issues/csv_import.md) issues from a CSV file         |       |    ✓    |          |     ✓     |     ✓      |   ✓   |       |
 | [Export](project/issues/csv_export.md) issues to a CSV file           |       |    ✓    |    ✓     |     ✓     |     ✓      |   ✓   |       |
 | Delete issues                                                         |       |    ✓    |          |           |            |   ✓   |       |
@@ -443,7 +443,7 @@ Group permissions for [Application Security](application_security/secure_your_ap
 
 ### CI/CD group permissions
 
-Group permissions for [CI/CD](../ci/index.md) features including runners, variables, and protected environments:
+Group permissions for [CI/CD](../ci/_index.md) features including runners, variables, and protected environments:
 
 | Action                                | Guest | Planner | Reporter | Developer | Maintainer | Owner | Notes |
 | ------------------------------------- | :---: | :-----: | :------: | :-------: | :--------: | :---: | ----- |
diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md
index 1788b1681895a645d34a5ddc4ac0fd54b6d64491..f8df78f4dd917f02b6ad16832358ba8563f8627f 100644
--- a/doc/user/project/canary_deployments.md
+++ b/doc/user/project/canary_deployments.md
@@ -64,10 +64,10 @@ Here's an example setup flow from scratch:
    Endpoint assigned above.
 1. Check if [`v2.0.0+` of `auto-deploy-image` is used in your Auto DevOps pipelines](../../topics/autodevops/upgrading_auto_deploy_dependencies.md#verify-dependency-versions).
    If it isn't, follow the documentation to specify the image version.
-1. [Run a new Auto DevOps pipeline](../../ci/pipelines/index.md#run-a-pipeline-manually)
+1. [Run a new Auto DevOps pipeline](../../ci/pipelines/_index.md#run-a-pipeline-manually)
    and make sure that the `production` job succeeds and creates a production environment.
 1. Configure a [`canary` deployment job for Auto DevOps pipelines](../../topics/autodevops/cicd_variables.md#deploy-policy-for-canary-environments).
-1. [Run a new Auto DevOps pipeline](../../ci/pipelines/index.md#run-a-pipeline-manually)
+1. [Run a new Auto DevOps pipeline](../../ci/pipelines/_index.md#run-a-pipeline-manually)
    and make sure that the `canary` job succeeds and creates a canary deployment with Canary Ingress.
 
 ### Show Canary Ingress deployments on deploy boards (deprecated)
diff --git a/doc/user/project/code_intelligence.md b/doc/user/project/code_intelligence.md
index 832e86762e1d09a7f1f6697eb8f946c01a859bd5..e1c656f680c2bd5e7388299440598618387249b8 100644
--- a/doc/user/project/code_intelligence.md
+++ b/doc/user/project/code_intelligence.md
@@ -51,7 +51,7 @@ To see how your language is best supported, review the
 
 > - Python support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301111) in GitLab 17.9.
 
-GitLab provides a [CI/CD component](../../ci/components/index.md) to configure code intelligence
+GitLab provides a [CI/CD component](../../ci/components/_index.md) to configure code intelligence
 in your `.gitlab-ci.yml` file. The component supports these languages:
 
 - Go version 1.21 or later.
@@ -73,7 +73,7 @@ To contribute more languages to the component, open a merge request in the
 
 1. For configuration instructions for the [code intelligence component](https://gitlab.com/components/code-intelligence),
    check the `README` for each supported language.
-1. For more configuration details, see [Use a component](../../ci/components/index.md#use-a-component).
+1. For more configuration details, see [Use a component](../../ci/components/_index.md#use-a-component).
 
 ### Add CI/CD jobs for code intelligence
 
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index e9b38c7f33cb1c7c93c9b987d146f045df2ebac4..3478355306daa5a874d9fa9ec80a7820c480b671 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -73,7 +73,7 @@ specific environment, there are a lot of use cases. To name a few:
   stuck or failed.
 - You've got an MR that looks good, but you want to run it on staging because
   staging is set up in some way closer to production. You go to the environment
-  list, find the [Review App](../../ci/review_apps/index.md) you're interested in, and select the
+  list, find the [Review App](../../ci/review_apps/_index.md) you're interested in, and select the
   manual action to deploy it to staging.
 
 ## Enabling deploy boards
@@ -91,7 +91,7 @@ To display the deploy boards for a specific [environment](../../ci/environments/
    [OpenShift docs](https://docs.openshift.com/container-platform/3.7/dev_guide/deployments/kubernetes_deployments.html#kubernetes-deployments-vs-deployment-configurations)
    and [GitLab issue #4584](https://gitlab.com/gitlab-org/gitlab/-/issues/4584).
 
-1. [Configure GitLab Runner](../../ci/runners/index.md) with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
+1. [Configure GitLab Runner](../../ci/runners/_index.md) with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
    [`kubernetes`](https://docs.gitlab.com/runner/executors/kubernetes/index.html) executor.
 1. Configure the [Kubernetes integration](../infrastructure/clusters/index.md) in your project for the
    cluster. The Kubernetes namespace is of particular note as you need it
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 0377789c3425ccde71a4e78abeddd32346de0be3..3581f4d0d0048d91aaecf4623bb89c84c4e851ed 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -88,7 +88,7 @@ CI/CD variables are available only to immediate child projects of the group.
 GitLab deploy tokens are long-lived, making them attractive for attackers.
 
 To prevent leaking the deploy token, you should also configure your
-[runners](../../../ci/runners/index.md) to be secure:
+[runners](../../../ci/runners/_index.md) to be secure:
 
 - Avoid using Docker `privileged` mode if the machines are re-used.
 - Avoid using the [`shell` executor](https://docs.gitlab.com/runner/executors/shell.html) when jobs
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 93db889dd8142e5ab7d2fd47dcdc536a46f76dcc..51c4165f4a5fe445474f93b4c6e291bb05f15631 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -281,7 +281,7 @@ your imported repository in sync with its GitHub copy.
 Additionally, you can configure GitLab to send pipeline status updates back to GitHub with the
 [GitHub Project Integration](../integrations/github.md).
 
-If you import your project using [CI/CD for external repository](../../../ci/ci_cd_for_external_repos/index.md), then both
+If you import your project using [CI/CD for external repository](../../../ci/ci_cd_for_external_repos/_index.md), then both
 of the above are automatically configured.
 
 NOTE:
diff --git a/doc/user/project/integrations/apple_app_store.md b/doc/user/project/integrations/apple_app_store.md
index 7aa6ff27f805c20f6247aed070fdc706af78187c..a0e048cda18e6774cbb13332720823778fd38ffe 100644
--- a/doc/user/project/integrations/apple_app_store.md
+++ b/doc/user/project/integrations/apple_app_store.md
@@ -12,7 +12,7 @@ DETAILS:
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/104888) in GitLab 15.8 [with a flag](../../../administration/feature_flags.md) named `apple_app_store_integration`. Disabled by default.
 > - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/385335) in GitLab 15.10. Feature flag `apple_app_store_integration` removed.
 
-This feature is part of [Mobile DevOps](../../../ci/mobile_devops/index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
+This feature is part of [Mobile DevOps](../../../ci/mobile_devops/_index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
 The feature is still in development, but you can:
 
 - [Request a feature](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=feature_request).
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 682941f82b2e09f9edfb07eb98258b1bf00afb55..d15a5e28c0dcd462ac61f2758c40d8fabbfa4dc3 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -42,7 +42,7 @@ Complete these steps in GitLab:
 1. Optional. Select **Test settings**.
 1. Select **Save changes**.
 
-After configuring the integration, see [Pipelines for external pull requests](../../../ci/ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)
+After configuring the integration, see [Pipelines for external pull requests](../../../ci/ci_cd_for_external_repos/_index.md#pipelines-for-external-pull-requests)
 to configure pipelines to run for open pull requests.
 
 ### Static or dynamic status check names
diff --git a/doc/user/project/integrations/gitlab_slack_application.md b/doc/user/project/integrations/gitlab_slack_application.md
index 76b6d199f9bd7f902b7241d49d2aae44b744f8e4..e1af99dcd3bab6d5902ed5d1252c6bbff9a47096 100644
--- a/doc/user/project/integrations/gitlab_slack_application.md
+++ b/doc/user/project/integrations/gitlab_slack_application.md
@@ -101,7 +101,7 @@ The following slash commands are available for GitLab:
 | `/gitlab <project> issue close <id>` | Closes the issue with the ID `<id>`. |
 | `/gitlab <project> issue comment <id>` <kbd>Shift</kbd>+<kbd>Enter</kbd> `<comment>` | Adds a comment with the comment body `<comment>` to the issue with the ID `<id>`. |
 | `/gitlab <project> deploy <from> to <to>` | [Deploys](#deploy-command) from the `<from>` environment to the `<to>` environment. |
-| `/gitlab <project> run <job name> <arguments>` | Executes the [ChatOps](../../../ci/chatops/index.md) job `<job name>` on the default branch. |
+| `/gitlab <project> run <job name> <arguments>` | Executes the [ChatOps](../../../ci/chatops/_index.md) job `<job name>` on the default branch. |
 | `/gitlab incident declare` | Opens a dialog to [create an incident from Slack](../../../operations/incident_management/slack.md). |
 
 ### `deploy` command
diff --git a/doc/user/project/integrations/google_play.md b/doc/user/project/integrations/google_play.md
index 7ff7477c2fd3b0d0aa3998d7245f209690204a68..dc01548c219574f6a1a3baf56e8addae58d2062d 100644
--- a/doc/user/project/integrations/google_play.md
+++ b/doc/user/project/integrations/google_play.md
@@ -12,7 +12,7 @@ DETAILS:
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111621) in GitLab 15.10 [with a flag](../../../administration/feature_flags.md) named `google_play_integration`. Disabled by default.
 > - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/389611) in GitLab 15.11. Feature flag `google_play_integration` removed.
 
-This feature is part of [Mobile DevOps](../../../ci/mobile_devops/index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
+This feature is part of [Mobile DevOps](../../../ci/mobile_devops/_index.md) developed by [GitLab Incubation Engineering](https://handbook.gitlab.com/handbook/engineering/development/incubation/).
 The feature is still in development, but you can:
 
 - [Request a feature](https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/feedback/-/issues/new?issuable_template=feature_request).
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
index ad6868af0b7cadd57bc6e9fe3b82c651e42bb913..0de06d7d4e4d6e92b66094193c6c3865b612ce1a 100644
--- a/doc/user/project/integrations/webhook_events.md
+++ b/doc/user/project/integrations/webhook_events.md
@@ -220,7 +220,7 @@ The supported work item types are:
 - [Issue](../issues/index.md)
 - [Tasks](../../tasks.md)
 - [Incidents](../../../operations/incident_management/incidents.md)
-- [Test cases](../../../ci/test_cases/index.md)
+- [Test cases](../../../ci/test_cases/_index.md)
 - [Requirements](../requirements/index.md)
 - [Objectives and key results (OKRs)](../../okrs.md)
 
diff --git a/doc/user/project/merge_requests/_index.md b/doc/user/project/merge_requests/_index.md
index bb0c0698a1edfc121f36249e8f3ee520f67b284d..a137f3919b92e02af6b3c7f6d9450a078d394b6d 100644
--- a/doc/user/project/merge_requests/_index.md
+++ b/doc/user/project/merge_requests/_index.md
@@ -271,7 +271,7 @@ For a web developer writing a webpage for your company's website:
 
 1. You check out a new branch and submit a new page through a merge request.
 1. You gather feedback from your reviewers.
-1. You preview your changes with [review apps](../../../ci/review_apps/index.md).
+1. You preview your changes with [review apps](../../../ci/review_apps/_index.md).
 1. You request your web designers for their implementation.
 1. You request the [approval](approvals/_index.md) from your manager.
 1. After approval, GitLab:
@@ -403,9 +403,9 @@ Enabling this feature flag moves the notifications and to-do item buttons to the
 - [Create a merge request](creating_merge_requests.md)
 - [Review a merge request](reviews/_index.md)
 - [Authorization for merge requests](authorization_for_merge_requests.md)
-- [Testing and reports](../../../ci/testing/index.md)
+- [Testing and reports](../../../ci/testing/_index.md)
 - [GitLab keyboard shortcuts](../../shortcuts.md)
 - [Comments and threads](../../discussions/index.md)
 - [Suggest code changes](reviews/suggestions.md)
-- [CI/CD pipelines](../../../ci/index.md)
+- [CI/CD pipelines](../../../ci/_index.md)
 - [Push options](../../../topics/git/commit.md) for merge requests
diff --git a/doc/user/project/merge_requests/auto_merge.md b/doc/user/project/merge_requests/auto_merge.md
index 559f7233614d66333eb9b80eca06644895d5666e..241a8c4e9dabe6ce9af3de76bba94a858db0cc89 100644
--- a/doc/user/project/merge_requests/auto_merge.md
+++ b/doc/user/project/merge_requests/auto_merge.md
@@ -153,7 +153,7 @@ despite a newer but failed branch pipeline.
 ### Allow merge after skipped pipelines
 
 When you set **Pipelines must succeed** for a project,
-[skipped pipelines](../../../ci/pipelines/index.md#skip-a-pipeline) prevent
+[skipped pipelines](../../../ci/pipelines/_index.md#skip-a-pipeline) prevent
 merge requests from merging.
 
 Prerequisites:
diff --git a/doc/user/project/merge_requests/commits.md b/doc/user/project/merge_requests/commits.md
index 7f93c610a6d2f1b592b31f5e111da735ca1ff7c7..9dc4b6bbc294ce29dbb597e854074be024edf42e 100644
--- a/doc/user/project/merge_requests/commits.md
+++ b/doc/user/project/merge_requests/commits.md
@@ -25,12 +25,12 @@ You can add multiple commits before pushing your changes.
 
   - **Trigger a GitLab CI/CD pipeline:**
 
-    If the project is configured with [GitLab CI/CD](../../../ci/index.md),
+    If the project is configured with [GitLab CI/CD](../../../ci/_index.md),
     you trigger a pipeline per push, not per commit.
 
   - **Skip pipelines:**
 
-    Add the [`ci skip`](../../../ci/pipelines/index.md#skip-a-pipeline) keyword to
+    Add the [`ci skip`](../../../ci/pipelines/_index.md#skip-a-pipeline) keyword to
     your commit message to make GitLab CI/CD skip the pipeline.
 
   - **Cross-link issues and merge requests:**
diff --git a/doc/user/project/merge_requests/widgets.md b/doc/user/project/merge_requests/widgets.md
index 69e8c03cfce4c0180e33e72e4e1315234269e876..13fa6c5fd5d7d81697a8c57027f825ac75c88270 100644
--- a/doc/user/project/merge_requests/widgets.md
+++ b/doc/user/project/merge_requests/widgets.md
@@ -17,7 +17,7 @@ and the services you configure for your project.
 
 ## Pipeline information
 
-If you've set up [GitLab CI/CD](../../../ci/index.md) in your project,
+If you've set up [GitLab CI/CD](../../../ci/_index.md) in your project,
 a [merge request](_index.md) displays pipeline information in the widgets area
 of the **Overview** tab:
 
@@ -26,7 +26,7 @@ of the **Overview** tab:
 
 If an application is successfully deployed to an
 [environment](../../../ci/environments/_index.md), the deployed environment and the link to the
-[review app](../../../ci/review_apps/index.md) are both shown.
+[review app](../../../ci/review_apps/_index.md) are both shown.
 
 NOTE:
 When the pipeline fails in a merge request but it can still merge,
@@ -46,7 +46,7 @@ stop button. If the pipeline fails to deploy, GitLab hides the deployment inform
 
 ![Merge request pipeline](img/post_merge_pipeline_v16_0.png)
 
-For more information, [read about pipelines](../../../ci/pipelines/index.md).
+For more information, [read about pipelines](../../../ci/pipelines/_index.md).
 
 ## Set auto-merge
 
@@ -55,16 +55,16 @@ Set a merge request that looks ready to merge to
 
 ## Live preview with review apps
 
-Configure [review apps](../../../ci/review_apps/index.md) for your project
+Configure [review apps](../../../ci/review_apps/_index.md) for your project
 to preview the changes submitted to a feature branch through a merge request
 on a per-branch basis. You don't need to check out the branch, install, and preview locally.
 All your changes are available to preview by anyone with the review apps link.
 
-With GitLab [Route Maps](../../../ci/review_apps/index.md#route-maps) set, the
+With GitLab [Route Maps](../../../ci/review_apps/_index.md#route-maps) set, the
 merge request widget takes you directly to the pages changed, making it easier and
 faster to preview proposed modifications.
 
-[Read more about review apps](../../../ci/review_apps/index.md).
+[Read more about review apps](../../../ci/review_apps/_index.md).
 
 ## License compliance
 
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index 6ee5bc52138ff69b1f67cf14708913e5bd06f1e7..ade04aa81a9c2917313c957e1711b593b7aefbc4 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -13,7 +13,7 @@ This tutorial shows you how to create a Pages site from scratch using
 the [Jekyll](https://jekyllrb.com/) Static Site Generator (SSG). You start with
 a blank project and create your own CI/CD configuration file, which gives
 instructions to a [runner](https://docs.gitlab.com/runner/). When your CI/CD
-[pipeline](../../../../ci/pipelines/index.md) runs, the Pages site is created.
+[pipeline](../../../../ci/pipelines/_index.md) runs, the Pages site is created.
 
 This example uses Jekyll, but other SSGs follow similar steps.
 You do not need to be familiar with Jekyll or SSGs
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 081e4f849d8d080203c326f9ad58400fb33f251c..2d23765d583bdd7f8c5ebb882cf7e983bd98b347 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -76,7 +76,7 @@ GitLab always deploys your website from a specific folder called `public` in you
 repository. When you create a new project in GitLab, a [repository](../repository/index.md)
 becomes available automatically.
 
-To deploy your site, GitLab uses its built-in tool called [GitLab CI/CD](../../../ci/index.md)
+To deploy your site, GitLab uses its built-in tool called [GitLab CI/CD](../../../ci/_index.md)
 to build your site and publish it to the GitLab Pages server. The sequence of
 scripts that GitLab CI/CD runs to accomplish this task is created from a file named
 `.gitlab-ci.yml`, which you can [create and modify](getting_started/pages_from_scratch.md).
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index 5285575105126c300ad935325936551f69c0245b..23b876047d18c47d3e59cd8a40fdf4731a42c8f5 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -26,7 +26,7 @@ The development workflow for branches is:
    To streamline this process, you should follow
    [branch naming patterns](#prefix-branch-names-with-issue-numbers).
 1. When the work is ready for review, create a [merge request](../../merge_requests/_index.md) to propose merging the changes in your branch.
-1. Preview the changes with a [review app](../../../../ci/review_apps/index.md).
+1. Preview the changes with a [review app](../../../../ci/review_apps/_index.md).
 1. [Request a review](../../merge_requests/reviews/_index.md#request-a-review).
 1. After your merge request is approved, merge your branch to the origin branch.
    The [merge method](../../merge_requests/methods/_index.md) determines how merge requests
@@ -150,7 +150,7 @@ Branch names with specific formatting offer extra benefits:
   [prefixing branch names with issue numbers](#prefix-branch-names-with-issue-numbers).
 - Automate [branch protections](protected.md) based on branch name.
 - Test branch names with [push rules](../push_rules.md) before branches are pushed up to GitLab.
-- Define which [CI/CD jobs](../../../../ci/jobs/index.md) to run on merge requests.
+- Define which [CI/CD jobs](../../../../ci/jobs/_index.md) to run on merge requests.
 
 ### Configure default pattern for branch names from issues
 
diff --git a/doc/user/project/repository/branches/protected.md b/doc/user/project/repository/branches/protected.md
index e04c92a8eea684a6a585b47144bee82c4ec0db85..714ed613a8020b7fd3dd15ca0a3dc1c8b9fbc9ee 100644
--- a/doc/user/project/repository/branches/protected.md
+++ b/doc/user/project/repository/branches/protected.md
@@ -423,7 +423,7 @@ Because [merge request pipelines](../../../../ci/pipelines/merge_request_pipelin
 branch, a pipeline isn't created if the user opening a merge request does not have permission to merge
 or push to the source branch.
 
-See [Security on protected branches](../../../../ci/pipelines/index.md#pipeline-security-on-protected-branches)
+See [Security on protected branches](../../../../ci/pipelines/_index.md#pipeline-security-on-protected-branches)
 for details about the pipelines security model.
 
 ## Create a new branch with protections
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 36aa26658e66368452e72822160799d3ab67be9c..15c5113b1994e4890ffc3f522689ff3e2640f47f 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -157,7 +157,7 @@ When you [rename a user](../../profile/index.md#change-your-username),
 
 After you change a path, you must update the existing URL in the following resources:
 
-- [Include statements](../../../ci/yaml/includes.md) except [`include:component`](../../../ci/components/index.md),
+- [Include statements](../../../ci/yaml/includes.md) except [`include:component`](../../../ci/components/_index.md),
   otherwise pipelines fail with a syntax error. CI/CD component references can follow redirects.
 - Namespaced API calls that use the [encoded path](../../../api/rest/_index.md#namespaced-paths)
   instead of the numeric namespace and project IDs.
diff --git a/doc/user/project/repository/mirror/troubleshooting.md b/doc/user/project/repository/mirror/troubleshooting.md
index d96a1be37721f9fba389ac3f609d5d31154bb3b9..e488778e387f11f6a3996133de8ff52db0fe32ff 100644
--- a/doc/user/project/repository/mirror/troubleshooting.md
+++ b/doc/user/project/repository/mirror/troubleshooting.md
@@ -53,7 +53,7 @@ This error can occur when a firewall performs a `Deep SSH Inspection` on outgoin
 ## Could not read username: terminal prompts disabled
 
 If you receive this error after creating a new project using
-[GitLab CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/index.md):
+[GitLab CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/_index.md):
 
 - In Bitbucket Cloud:
 
@@ -110,7 +110,7 @@ Pipelines might not run for multiple reasons:
   [is not displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/346630)
   when checking the project afterwards.
 
-  When mirroring is set up using [CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/index.md)
+  When mirroring is set up using [CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/_index.md)
   this setting is enabled by default. If repository mirroring is manually reconfigured, triggering pipelines
   is off by default and this could be why pipelines stop running.
 - [`rules`](../../../../ci/yaml/_index.md#rules) configuration prevents any jobs from
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index 4760efa06409e9fcc3e3349a8a6ac617346935e4..1323ec790aa172c1d6298cba1c7c5e13e8c65967 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -20,7 +20,7 @@ If an industry standard *requires* that your application has a certain feature o
 When a feature is no longer necessary, you can [archive the related requirement](#archive-a-requirement).
 
 NOTE:
-Requirements and [test cases](../../../ci/test_cases/index.md) are being
+Requirements and [test cases](../../../ci/test_cases/_index.md) are being
 [migrated to work items](https://gitlab.com/groups/gitlab-org/-/epics/5171).
 [Issue 323790](https://gitlab.com/gitlab-org/gitlab/-/issues/323790) proposes to link requirements to test cases.
 For more information, see [Product Stage Direction - Plan](https://about.gitlab.com/direction/plan/).
@@ -217,7 +217,7 @@ requirements_confirmation:
       requirements: tmp/requirements.json
 ```
 
-Because requirements and [test cases](../../../ci/test_cases/index.md) are being
+Because requirements and [test cases](../../../ci/test_cases/_index.md) are being
 [migrated to work items](https://gitlab.com/groups/gitlab-org/-/epics/5171), if you have enabled work items
 in a project, you must replace `requirements` in above configs with `requirements_v2`:
 
diff --git a/doc/user/project/settings/migrate_projects.md b/doc/user/project/settings/migrate_projects.md
index 779ebf3dcf5534014ee94361595752c5a24efc1a..ad2f4d03a423051dfba83b698a73f94c01f8dbdf 100644
--- a/doc/user/project/settings/migrate_projects.md
+++ b/doc/user/project/settings/migrate_projects.md
@@ -75,8 +75,8 @@ to move any project to any namespace.
 When you transfer a project from a namespace licensed for GitLab.com Premium or Ultimate to GitLab Free:
 
 - [Project access tokens](../settings/project_access_tokens.md) are revoked.
-- [Pipeline subscriptions](../../../ci/pipelines/index.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated)
-  and [test cases](../../../ci/test_cases/index.md) are deleted.
+- [Pipeline subscriptions](../../../ci/pipelines/_index.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated)
+  and [test cases](../../../ci/test_cases/_index.md) are deleted.
 
 ## Troubleshooting
 
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index b51d24d6f88bf618e78494042d732f1be43e4ce0..94b9ff57918774965387253261515265042dc503 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -557,7 +557,7 @@ repository. For example, if an administrator creates the alias `gitlab` for the
 ## Related topics
 
 - [Import a project](import/index.md).
-- [Connect an external repository to GitLab CI/CD](../../ci/ci_cd_for_external_repos/index.md).
+- [Connect an external repository to GitLab CI/CD](../../ci/ci_cd_for_external_repos/_index.md).
 - [Fork a project](repository/forking_workflow.md#create-a-fork).
 - Adjust [project visibility](../public_access.md#change-project-visibility) and [permissions](settings/index.md#configure-project-features-and-permissions).
 - [Rules for project and group names](../reserved_names.md#rules-for-usernames-project-and-group-names-and-slugs)
diff --git a/ee/app/assets/javascripts/ci/pipeline_subscriptions/components/pipeline_subscriptions_form.vue b/ee/app/assets/javascripts/ci/pipeline_subscriptions/components/pipeline_subscriptions_form.vue
index df61773d5d1c7ce3566c0e93e16eb4752a1759f2..45850fc8d6289c3d9f465967f0bd806c53f450a1 100644
--- a/ee/app/assets/javascripts/ci/pipeline_subscriptions/components/pipeline_subscriptions_form.vue
+++ b/ee/app/assets/javascripts/ci/pipeline_subscriptions/components/pipeline_subscriptions_form.vue
@@ -19,7 +19,7 @@ export default {
     ),
     addSuccess: s__('PipelineSubscriptions|Subscription successfully added.'),
   },
-  docsLink: helpPagePath('ci/pipelines/index', {
+  docsLink: helpPagePath('ci/pipelines/_index', {
     anchor: 'trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated',
   }),
   components: {
diff --git a/ee/app/assets/javascripts/project_quality_summary/app.vue b/ee/app/assets/javascripts/project_quality_summary/app.vue
index 19516aa4c1859ec947fbf4ce163b224122565917..1c61e1fa031348694215a3ce64b2993b893f4e58 100644
--- a/ee/app/assets/javascripts/project_quality_summary/app.vue
+++ b/ee/app/assets/javascripts/project_quality_summary/app.vue
@@ -105,7 +105,7 @@ export default {
   i18n,
   testRunsHelpPath: helpPagePath('ci/testing/unit_test_reports'),
   codeQualityHelpPath: helpPagePath('ci/testing/code_quality'),
-  coverageHelpPath: helpPagePath('ci/testing/test_coverage_visualization'),
+  coverageHelpPath: helpPagePath('ci/testing/test_coverage_visualization/_index'),
 };
 </script>
 <template>
diff --git a/ee/app/assets/javascripts/project_quality_summary/components/test_runs_empty_state.vue b/ee/app/assets/javascripts/project_quality_summary/components/test_runs_empty_state.vue
index 01826df0142ecea2948e49f9ebcb25e724f74105..4983b4f68f3aa9285cd37a5edc395fbc7ff8572d 100644
--- a/ee/app/assets/javascripts/project_quality_summary/components/test_runs_empty_state.vue
+++ b/ee/app/assets/javascripts/project_quality_summary/components/test_runs_empty_state.vue
@@ -10,7 +10,7 @@ export default {
     GlIcon,
   },
   inject: ['testRunsEmptyStateImagePath'],
-  testRunsHelpPath: helpPagePath('ci/testing/test_coverage_visualization'),
+  testRunsHelpPath: helpPagePath('ci/testing/test_coverage_visualization/_index'),
   i18n,
 };
 </script>
diff --git a/ee/app/assets/javascripts/security_orchestration/components/policy_editor/skip_ci_selector.vue b/ee/app/assets/javascripts/security_orchestration/components/policy_editor/skip_ci_selector.vue
index 80d5ae25d1042473cb9cdb0428043fff06f176a1..6ca7541d82d8d15338e5e3e258177a0d9fe2aa61 100644
--- a/ee/app/assets/javascripts/security_orchestration/components/policy_editor/skip_ci_selector.vue
+++ b/ee/app/assets/javascripts/security_orchestration/components/policy_editor/skip_ci_selector.vue
@@ -7,7 +7,7 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils';
 import UserSelect from 'ee/security_orchestration/components/policy_editor/scan_result/action/user_select.vue';
 
 export default {
-  SKIP_CI_PATH: helpPagePath('ci/pipelines/index.md', { anchor: 'skip-a-pipeline' }),
+  SKIP_CI_PATH: helpPagePath('ci/pipelines/_index.md', { anchor: 'skip-a-pipeline' }),
   i18n: {
     skipCiConfigurationLabel: s__('SecurityOrchestration|Prevent users from skipping pipelines'),
     skipCiHeader: s__(
diff --git a/ee/app/assets/javascripts/usage_quotas/pipelines/constants.js b/ee/app/assets/javascripts/usage_quotas/pipelines/constants.js
index a5657bae0f86e8229783a9a37b2baad5ce9a2153..9fa30e8ff0efa315de9273762920a8c216fcf9a0 100644
--- a/ee/app/assets/javascripts/usage_quotas/pipelines/constants.js
+++ b/ee/app/assets/javascripts/usage_quotas/pipelines/constants.js
@@ -58,4 +58,4 @@ export const LABEL_BUY_ADDITIONAL_MINUTES = s__('UsageQuota|Buy additional compu
 export const LABEL_CI_MINUTES_DISABLED = s__(
   'UsageQuota|No compute usage data because %{linkStart}Instance runners%{linkEnd} are disabled, or there are no projects in this group.',
 );
-export const SHARED_RUNNERS_DOC_LINK = helpPagePath('ci/runners/index.md');
+export const SHARED_RUNNERS_DOC_LINK = helpPagePath('ci/runners/_index.md');
diff --git a/ee/app/assets/javascripts/usage_quotas/transfer/components/usage_by_type.vue b/ee/app/assets/javascripts/usage_quotas/transfer/components/usage_by_type.vue
index 5d38f5561501cd4eac38ddae923477cbf2f18f12..c93a0f1769eca6ffda809f5db11a5e09b24846a9 100644
--- a/ee/app/assets/javascripts/usage_quotas/transfer/components/usage_by_type.vue
+++ b/ee/app/assets/javascripts/usage_quotas/transfer/components/usage_by_type.vue
@@ -68,7 +68,7 @@ export default {
           label: __('Artifacts'),
           description: s__('UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD.'),
           icon: 'disk',
-          helpPath: helpPagePath('ci/caching/index', {
+          helpPath: helpPagePath('ci/caching/_index', {
             anchor: 'artifacts',
           }),
           humanSize: numberToHumanSize(this.egressTypesCombined[EGRESS_TYPE_ARTIFACTS]),
diff --git a/ee/app/views/projects/settings/subscriptions/_table.html.haml b/ee/app/views/projects/settings/subscriptions/_table.html.haml
index 298716afd5cc66a6a5321ef2b0a8b80aa357a863..377a9b3a3e87ebd4c26948e3624fbdc1ab10b8be 100644
--- a/ee/app/views/projects/settings/subscriptions/_table.html.haml
+++ b/ee/app/views/projects/settings/subscriptions/_table.html.haml
@@ -24,7 +24,7 @@
           .form-group
             = f.label :upstream_project_path do
               = _("Project path")
-              = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/index.md', anchor: 'trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated'), target: '_blank', rel: 'noopener noreferrer'
+              = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/_index.md', anchor: 'trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated'), target: '_blank', rel: 'noopener noreferrer'
             = f.text_field :upstream_project_path, class: "form-control", data: { testid: "upstream-project-path-field" }
           .gl-flex.gl-gap-3.gl-mt-3
             = render Pajamas::ButtonComponent.new(variant: :confirm, type: :submit, button_options: { data: { testid: "subscribe-button" } }) do
diff --git a/ee/app/views/shared/integrations/google_cloud_platform_workload_identity_federation/_help.html.haml b/ee/app/views/shared/integrations/google_cloud_platform_workload_identity_federation/_help.html.haml
index f9e148cf055c1463aad00e49fa176852c8abe396..fa8520893e03acc539a5a00b931927001dd9eff7 100644
--- a/ee/app/views/shared/integrations/google_cloud_platform_workload_identity_federation/_help.html.haml
+++ b/ee/app/views/shared/integrations/google_cloud_platform_workload_identity_federation/_help.html.haml
@@ -3,5 +3,5 @@
     %p
       = s_('GoogleCloud|Manage permissions for Google Cloud resources with Identity and Access Management (IAM). Simplify and secure your usage, without the need to manage accounts or keys.')
     %p
-      - tag_pair_docs = tag_pair(link_to('', help_page_path('ci/gitlab_google_cloud_integration/index.md'), target: '_blank', rel: 'noopener noreferrer'), :link_start, :link_end)
+      - tag_pair_docs = tag_pair(link_to('', help_page_path('ci/gitlab_google_cloud_integration/_index.md'), target: '_blank', rel: 'noopener noreferrer'), :link_start, :link_end)
       = safe_format(s_('GoogleCloud|%{link_start}Explore Google Cloud integration with GitLab%{link_end}, for CI/CD and more.'), tag_pair_docs)
diff --git a/ee/spec/frontend/ci/pipeline_subscriptions/components/pipeline_subscriptions_form_spec.js b/ee/spec/frontend/ci/pipeline_subscriptions/components/pipeline_subscriptions_form_spec.js
index 7fac6b041403edf37d6eb87ae03d7e127c1f73a3..9ac342f60113b5c03b1b6501195b48287035ad94 100644
--- a/ee/spec/frontend/ci/pipeline_subscriptions/components/pipeline_subscriptions_form_spec.js
+++ b/ee/spec/frontend/ci/pipeline_subscriptions/components/pipeline_subscriptions_form_spec.js
@@ -112,7 +112,7 @@ describe('Pipeline subscriptions form', () => {
     createComponent(defaultHandlers, mountExtended);
 
     expect(findHelpLink().attributes('href')).toBe(
-      '/help/ci/pipelines/index#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated',
+      '/help/ci/pipelines/_index#trigger-a-pipeline-when-an-upstream-project-is-rebuilt-deprecated',
     );
   });
 });
diff --git a/ee/spec/frontend/usage_quotas/transfer/components/usage_by_type_spec.js b/ee/spec/frontend/usage_quotas/transfer/components/usage_by_type_spec.js
index 93a4815e51e1ba93ae5b9dc57f3d72cf7df6f6de..d38ace781e557d22291adf3add5db107baba35eb 100644
--- a/ee/spec/frontend/usage_quotas/transfer/components/usage_by_type_spec.js
+++ b/ee/spec/frontend/usage_quotas/transfer/components/usage_by_type_spec.js
@@ -136,7 +136,7 @@ describe('UsageByType', () => {
       describe('Transfer type column', () => {
         describe.each`
           rowIndex | expectedIcon                 | expectedLabelAndDescription                                                          | expectedHelpPath
-          ${0}     | ${'disk'}                    | ${'Artifacts Pipeline artifacts and job artifacts, created with CI/CD.'}             | ${'/help/ci/caching/index#artifacts'}
+          ${0}     | ${'disk'}                    | ${'Artifacts Pipeline artifacts and job artifacts, created with CI/CD.'}             | ${'/help/ci/caching/_index#artifacts'}
           ${1}     | ${'infrastructure-registry'} | ${'Repository Git repository.'}                                                      | ${'/help/user/project/repository/repository_size'}
           ${2}     | ${'package'}                 | ${'Packages Code packages and container images.'}                                    | ${'/help/user/packages/package_registry/index'}
           ${3}     | ${'disk'}                    | ${'Registry Gitlab-integrated Docker Container Registry for storing Docker Images.'} | ${'/help/user/packages/container_registry/reduce_container_registry_storage'}
diff --git a/spec/frontend/ide/components/pipelines/empty_state_spec.js b/spec/frontend/ide/components/pipelines/empty_state_spec.js
index 71de9aecb52a1247e2973402b448a7e106d5e5a7..bc52a8af70bd12036bdbec596945c6573fab49fd 100644
--- a/spec/frontend/ide/components/pipelines/empty_state_spec.js
+++ b/spec/frontend/ide/components/pipelines/empty_state_spec.js
@@ -32,7 +32,7 @@ describe('~/ide/components/pipelines/empty_state.vue', () => {
         title: EmptyState.i18n.title,
         description: EmptyState.i18n.description,
         primaryButtonText: EmptyState.i18n.primaryButtonText,
-        primaryButtonLink: '/help/ci/quick_start/index.md',
+        primaryButtonLink: '/help/ci/quick_start/_index.md',
         svgPath: TEST_PIPELINES_EMPTY_STATE_SVG_PATH,
       });
     });
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_nothing_to_merge_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_nothing_to_merge_spec.js
index d8eec16539544a9a4e88ca3aabc505496bb791cb..d226e04db84fa3d75caa618c9454c9047d0e3ccf 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_nothing_to_merge_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_nothing_to_merge_spec.js
@@ -30,7 +30,7 @@ describe('NothingToMerge', () => {
     });
 
     it('renders text with link to CI Help Page', () => {
-      expect(findHelpLink().attributes('href')).toBe(helpPagePath('ci/quick_start/index.html'));
+      expect(findHelpLink().attributes('href')).toBe(helpPagePath('ci/quick_start/_index.html'));
     });
   });
 });
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index 39b0f39dc7a0c6949b597c60f85ebf9f2154e3bb..aa35b98814b16e79504291e15a3069cb70233d53 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -28,8 +28,8 @@
       {
         "ci-catalog-path" => explore_catalog_index_path,
         "ci-config-path": project.ci_config_path_or_default,
-        "ci-examples-help-page-path" => help_page_path('ci/examples/index.md'),
-        "ci-help-page-path" => help_page_path('ci/index.md'),
+        "ci-examples-help-page-path" => help_page_path('ci/examples/_index.md'),
+        "ci-help-page-path" => help_page_path('ci/_index.md'),
         "ci-lint-path" => project_ci_lint_path(project),
         "ci-troubleshooting-path" => help_page_path('ci/debugging.md', anchor: 'job-configuration-issues'),
         "default-branch" => project.default_branch_or_main,
@@ -43,7 +43,7 @@
         "project-path" => project.path,
         "project-full-path" => project.full_path,
         "project-namespace" => project.namespace.full_path,
-        "simulate-pipeline-help-page-path" => help_page_path('ci/pipeline_editor/index.md', anchor: 'simulate-a-cicd-pipeline'),
+        "simulate-pipeline-help-page-path" => help_page_path('ci/pipeline_editor/_index.md', anchor: 'simulate-a-cicd-pipeline'),
         "uses-external-config" => 'false',
         "validate-tab-illustration-path" => 'illustrations/validate.svg',
         "yml-help-page-path" => help_page_path('ci/yaml/_index.md')
diff --git a/spec/presenters/projects/security/configuration_presenter_spec.rb b/spec/presenters/projects/security/configuration_presenter_spec.rb
index 80402de567cd719ac4ae265bacc348cd2182d1b4..134864dbe7c5a34755f8f4af0a99280664beb8fe 100644
--- a/spec/presenters/projects/security/configuration_presenter_spec.rb
+++ b/spec/presenters/projects/security/configuration_presenter_spec.rb
@@ -274,7 +274,7 @@
       end
 
       it 'includes a link to CI pipeline docs' do
-        expect(html_data[:latest_pipeline_path]).to eq(help_page_path('ci/pipelines/index.md'))
+        expect(html_data[:latest_pipeline_path]).to eq(help_page_path('ci/pipelines/_index.md'))
       end
 
       context 'when gathering feature data' do