diff --git a/docs/development/configuration.md b/docs/development/configuration.md
index b77fdfd6e3a9930ceee9818cfd2dd3ed8680e70f..54b007df01d2be1e45f131d0740600c76ef1d4fd 100644
--- a/docs/development/configuration.md
+++ b/docs/development/configuration.md
@@ -32,7 +32,7 @@ e.g. apply one set of labels for `backend/package.json` and a different set of l
 module.exports = {
   npmrc: '//registry.npmjs.org/:_authToken=abc123',
   baseDir: '/tmp/renovate',
-  includeForks: true,
+  forkProcessing: 'enabled',
   gradle: { enabled: false },
 };
 ```
diff --git a/docs/development/local-development.md b/docs/development/local-development.md
index ef07cd0a5539af35d7da28848df56f64d34a8939..a226fba39b3a664526e0757cc888b2c13be3f447 100644
--- a/docs/development/local-development.md
+++ b/docs/development/local-development.md
@@ -171,17 +171,6 @@ To do this, see these GitHub guides:
 
 ## Tips and tricks
 
-### Running Renovate against forked repositories
-
-Quite often, the quickest way for you to test or fix something is to fork an existing repository.
-But by default Renovate skips over repositories that are forked.
-To override this default, you need to specify the setting `includeForks` as `true`.
-
-Tell Renovate to run on your forked repository by doing one of the following:
-
-1. Add `"includeForks": true` to the `renovate.json` file in your forked repository
-1. Run Renovate with the CLI flag `--renovate-fork=true`
-
 ### Log files
 
 Usually, `debug` is good enough to troubleshoot most problems or verify functionality.
diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index afa89177db7aab424031e8b5a2328d37d334b8e8..6912e64938eb5f119c3bf3be233ac827460f1737 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -923,6 +923,16 @@ If this option is enabled, reviewers will need to create a new PR if additional
 !!! note
     This option is only relevant if you set `forkToken`.
 
+## forkProcessing
+
+By default, Renovate will skip over any repositories that are forked if Renovate is using `autodiscover` mode.
+This includes if the forked repository has a Renovate config file, because Renovate can't tell if that file was added by the original repository or not.
+If you wish to enable processing of a forked repository by Renovate when autodiscovering, you need to add `"forkProcessing": "enabled"` to your repository config or run the CLI command with `--fork-processing=enabled`.
+
+If you are running in non-autodiscover mode (e.g. supplying a list of repositories to Renovate) but wish to skip forked repositories, you need to configure `"forkProcessing": "disabled"` in your global config.
+
+If you are using the hosted Mend Renovate then this option will be configured to `"enabled"` automatically if you "Selected" repositories individually but `"disabled"` if you installed for "All" repositories. If you have installed Renovate into "All" repositories but have a fork you want to use, then add `"forkProcessing": "enabled"` to the repository's `renovate.json` file.
+
 ## gitAuthor
 
 You can customize the Git author that's used whenever Renovate creates a commit.
@@ -1417,14 +1427,6 @@ If you need to force permanent unstable updates for a package, you can add a pac
 
 Also check out the `followTag` configuration option above if you wish Renovate to keep you pinned to a particular release tag.
 
-## includeForks
-
-By default, Renovate will skip over any repositories that are forked.
-This includes if the forked repository has a Renovate config file, because Renovate can't tell if that file was added by the original repository or not.
-If you wish to enable processing of a forked repository by Renovate, you need to add `"includeForks": true` to your repository config or run the CLI command with `--include-forks=true`.
-
-If you are using the hosted Mend Renovate then this option will be configured to `true` automatically if you "Selected" repositories individually but remain as `false` if you installed for "All" repositories.
-
 ## includePaths
 
 If you wish for Renovate to process only select paths in the repository, use `includePaths`.
diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index fdf32c597a036ce675878a3728eecfbe160672d1..572cc3bbdb17874277a41f8e73ceb5c057525a3a 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -131,6 +131,7 @@ exports[`config/migration migrateConfig(config, parentConfig) migrates config 1`
     "config:js-lib",
     ":dependencyDashboard",
   ],
+  "forkProcessing": "enabled",
   "hostRules": [
     {
       "hostType": "docker",
@@ -142,7 +143,6 @@ exports[`config/migration migrateConfig(config, parentConfig) migrates config 1`
   "ignorePaths": [
     "node_modules/",
   ],
-  "includeForks": true,
   "lockFileMaintenance": {
     "automerge": true,
     "exposeAllEnv": false,
diff --git a/lib/config/migrations/custom/include-forks-migration.spec.ts b/lib/config/migrations/custom/include-forks-migration.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ca4ce0b9b2a5b2680be42c514c3bca4e7950f92d
--- /dev/null
+++ b/lib/config/migrations/custom/include-forks-migration.spec.ts
@@ -0,0 +1,34 @@
+import { RenovateForkMigration } from './include-forks-migration';
+
+describe('config/migrations/custom/include-forks-migration', () => {
+  it('should migrate true', () => {
+    expect(RenovateForkMigration).toMigrate(
+      {
+        includeForks: true,
+      },
+      {
+        forkProcessing: 'enabled',
+      }
+    );
+  });
+
+  it('should migrate false', () => {
+    expect(RenovateForkMigration).toMigrate(
+      {
+        includeForks: false,
+      },
+      {
+        forkProcessing: 'disabled',
+      }
+    );
+  });
+
+  it('should not migrate non boolean value', () => {
+    expect(RenovateForkMigration).toMigrate(
+      {
+        includeForks: 'test',
+      },
+      {}
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/include-forks-migration.ts b/lib/config/migrations/custom/include-forks-migration.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5afede3db6b5888eb0d65ea78c0b03d4863cb72a
--- /dev/null
+++ b/lib/config/migrations/custom/include-forks-migration.ts
@@ -0,0 +1,13 @@
+import is from '@sindresorhus/is';
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class RenovateForkMigration extends AbstractMigration {
+  override readonly deprecated = true;
+  override readonly propertyName = 'includeForks';
+
+  override run(value: unknown): void {
+    if (is.boolean(value)) {
+      this.setSafely('forkProcessing', value ? 'enabled' : 'disabled');
+    }
+  }
+}
diff --git a/lib/config/migrations/custom/renovate-fork-migration.spec.ts b/lib/config/migrations/custom/renovate-fork-migration.spec.ts
index 3e0841ebbce4ad86d903a307d89379d014f46109..daa11f1885918c05e9e131c26a87cc810d51716d 100644
--- a/lib/config/migrations/custom/renovate-fork-migration.spec.ts
+++ b/lib/config/migrations/custom/renovate-fork-migration.spec.ts
@@ -7,7 +7,7 @@ describe('config/migrations/custom/renovate-fork-migration', () => {
         renovateFork: true,
       },
       {
-        includeForks: true,
+        forkProcessing: 'enabled',
       }
     );
   });
@@ -18,7 +18,7 @@ describe('config/migrations/custom/renovate-fork-migration', () => {
         renovateFork: false,
       },
       {
-        includeForks: false,
+        forkProcessing: 'disabled',
       }
     );
   });
diff --git a/lib/config/migrations/custom/renovate-fork-migration.ts b/lib/config/migrations/custom/renovate-fork-migration.ts
index 4a2b0d61d9ddfd22966cffca9ba7d8476da7e162..071ffdac5f7ea7f1d8bd8ab2f2d216265c55be05 100644
--- a/lib/config/migrations/custom/renovate-fork-migration.ts
+++ b/lib/config/migrations/custom/renovate-fork-migration.ts
@@ -7,7 +7,7 @@ export class RenovateForkMigration extends AbstractMigration {
 
   override run(value: unknown): void {
     if (is.boolean(value)) {
-      this.setSafely('includeForks', value);
+      this.setSafely('forkProcessing', value ? 'enabled' : 'disabled');
     }
   }
 }
diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts
index 077276162487bb67d6fbe9e8e119161b59005539..1ed247e66105190b1d6b660bbd8fb4b3ee9602bc 100644
--- a/lib/config/options/index.ts
+++ b/lib/config/options/index.ts
@@ -419,12 +419,13 @@ const options: RenovateOptions[] = [
     experimentalIssues: [17633],
   },
   {
-    name: 'includeForks',
+    name: 'forkProcessing',
     description:
-      'Whether to process forked repositories. By default, all forked repositories are skipped.',
+      'Whether to process forked repositories. By default, all forked repositories are skipped when in autodiscover mode.',
     stage: 'repository',
-    type: 'boolean',
-    default: false,
+    type: 'string',
+    allowedValues: ['auto', 'enabled', 'disabled'],
+    default: 'auto',
   },
   {
     name: 'forkToken',
diff --git a/lib/config/types.ts b/lib/config/types.ts
index 9891748ea53216b7864d2478e6ea724b55251ae7..0a48bb829bad2cf2647c393a7f905375c152fea7 100644
--- a/lib/config/types.ts
+++ b/lib/config/types.ts
@@ -213,7 +213,7 @@ export interface RenovateConfig
   hostRules?: HostRule[];
 
   ignorePresets?: string[];
-  includeForks?: boolean;
+  forkProcessing?: 'auto' | 'enabled' | 'disabled';
   isFork?: boolean;
 
   fileList?: string[];
diff --git a/lib/modules/platform/types.ts b/lib/modules/platform/types.ts
index f5f8a15285be67319ec7db509e73af2b06ebb528..dab52e1aa86c1629760aa963ec0211e97fa178bb 100644
--- a/lib/modules/platform/types.ts
+++ b/lib/modules/platform/types.ts
@@ -38,7 +38,7 @@ export interface RepoParams {
   endpoint?: string;
   gitUrl?: GitUrlOption;
   forkToken?: string;
-  includeForks?: boolean;
+  forkProcessing?: 'enabled' | 'disabled';
   renovateUsername?: string;
   cloneSubmodules?: boolean;
   ignorePrAuthor?: boolean;
diff --git a/lib/workers/global/config/parse/cli.ts b/lib/workers/global/config/parse/cli.ts
index 019dc343e957288f428f227bc85eb0bcab2e5963..f12305fa3e28ab6ae867a91fe843ae87ee6f72b0 100644
--- a/lib/workers/global/config/parse/cli.ts
+++ b/lib/workers/global/config/parse/cli.ts
@@ -32,6 +32,8 @@ export function getConfig(input: string[]): AllConfig {
         .replace(/^--dry-run$/, '--dry-run=true')
         .replace(/^--require-config$/, '--require-config=true')
         .replace('--aliases', '--registry-aliases')
+        .replace('--include-forks=true', '--fork-processing=enabled')
+        .replace('--include-forks', '--fork-processing=enabled')
     )
     .filter((a) => !a.startsWith('--git-fs'));
   const options = getOptions();
diff --git a/lib/workers/global/config/parse/index.ts b/lib/workers/global/config/parse/index.ts
index 5bfed02cbf20602a1a8c4c1c3835565b316f7dad..0823d06c6ff5d9e68445a7ea20f6fdf734afac19 100644
--- a/lib/workers/global/config/parse/index.ts
+++ b/lib/workers/global/config/parse/index.ts
@@ -99,6 +99,12 @@ export async function parseConfigs(
     config.endpoint = ensureTrailingSlash(config.endpoint);
   }
 
+  // Massage forkProcessing
+  if (!config.autodiscover && config.forkProcessing !== 'disabled') {
+    logger.debug('Enabling forkProcessing while in non-autodiscover mode');
+    config.forkProcessing = 'enabled';
+  }
+
   // Remove log file entries
   delete config.logFile;
   delete config.logFileLevel;
diff --git a/lib/workers/repository/configured.ts b/lib/workers/repository/configured.ts
index 80e88016f5c9c5e55b02e83a76dc8e721beae603..d6b57ee7a33291803ff9dae449c6a8b2c3ed2696 100644
--- a/lib/workers/repository/configured.ts
+++ b/lib/workers/repository/configured.ts
@@ -8,7 +8,7 @@ export function checkIfConfigured(config: RenovateConfig): void {
   if (config.enabled === false) {
     throw new Error(REPOSITORY_DISABLED_BY_CONFIG);
   }
-  if (config.isFork && !config.includeForks) {
+  if (config.isFork && config.forkProcessing !== 'enabled') {
     throw new Error(REPOSITORY_FORKED);
   }
 }
diff --git a/lib/workers/repository/init/apis.spec.ts b/lib/workers/repository/init/apis.spec.ts
index 2daa89b7d150fdefe11f82b260ff269870de7220..b87e59d4013abf02bcb81b44446106770b09de26 100644
--- a/lib/workers/repository/init/apis.spec.ts
+++ b/lib/workers/repository/init/apis.spec.ts
@@ -15,7 +15,7 @@ describe('workers/repository/init/apis', () => {
       config.warnings = [];
       config.token = 'some-token';
       delete config.optimizeForDisabled;
-      delete config.includeForks;
+      delete config.forkProcessing;
     });
 
     afterEach(() => {
@@ -53,15 +53,30 @@ describe('workers/repository/init/apis', () => {
         isFork: true,
         repoFingerprint: '123',
       });
-      platform.getJsonFile.mockResolvedValueOnce({ includeForks: false });
+      platform.getJsonFile.mockResolvedValueOnce({
+        forkProcessing: 'disabled',
+      });
       await expect(
         initApis({
           ...config,
-          includeForks: false,
+          forkProcessing: 'disabled',
         })
       ).rejects.toThrow(REPOSITORY_FORKED);
     });
 
+    it('does not throw for includeForks=true', async () => {
+      platform.initRepo.mockResolvedValueOnce({
+        defaultBranch: 'master',
+        isFork: true,
+        repoFingerprint: '123',
+      });
+      platform.getJsonFile.mockResolvedValueOnce({
+        includeForks: true,
+      });
+      const workerPlatformConfig = await initApis(config);
+      expect(workerPlatformConfig).toBeTruthy();
+    });
+
     it('ignores platform.getJsonFile() failures', async () => {
       platform.initRepo.mockResolvedValueOnce({
         defaultBranch: 'master',
@@ -73,7 +88,7 @@ describe('workers/repository/init/apis', () => {
         initApis({
           ...config,
           optimizeForDisabled: true,
-          includeForks: false,
+          forkProcessing: 'disabled',
           isFork: true,
         })
       ).resolves.not.toThrow();
@@ -85,7 +100,9 @@ describe('workers/repository/init/apis', () => {
         isFork: false,
         repoFingerprint: '123',
       });
-      platform.getJsonFile.mockResolvedValueOnce({ includeForks: false });
+      platform.getJsonFile.mockResolvedValueOnce({
+        forkProcessing: 'disabled',
+      });
       const workerPlatformConfig = await initApis({
         ...config,
         optimizeForDisabled: true,
@@ -107,7 +124,9 @@ describe('workers/repository/init/apis', () => {
         isFork: false,
         repoFingerprint: '123',
       });
-      platform.getJsonFile.mockResolvedValueOnce({ includeForks: false });
+      platform.getJsonFile.mockResolvedValueOnce({
+        forkProcessing: 'disabled',
+      });
       const workerPlatformConfig = await initApis({
         ...config,
         optimizeForDisabled: true,
@@ -124,7 +143,7 @@ describe('workers/repository/init/apis', () => {
         isFork: false,
         repoFingerprint: '123',
       });
-      platform.getJsonFile.mockResolvedValueOnce({ includeForks: false });
+      platform.getJsonFile.mockResolvedValueOnce({ forkProcessing: false });
       const workerPlatformConfig = await initApis({
         ...config,
         optimizeForDisabled: true,
diff --git a/lib/workers/repository/init/apis.ts b/lib/workers/repository/init/apis.ts
index d1d425ad335ed4fec94d465c4480e6cf0e021692..1eec1212a139db334323742b58d6c65f7bd7a966 100644
--- a/lib/workers/repository/init/apis.ts
+++ b/lib/workers/repository/init/apis.ts
@@ -4,6 +4,7 @@ import {
   REPOSITORY_DISABLED_BY_CONFIG,
   REPOSITORY_FORKED,
 } from '../../../constants/error-messages';
+import { logger } from '../../../logger';
 import { RepoParams, RepoResult, platform } from '../../../modules/platform';
 
 // TODO: fix types (#7154)
@@ -37,11 +38,15 @@ async function validateOptimizeForDisabled(
 }
 
 async function validateIncludeForks(config: RenovateConfig): Promise<void> {
-  if (!config.includeForks && config.isFork) {
+  if (config.forkProcessing !== 'enabled' && config.isFork) {
     const renovateConfig = await getJsonFile(defaultConfigFile(config));
-    if (!renovateConfig?.includeForks) {
+    if (
+      renovateConfig?.includeForks !== true &&
+      renovateConfig?.forkProcessing !== 'enabled'
+    ) {
       throw new Error(REPOSITORY_FORKED);
     }
+    logger.debug('Repository config enables forks - continuing');
   }
 }
 
diff --git a/lib/workers/repository/onboarding/branch/index.ts b/lib/workers/repository/onboarding/branch/index.ts
index e2b07ce4bebaaa260aaa1d7f8cd1f852d3af8dc9..2add4def7375e7874ff47e861f00f5dfe0dcebd6 100644
--- a/lib/workers/repository/onboarding/branch/index.ts
+++ b/lib/workers/repository/onboarding/branch/index.ts
@@ -28,7 +28,7 @@ export async function checkOnboardingBranch(
     logger.debug('Repo is onboarded');
     return { ...config, repoIsOnboarded };
   }
-  if (config.isFork && !config.includeForks) {
+  if (config.isFork && config.forkProcessing !== 'enabled') {
     throw new Error(REPOSITORY_FORKED);
   }
   logger.debug('Repo is not onboarded');