diff --git a/bin/config-validator.js b/bin/config-validator.js
index 2b921495ae35d4de8b34c157c878968bb7130684..34c29735e41ca7fcec368b4dc39ae6213cb73ed6 100644
--- a/bin/config-validator.js
+++ b/bin/config-validator.js
@@ -4,6 +4,7 @@ const fs = require('fs-extra');
 const { validateConfig } = require('../lib/config/validation');
 const { massageConfig } = require('../lib/config/massage');
 const { initLogger } = require('../lib/logger');
+const { configFileNames } = require('../lib/workers/repository/config');
 
 initLogger();
 
@@ -28,12 +29,7 @@ async function validate(desc, config, isPreset = false) {
 }
 
 (async () => {
-  const renovateConfigFiles = [
-    'renovate.json',
-    '.renovaterc',
-    '.renovaterc.json',
-  ];
-  for (const file of renovateConfigFiles) {
+  for (const file of configFileNames) {
     try {
       const rawContent = fs.readFileSync(file, 'utf8');
       console.log(`Validating ${file}`);
diff --git a/docs/configuration.md b/docs/configuration.md
index de71d48a2f8e572319f3357c244eaab044c46504..9b524ac675d62e50ec9585ad84371af7451a3d1b 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -7,7 +7,7 @@ Configuration is supported via any or all of the below:
 - Configuration file
 - Environment
 - CLI
-- `renovate.json`, `.renovaterc.json`, or `.renovaterc` in target repository
+- `renovate.json`, `.github/renovate.json`, `.renovaterc.json`, or `.renovaterc` in target repository
 - `renovate` field of `package.json` in target repository
 
 The above are listed in reverse order of preference. i.e. `package.json`
diff --git a/lib/platform/github/index.js b/lib/platform/github/index.js
index 2ed7dd0c94c21a009b0856c3000530c379f4f623..83b29508164e001ffc3b8d20a25a6d04a656aac1 100644
--- a/lib/platform/github/index.js
+++ b/lib/platform/github/index.js
@@ -8,6 +8,10 @@ const hostRules = require('../../util/host-rules');
 const Storage = require('./storage');
 const GitStorage = require('../git/storage');
 
+const { configFileNames } = require('../../../lib/workers/repository/config');
+
+const defaultConfigFile = configFileNames[0];
+
 let config = {};
 
 module.exports = {
@@ -156,8 +160,9 @@ async function initRepo({
       try {
         const renovateConfig = JSON.parse(
           Buffer.from(
-            (await get(`repos/${config.repository}/contents/renovate.json`))
-              .body.content,
+            (await get(
+              `repos/${config.repository}/contents/${defaultConfigFile}`
+            )).body.content,
             'base64'
           ).toString()
         );
diff --git a/lib/workers/repository/config.js b/lib/workers/repository/config.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f4aeb4d40c9881fadf2cb86783d3128a8d78767
--- /dev/null
+++ b/lib/workers/repository/config.js
@@ -0,0 +1,11 @@
+const configFileNames = [
+  'renovate.json',
+  '.github/renovate.json',
+  '.renovaterc',
+  '.renovaterc.json',
+  'package.json',
+];
+
+module.exports = {
+  configFileNames,
+};
diff --git a/lib/workers/repository/finalise/validate.js b/lib/workers/repository/finalise/validate.js
index 2ae1720b86ddaea122380fc4a28ed3a9bd426cdc..3995b3826a8fc2247049587e010bd0f0780e4419 100644
--- a/lib/workers/repository/finalise/validate.js
+++ b/lib/workers/repository/finalise/validate.js
@@ -1,4 +1,5 @@
 const { migrateAndValidate } = require('../../../config/migrate-validate');
+const { configFileNames } = require('../config');
 
 async function getRenovatePrs(branchPrefix) {
   return (await platform.getPrList())
@@ -8,12 +9,6 @@ async function getRenovatePrs(branchPrefix) {
 }
 
 async function getRenovateFiles(prNo) {
-  const configFileNames = [
-    'package.json',
-    'renovate.json',
-    '.renovaterc',
-    '.renovaterc.json',
-  ];
   return (await platform.getPrFiles(prNo)).filter(file =>
     configFileNames.includes(file)
   );
diff --git a/lib/workers/repository/init/config.js b/lib/workers/repository/init/config.js
index 4c83bc46005f4697dd387ad7c79518ace29c0081..68e1a094a3f80d3a21ce698f01cf6a718d3ebf0c 100644
--- a/lib/workers/repository/init/config.js
+++ b/lib/workers/repository/init/config.js
@@ -7,8 +7,11 @@ const presets = require('../../../config/presets');
 const npmApi = require('../../../datasource/npm');
 const { flattenPackageRules } = require('./flatten');
 const hostRules = require('../../../util/host-rules');
+const { configFileNames } = require('../config');
 
-// Check for config in `renovate.json`
+const defaultConfigFile = configFileNames[0];
+
+// Check for repository config
 async function mergeRenovateConfig(config) {
   let returnConfig = { ...config };
   // istanbul ignore if
@@ -16,7 +19,7 @@ async function mergeRenovateConfig(config) {
     logger.info('Repository is in mirror mode');
     const renovateJson = JSON.parse(
       await platform.getFile(
-        'renovate.json',
+        defaultConfigFile,
         config.repoIsOnboarded ? 'renovate-config' : 'renovate/configure'
       )
     );
@@ -28,26 +31,25 @@ async function mergeRenovateConfig(config) {
     return returnConfig;
   }
   const fileList = await platform.getFileList();
-  let configFile;
-  if (fileList.includes('renovate.json')) {
-    configFile = 'renovate.json';
-  } else if (fileList.includes('.github/renovate.json')) {
-    configFile = '.github/renovate.json';
-  } else if (fileList.includes('.renovaterc')) {
-    configFile = '.renovaterc';
-  } else if (fileList.includes('.renovaterc.json')) {
-    configFile = '.renovaterc.json';
-  } else if (fileList.includes('package.json')) {
-    try {
-      const pJson = JSON.parse(await platform.getFile('package.json'));
-      if (pJson.renovate) {
-        logger.info('Using package.json for global renovate config');
-        configFile = 'package.json';
+  async function detectConfigFile() {
+    for (const fileName of configFileNames) {
+      if (fileName === 'package.json') {
+        try {
+          const pJson = JSON.parse(await platform.getFile('package.json'));
+          if (pJson.renovate) {
+            logger.info('Using package.json for global renovate config');
+            return 'package.json';
+          }
+        } catch (err) {
+          // Do nothing
+        }
+      } else if (fileList.includes(fileName)) {
+        return fileName;
       }
-    } catch (err) {
-      // Do nothing
     }
+    return null;
   }
+  const configFile = await detectConfigFile();
   if (!configFile) {
     logger.debug('No renovate config file found');
     return returnConfig;
@@ -123,7 +125,7 @@ async function mergeRenovateConfig(config) {
   }
   delete migratedConfig.errors;
   delete migratedConfig.warnings;
-  logger.debug({ config: migratedConfig }, 'renovate.json migrated config');
+  logger.debug({ config: migratedConfig }, 'migrated config');
   // Decrypt before resolving in case we need npm authentication for any presets
   const decryptedConfig = decryptConfig(migratedConfig, config.privateKey);
   // istanbul ignore if
diff --git a/lib/workers/repository/onboarding/branch/check.js b/lib/workers/repository/onboarding/branch/check.js
index 2f13de83abb29189749b9cbc54b58d141537a993..d8cd7b8fd597c3033ac8b91339246fb366c730c4 100644
--- a/lib/workers/repository/onboarding/branch/check.js
+++ b/lib/workers/repository/onboarding/branch/check.js
@@ -1,14 +1,19 @@
+const { configFileNames } = require('../../config');
+
 const findFile = async fileName => {
   logger.debug(`findFile(${fileName})`);
   const fileList = await platform.getFileList();
   return fileList.includes(fileName);
 };
 
-const renovateJsonExists = async () =>
-  (await findFile('renovate.json')) ||
-  (await findFile('.github/renovate.json')) ||
-  (await findFile('.renovaterc')) ||
-  findFile('.renovaterc.json');
+const configFileExists = async () => {
+  for (const fileName of configFileNames) {
+    if (fileName !== 'package.json' && (await findFile(fileName))) {
+      return true;
+    }
+  }
+  return false;
+};
 
 const packageJsonRenovateExists = async () => {
   try {
@@ -31,13 +36,13 @@ const isOnboarded = async config => {
   if (config.onboarding === false) {
     return true;
   }
-  if (await renovateJsonExists()) {
-    logger.debug('renovate.json exists');
+  if (await configFileExists()) {
+    logger.debug('config file exists');
     return true;
   }
-  logger.debug('renovate.json not found');
+  logger.debug('config file not found');
   if (await packageJsonRenovateExists()) {
-    logger.debug('package.json contains renovate config');
+    logger.debug('package.json contains config');
     return true;
   }
   const pr = await closedPrExists(config);
diff --git a/lib/workers/repository/onboarding/branch/create.js b/lib/workers/repository/onboarding/branch/create.js
index e60fe8387aaa7972c521d267c368e107b5482b65..a10c071d7f2d99854bd29441c2f2cc5044012e91 100644
--- a/lib/workers/repository/onboarding/branch/create.js
+++ b/lib/workers/repository/onboarding/branch/create.js
@@ -1,4 +1,7 @@
 const { getOnboardingConfig } = require('./config');
+const { configFileNames } = require('../../config');
+
+const defaultConfigFile = configFileNames[0];
 
 async function createOnboardingBranch(config) {
   logger.debug('createOnboardingBranch()');
@@ -12,9 +15,9 @@ async function createOnboardingBranch(config) {
       commitMessage += `(${config.semanticCommitScope})`;
     }
     commitMessage += ': ';
-    commitMessage += 'add renovate.json';
+    commitMessage += 'add ' + defaultConfigFile;
   } else {
-    commitMessage = 'Add renovate.json';
+    commitMessage = 'Add ' + defaultConfigFile;
   }
   // istanbul ignore if
   if (config.dryRun) {
@@ -24,7 +27,7 @@ async function createOnboardingBranch(config) {
       `renovate/configure`,
       [
         {
-          name: 'renovate.json',
+          name: defaultConfigFile,
           contents,
         },
       ],
diff --git a/lib/workers/repository/onboarding/branch/rebase.js b/lib/workers/repository/onboarding/branch/rebase.js
index f8d6785faf82489bdb9c4e8296fe9c5e6a9e8298..6984275f685a2df9f3e737d8012db8dc47577dfe 100644
--- a/lib/workers/repository/onboarding/branch/rebase.js
+++ b/lib/workers/repository/onboarding/branch/rebase.js
@@ -1,4 +1,7 @@
 const { getOnboardingConfig } = require('./config');
+const { configFileNames } = require('../../config');
+
+const defaultConfigFile = configFileNames[0];
 
 async function rebaseOnboardingBranch(config) {
   logger.debug('Checking if onboarding branch needs rebasing');
@@ -9,7 +12,7 @@ async function rebaseOnboardingBranch(config) {
     return;
   }
   const existingContents = await platform.getFile(
-    'renovate.json',
+    defaultConfigFile,
     onboardingBranch
   );
   const contents = await getOnboardingConfig(config);
@@ -26,9 +29,9 @@ async function rebaseOnboardingBranch(config) {
       commitMessage += `(${config.semanticCommitScope})`;
     }
     commitMessage += ': ';
-    commitMessage += 'add renovate.json';
+    commitMessage += 'add ' + defaultConfigFile;
   } else {
-    commitMessage = 'Add renovate.json';
+    commitMessage = 'Add ' + defaultConfigFile;
   }
   // istanbul ignore if
   if (config.dryRun) {
@@ -38,7 +41,7 @@ async function rebaseOnboardingBranch(config) {
       onboardingBranch,
       [
         {
-          name: 'renovate.json',
+          name: defaultConfigFile,
           contents: existingContents || contents,
         },
       ],
diff --git a/lib/workers/repository/onboarding/pr/config-description.js b/lib/workers/repository/onboarding/pr/config-description.js
index ab6779e3774989014ea1d6a8eee6bb9bcfb226fd..14806687735f72a5f16e15c3899c6bfa298826dd 100644
--- a/lib/workers/repository/onboarding/pr/config-description.js
+++ b/lib/workers/repository/onboarding/pr/config-description.js
@@ -1,3 +1,7 @@
+const { configFileNames } = require('../../config');
+
+const defaultConfigFile = configFileNames[0];
+
 function getScheduleDesc(config) {
   logger.debug('getScheduleDesc()');
   logger.trace({ config });
@@ -46,7 +50,7 @@ function getConfigDesc(config, packageFiles) {
   });
   desc += '\n';
   desc += `:abcd: Would you like to change the way Renovate is upgrading your dependencies?`;
-  desc += ` Simply edit the \`renovate.json\` in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.`;
+  desc += ` Simply edit the \`${defaultConfigFile}\` in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.`;
   desc += '\n\n---\n';
   return desc;
 }