diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index e3decb50b47139e94034f732cbe5911c6fdb8e13..bc1caf92b8e46cfa04608067416a86f9a13366e0 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -1522,8 +1522,9 @@ Note that this limit is enforced on a per-repository basis.
 
 If you configure `prCreation=not-pending`, then Renovate will wait until tests are non-pending (all pass or at least one fails) before creating PRs.
 However there are cases where PRs may remain in pending state forever, e.g. absence of tests or status checks that are configure to pending indefinitely.
-Therefore we configure an upper limit - default 24 hours - for how long we wait until creating a PR.
-Note also this is the same length of time as for Renovate's own `unpublishSafe` status check for npm.
+Therefore we configure an upper limit for how long we wait until creating a PR.
+
+Note: if the option `stabilityDays` is non-zero then Renovate will disable the `prNotPendingHours` functionality.
 
 ## prPriority
 
@@ -2022,16 +2023,6 @@ Please see the above link for valid timezone names.
 
 If enabled emoji shortcodes (`:warning:`) are replaced with their unicode equivalents (`⚠️`)
 
-## unpublishSafe
-
-It is not known by many that npm package authors and collaborators can _delete_ an npm version if it is less than 24 hours old.
-e.g. version 1.0.0 might exist, then version 1.1.0 is released, and then version 1.1.0 might get deleted hours later.
-This means that version 1.1.0 essentially "disappears" and 1.0.0 returns to being the "latest".
-If you have installed 1.1.0 during that time then your build is essentially broken.
-
-Enabling `unpublishSafe` will add a `renovate/unpublish-safe` status check with value pending to every branch to warn you about this possibility.
-It can be handy when used with the `prCreation` = `not-pending` configuration option - that way you won't get the PR raised until after a patch is 24 hours old or more.
-
 ## updateLockFiles
 
 ## updateNotScheduled
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index f7729e1fbd7cd9d97ef9a21037b8aaa6bc837e51..0d2dddb68873d3fda2fc82204f62f34fca35592e 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -1078,7 +1078,6 @@ const options: RenovateOptions[] = [
     stage: 'package',
     type: 'object',
     default: {
-      unpublishSafe: false,
       recreateClosed: true,
       rebaseWhen: 'behind-base-branch',
       groupName: 'Pin Dependencies',
@@ -1153,12 +1152,6 @@ const options: RenovateOptions[] = [
     type: 'string',
     default: 'rebase',
   },
-  {
-    name: 'unpublishSafe',
-    description: 'Set a status check for unpublish-safe upgrades',
-    type: 'boolean',
-    default: false,
-  },
   {
     name: 'stabilityDays',
     description:
@@ -1177,7 +1170,6 @@ const options: RenovateOptions[] = [
     name: 'prNotPendingHours',
     description: 'Timeout in hours for when prCreation=not-pending',
     type: 'integer',
-    // Must be at least 24 hours to give time for the unpublishSafe check to "complete".
     default: 25,
   },
   {
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index 7dfabbecbbb28c412dc7e2008fa904c310efa058..7eab999f78163af817fec31eeb8794aec1761ba1 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -118,7 +118,7 @@ describe('config/migration', () => {
           pathRules: [
             {
               paths: ['node/**'],
-              extends: ['node'],
+              extends: 'node',
             },
           ],
         },
@@ -435,6 +435,7 @@ describe('config/migration', () => {
       expect(res.isMigrated).toBe(false);
       expect(res.migratedConfig).toMatchObject({ semanticCommits: 'disabled' });
     });
+
     it('it migrates preset strings to array', () => {
       let config: RenovateConfig;
       let res: MigratedConfig;
@@ -456,5 +457,88 @@ describe('config/migration', () => {
         extends: ['foo', 'config:js-app', 'bar'],
       });
     });
+
+    it('it migrates unpublishSafe', () => {
+      let config: RenovateConfig;
+      let res: MigratedConfig;
+
+      config = { unpublishSafe: true };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['npm:unpublishSafe'],
+      });
+
+      config = { unpublishSafe: true, extends: 'foo' } as never;
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', 'npm:unpublishSafe'],
+      });
+
+      config = { unpublishSafe: true, extends: [] };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['npm:unpublishSafe'],
+      });
+
+      config = { unpublishSafe: true, extends: ['foo', 'bar'] };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', 'bar', 'npm:unpublishSafe'],
+      });
+
+      config = {
+        unpublishSafe: true,
+        extends: ['foo', ':unpublishSafe', 'bar'],
+      };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', ':unpublishSafe', 'bar', 'npm:unpublishSafe'],
+      });
+
+      config = {
+        unpublishSafe: true,
+        extends: ['foo', 'default:unpublishSafe', 'bar'],
+      };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', 'default:unpublishSafe', 'bar', 'npm:unpublishSafe'],
+      });
+
+      config = {
+        unpublishSafe: false,
+        extends: ['foo', 'bar'],
+      };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', 'bar'],
+      });
+
+      config = {
+        unpublishSafe: true,
+        extends: ['foo', 'bar'],
+      };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: ['foo', 'bar', 'npm:unpublishSafe'],
+      });
+
+      config = {
+        unpublishSafe: true,
+        extends: [':unpublishSafeDisabled'],
+      };
+      res = configMigration.migrateConfig(config);
+      expect(res.isMigrated).toBe(true);
+      expect(res.migratedConfig).toMatchObject({
+        extends: [':unpublishSafeDisabled', 'npm:unpublishSafe'],
+      });
+    });
   });
 });
diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index d98e552f11045780640b88cd7121984e123e6376..c21740a31f7bdd70c48a84c5596cd21609a46d08 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -262,6 +262,18 @@ export function migrateConfig(
             presets[i] = preset;
           }
         }
+      } else if (key === 'unpublishSafe') {
+        isMigrated = true;
+        if (val === true) {
+          migratedConfig.extends = migratedConfig.extends || [];
+          if (is.string(migratedConfig.extends)) {
+            migratedConfig.extends = [migratedConfig.extends];
+          }
+          if (!migratedConfig.extends.includes('npm:unpublishSafe')) {
+            migratedConfig.extends.push('npm:unpublishSafe');
+          }
+        }
+        delete migratedConfig.unpublishSafe;
       } else if (key === 'versionScheme') {
         isMigrated = true;
         migratedConfig.versioning = val;
@@ -535,6 +547,7 @@ export function migrateConfig(
       delete migratedConfig.endpoints;
       isMigrated = true;
     }
+
     return { isMigrated, migratedConfig };
   } catch (err) /* istanbul ignore next */ {
     logger.debug({ config }, 'migrateConfig() error');
diff --git a/lib/config/presets/__fixtures__/renovate-config-ikatyang.json b/lib/config/presets/__fixtures__/renovate-config-ikatyang.json
index db1eeb4a06b427ea335bab8b0362bbe1854a7dd3..7f1cc84d8195acc16815da12124ccf98cc80e0f9 100644
--- a/lib/config/presets/__fixtures__/renovate-config-ikatyang.json
+++ b/lib/config/presets/__fixtures__/renovate-config-ikatyang.json
@@ -1 +1 @@
-{"_id":"renovate-config-ikatyang","_rev":"4-7fb157899f3d04c90327f8f2a35bd0a5","name":"renovate-config-ikatyang","description":"renovate config for ikatyang","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"renovate-config-ikatyang","version":"1.0.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks",":maintainLockFilesWeekly"],"timezone":"Asia/Taipei","schedule":["after 12am and before 8am"],"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","unpublishSafe":false,"labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"6b33d9a7d466a1b18b00bb4be84d76ed1d23fea3","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.0.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-NBEWXir0YpMrcVF+F/PZR9uBPVolaTr8mofQsOlNTNxtXYhHqU7mUJyWia14m475i5qiWdbCsQfACn7GZugoCw==","shasum":"5ee3b01d73e4486b7dfbbe27e3d749a10eafced0","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.0.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.0.0.tgz_1503232291506_0.9969473145902157"},"directories":{}},"1.1.0":{"name":"renovate-config-ikatyang","version":"1.1.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks",":maintainLockFilesDisabled"],"timezone":"Asia/Taipei","schedule":["before 8am"],"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","unpublishSafe":false,"labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"369160195cb5b7b0fb89ef1f554d5bbbebad8c6f","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.1.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-8qKLnrqNZP+rmpcb8ddKy04mXlTUW2hrHmevT47830MfRgb0qZGLdcuKL5LG13a2WWGzzTZYsXaOqbHTLNQN6w==","shasum":"31dcfafa501e3f6b5c25349177507e7e9b5d9460","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.1.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.1.0.tgz_1503277413013_0.7997763243038207"},"directories":{}},"1.2.0":{"name":"renovate-config-ikatyang","version":"1.2.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks"],"timezone":"Asia/Taipei","schedule":["before 8am"],"lockFileMaintenance":{"enabled":true,"automerge":true,"schedule":"before 8am on Mondays"},"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","unpublishSafe":false,"labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"610de097e8b81da80c5655aada79378f362858e7","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.2.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-rBHBcgjziMslq8XB5rcA/mwN0YtXMpsvxBBSV4XuifkrbPD7LNTuehsU05wlgqqwecVzTSCtsNfKBES2qf3dVg==","shasum":"28351b9aaed9bd73f6355a93843c6823535bb1e4","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.2.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.2.0.tgz_1503317838934_0.6510782628320158"},"directories":{}},"1.2.1":{"name":"renovate-config-ikatyang","version":"1.2.1","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks"],"timezone":"Asia/Taipei","schedule":["before 8am"],"lockFileMaintenance":{"enabled":true,"automerge":true,"schedule":"before 8am on Monday"},"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","unpublishSafe":false,"labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"7406990bfb5e98e6ff127d0b2f365e6d30bad25e","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.2.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-UpgA0hwHMNS7nqjuhNVAUk5ueYMgvMeawm56VkXiJTp0ZhaGW41x+XK/w7qObmyD/pRW3h7qk3w1CooHti29Sw==","shasum":"4c6f15f94980838b8a6f90e8c134d1837cc52845","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.2.1.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.2.1.tgz_1503359610886_0.8635549147147685"},"directories":{}}},"readme":"# renovate-config-ikatyang\n\n[![npm](https://img.shields.io/npm/v/renovate-config-ikatyang.svg)](https://www.npmjs.com/package/renovate-config-ikatyang)\n[![build](https://img.shields.io/travis/ikatyang/renovate-config-ikatyang/master.svg)](https://travis-ci.org/ikatyang/renovate-config-ikatyang/builds)\n\n[renovate](https://renovatebot.com/) config for ikatyang\n\n[Changelog](https://github.com/ikatyang/renovate-config-ikatyang/blob/master/CHANGELOG.md)\n\n## Usage\n\n(renovate.json)\n\n```json\n{\n  \"extends\": \"ikatyang\"\n}\n```\n\n## License\n\nMIT © [Ika](https://github.com/ikatyang)\n","maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"time":{"modified":"2017-08-21T23:53:31.002Z","created":"2017-08-20T12:31:31.602Z","1.0.0":"2017-08-20T12:31:31.602Z","1.1.0":"2017-08-21T01:03:33.203Z","1.2.0":"2017-08-21T12:17:20.208Z","1.2.1":"2017-08-21T23:53:31.002Z"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"license":"MIT","readmeFilename":"README.md","_attachments":{}}
+{"_id":"renovate-config-ikatyang","_rev":"4-7fb157899f3d04c90327f8f2a35bd0a5","name":"renovate-config-ikatyang","description":"renovate config for ikatyang","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"renovate-config-ikatyang","version":"1.0.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks",":maintainLockFilesWeekly"],"timezone":"Asia/Taipei","schedule":["after 12am and before 8am"],"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"6b33d9a7d466a1b18b00bb4be84d76ed1d23fea3","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.0.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-NBEWXir0YpMrcVF+F/PZR9uBPVolaTr8mofQsOlNTNxtXYhHqU7mUJyWia14m475i5qiWdbCsQfACn7GZugoCw==","shasum":"5ee3b01d73e4486b7dfbbe27e3d749a10eafced0","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.0.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.0.0.tgz_1503232291506_0.9969473145902157"},"directories":{}},"1.1.0":{"name":"renovate-config-ikatyang","version":"1.1.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks",":maintainLockFilesDisabled"],"timezone":"Asia/Taipei","schedule":["before 8am"],"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"369160195cb5b7b0fb89ef1f554d5bbbebad8c6f","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.1.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-8qKLnrqNZP+rmpcb8ddKy04mXlTUW2hrHmevT47830MfRgb0qZGLdcuKL5LG13a2WWGzzTZYsXaOqbHTLNQN6w==","shasum":"31dcfafa501e3f6b5c25349177507e7e9b5d9460","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.1.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.1.0.tgz_1503277413013_0.7997763243038207"},"directories":{}},"1.2.0":{"name":"renovate-config-ikatyang","version":"1.2.0","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks"],"timezone":"Asia/Taipei","schedule":["before 8am"],"lockFileMaintenance":{"enabled":true,"automerge":true,"schedule":"before 8am on Mondays"},"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"610de097e8b81da80c5655aada79378f362858e7","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.2.0","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-rBHBcgjziMslq8XB5rcA/mwN0YtXMpsvxBBSV4XuifkrbPD7LNTuehsU05wlgqqwecVzTSCtsNfKBES2qf3dVg==","shasum":"28351b9aaed9bd73f6355a93843c6823535bb1e4","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.2.0.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.2.0.tgz_1503317838934_0.6510782628320158"},"directories":{}},"1.2.1":{"name":"renovate-config-ikatyang","version":"1.2.1","description":"renovate config for ikatyang","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"license":"MIT","scripts":{"release":"standard-version"},"devDependencies":{"standard-version":"4.2.0"},"files":[],"renovate-config":{"default":{"extends":[":renovatePrefix",":semanticPrefixFixDepsChoreOthers",":automergeRequireAllStatusChecks"],"timezone":"Asia/Taipei","schedule":["before 8am"],"lockFileMaintenance":{"enabled":true,"automerge":true,"schedule":"before 8am on Monday"},"semanticCommits":true,"separateMajorMinor":true,"separateMinorPatch":false,"ignoreUnstable":true,"respectLatest":true,"rebaseStalePrs":true,"prCreation":"immediate","automerge":"minor","automergeType":"pr","labels":["dependencies"]},"library":{"extends":["ikatyang:default",":pinOnlyDevDependencies"]}},"gitHead":"7406990bfb5e98e6ff127d0b2f365e6d30bad25e","bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"_id":"renovate-config-ikatyang@1.2.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"ikatyang","email":"ikatyang@gmail.com"},"dist":{"integrity":"sha512-UpgA0hwHMNS7nqjuhNVAUk5ueYMgvMeawm56VkXiJTp0ZhaGW41x+XK/w7qObmyD/pRW3h7qk3w1CooHti29Sw==","shasum":"4c6f15f94980838b8a6f90e8c134d1837cc52845","tarball":"https://registry.npmjs.org/renovate-config-ikatyang/-/renovate-config-ikatyang-1.2.1.tgz"},"maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/renovate-config-ikatyang-1.2.1.tgz_1503359610886_0.8635549147147685"},"directories":{}}},"readme":"# renovate-config-ikatyang\n\n[![npm](https://img.shields.io/npm/v/renovate-config-ikatyang.svg)](https://www.npmjs.com/package/renovate-config-ikatyang)\n[![build](https://img.shields.io/travis/ikatyang/renovate-config-ikatyang/master.svg)](https://travis-ci.org/ikatyang/renovate-config-ikatyang/builds)\n\n[renovate](https://renovatebot.com/) config for ikatyang\n\n[Changelog](https://github.com/ikatyang/renovate-config-ikatyang/blob/master/CHANGELOG.md)\n\n## Usage\n\n(renovate.json)\n\n```json\n{\n  \"extends\": \"ikatyang\"\n}\n```\n\n## License\n\nMIT © [Ika](https://github.com/ikatyang)\n","maintainers":[{"name":"ikatyang","email":"ikatyang@gmail.com"}],"time":{"modified":"2017-08-21T23:53:31.002Z","created":"2017-08-20T12:31:31.602Z","1.0.0":"2017-08-20T12:31:31.602Z","1.1.0":"2017-08-21T01:03:33.203Z","1.2.0":"2017-08-21T12:17:20.208Z","1.2.1":"2017-08-21T23:53:31.002Z"},"homepage":"https://github.com/ikatyang/renovate-config-ikatyang#readme","keywords":["renovate","renovate-config"],"repository":{"type":"git","url":"git+https://github.com/ikatyang/renovate-config-ikatyang.git"},"author":{"name":"Ika","email":"ikatyang@gmail.com","url":"https://github.com/ikatyang"},"bugs":{"url":"https://github.com/ikatyang/renovate-config-ikatyang/issues"},"license":"MIT","readmeFilename":"README.md","_attachments":{}}
diff --git a/lib/config/presets/__snapshots__/index.spec.ts.snap b/lib/config/presets/__snapshots__/index.spec.ts.snap
index 22a81053c4bd06e95b5a5b23cee014e1acfa1d39..526fe229dcc14b6ad2a5e89dc8f25ca34ff41b83 100644
--- a/lib/config/presets/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/__snapshots__/index.spec.ts.snap
@@ -407,7 +407,6 @@ Object {
   "separateMajorMinor": true,
   "separateMinorPatch": false,
   "timezone": "Asia/Taipei",
-  "unpublishSafe": false,
 }
 `;
 
diff --git a/lib/config/presets/index.ts b/lib/config/presets/index.ts
index 6c5641b16e8f517a0dfcc4fde42d11d83ce8cff1..d48fb6a0e7442f31a6c3fd1cdac80807bc9c80fc 100644
--- a/lib/config/presets/index.ts
+++ b/lib/config/presets/index.ts
@@ -97,6 +97,7 @@ export function parsePreset(input: string): ParsedPreset {
     'group',
     'helpers',
     'monorepo',
+    'npm',
     'packages',
     'preview',
     'schedule',
diff --git a/lib/config/presets/internal/default.ts b/lib/config/presets/internal/default.ts
index 4af637459777d2dc5106bc04ef90157cb70bed08..bb3d8693b48b7c89725393f3a923815c027e27fc 100644
--- a/lib/config/presets/internal/default.ts
+++ b/lib/config/presets/internal/default.ts
@@ -210,16 +210,6 @@ export const presets: Record<string, Preset> = {
       'Rebase existing PRs any time the base branch has been updated',
     rebaseWhen: 'behind-base-branch',
   },
-  unpublishSafe: {
-    description:
-      'Set a status check to warn when upgrades <  24 hours old might get unpublished',
-    unpublishSafe: true,
-  },
-  unpublishSafeDisabled: {
-    description:
-      "Create branches/PRs for dependency upgrades as soon as they're available",
-    unpublishSafe: false,
-  },
   prImmediately: {
     description: 'Raise PRs immediately (after branch is created)',
     prCreation: 'immediate',
diff --git a/lib/config/presets/internal/index.ts b/lib/config/presets/internal/index.ts
index e4c7e06594f978aa3184d93f86f4764b694cdfc3..c5128728b20fe22bd24f2c6b824d825187ef9a10 100644
--- a/lib/config/presets/internal/index.ts
+++ b/lib/config/presets/internal/index.ts
@@ -5,6 +5,7 @@ import * as dockerPreset from './docker';
 import * as groupPreset from './group';
 import * as helpersPreset from './helpers';
 import * as monorepoPreset from './monorepo';
+import * as npm from './npm';
 import * as packagesPreset from './packages';
 import * as previewPreset from './preview';
 import * as schedulePreset from './schedule';
@@ -17,6 +18,7 @@ export const groups: Record<string, Record<string, Preset>> = {
   group: groupPreset.presets,
   helpers: helpersPreset.presets,
   monorepo: monorepoPreset.presets,
+  npm: npm.presets,
   packages: packagesPreset.presets,
   preview: previewPreset.presets,
   schedule: schedulePreset.presets,
diff --git a/lib/config/presets/internal/npm.ts b/lib/config/presets/internal/npm.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4c26622c3819a93fabc376de3f999aa6bbbfa8d0
--- /dev/null
+++ b/lib/config/presets/internal/npm.ts
@@ -0,0 +1,11 @@
+import { Preset } from '../common';
+
+export const presets: Record<string, Preset> = {
+  unpublishSafe: {
+    description:
+      'Set a status check pending for 3 days from release timestamp to guard against npm unpublishing',
+    npm: {
+      stabilityDays: 3,
+    },
+  },
+};
diff --git a/lib/datasource/common.ts b/lib/datasource/common.ts
index b700022afb40568b152645cc40081bf5aaead8d8..bd89e77d591c7e6fbfb83e5861e0d2e92cf24bd2 100644
--- a/lib/datasource/common.ts
+++ b/lib/datasource/common.ts
@@ -38,7 +38,6 @@ export function isGetPkgReleasesConfig(
 }
 
 export interface Release {
-  canBeUnpublished?: boolean;
   changelogUrl?: string;
   checksumUrl?: string;
   downloadUrl?: string;
diff --git a/lib/datasource/npm/__snapshots__/index.spec.ts.snap b/lib/datasource/npm/__snapshots__/index.spec.ts.snap
index 33bc541ee000198f2cc8871ae3760a6218f2c1fd..2c25d02a445ea843cbd5aeb4ee532da746a4af22 100644
--- a/lib/datasource/npm/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/npm/__snapshots__/index.spec.ts.snap
@@ -6,12 +6,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -31,12 +29,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -56,12 +52,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -81,7 +75,6 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
@@ -104,7 +97,6 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
@@ -123,7 +115,6 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
@@ -142,12 +133,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -173,12 +162,10 @@ Marking the latest version of an npm package as deprecated results in the entire
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "isDeprecated": true,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
@@ -206,12 +193,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -231,12 +216,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -256,12 +239,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -281,12 +262,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
@@ -306,12 +285,10 @@ Object {
   "name": "foobar",
   "releases": Array [
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "canBeUnpublished": false,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
diff --git a/lib/datasource/npm/get.ts b/lib/datasource/npm/get.ts
index abffffa6ba985ad63529d77841cd9eee7f2f0f3e..51c54de260781d4e7a1f2c95ec31485e0a23c434 100644
--- a/lib/datasource/npm/get.ts
+++ b/lib/datasource/npm/get.ts
@@ -2,7 +2,6 @@ import { OutgoingHttpHeaders } from 'http';
 import url from 'url';
 import is from '@sindresorhus/is';
 import delay from 'delay';
-import { DateTime } from 'luxon';
 import registryAuthToken from 'registry-auth-token';
 import getRegistryUrl from 'registry-auth-token/registry-url';
 import { logger } from '../../logger';
@@ -29,7 +28,6 @@ export function resetCache(): void {
 }
 
 export interface NpmRelease extends Release {
-  canBeUnpublished?: boolean;
   gitRef?: string;
 }
 export interface NpmDependency extends ReleaseResult {
@@ -217,9 +215,6 @@ export async function getDependency(
       };
       if (res.time?.[version]) {
         release.releaseTimestamp = res.time[version];
-        const relDate = DateTime.fromISO(release.releaseTimestamp);
-        release.canBeUnpublished =
-          relDate.isValid && DateTime.local().diff(relDate, 'days').days < 1;
       }
       if (res.versions[version].deprecated) {
         release.isDeprecated = true;
diff --git a/lib/datasource/npm/index.spec.ts b/lib/datasource/npm/index.spec.ts
index df2d5f6016b11f9c914263739edab1731faa1ad8..71653d4a313ff03ede97710ee61d08846af99806 100644
--- a/lib/datasource/npm/index.spec.ts
+++ b/lib/datasource/npm/index.spec.ts
@@ -1,4 +1,3 @@
-import { DateTime } from 'luxon';
 import mockDate from 'mockdate';
 import nock from 'nock';
 import _registryAuthToken from 'registry-auth-token';
@@ -14,15 +13,6 @@ jest.mock('delay');
 const registryAuthToken: jest.Mock<_registryAuthToken.NpmCredentials> = _registryAuthToken as never;
 let npmResponse: any;
 
-function getRelease(
-  dependency: { releases: { version: string; canBeUnpublished?: boolean }[] },
-  version: string
-) {
-  return dependency.releases.find(
-    (release: { version: string }) => release.version === version
-  );
-}
-
 describe(getName(__filename), () => {
   delete process.env.NPM_TOKEN;
   beforeEach(() => {
@@ -73,8 +63,6 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
     const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
-    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
-    expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(false);
   });
   it('should parse repo url', async () => {
     const pkg = {
@@ -169,16 +157,6 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
     const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
-    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
-    expect(getRelease(res, '0.0.2').canBeUnpublished).toBeUndefined();
-  });
-  it('should return canBeUnpublished=true', async () => {
-    mockDate.set('2020-11-03T05:10:17.496+01:00');
-    npmResponse.time['0.0.2'] = DateTime.local().minus({ hours: 6 }).toISO();
-    nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await getPkgReleases({ datasource, depName: 'foobar' });
-    expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
-    expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(true);
   });
   it('should return null if lookup fails 401', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(401);
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index d2ef81e49890d8e4d4ff8acaaca6f90aeb5185a3..fd6d88eb208250d124e93b401bc82801f6d010ba 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -16,7 +16,6 @@ import * as _commit from './commit';
 import * as _getUpdated from './get-updated';
 import * as _reuse from './reuse';
 import * as _schedule from './schedule';
-import * as _statusChecks from './status-checks';
 import * as branchWorker from '.';
 
 jest.mock('./get-updated');
@@ -24,7 +23,6 @@ jest.mock('./schedule');
 jest.mock('./check-existing');
 jest.mock('./reuse');
 jest.mock('../../manager/npm/post-update');
-jest.mock('./status-checks');
 jest.mock('./automerge');
 jest.mock('./commit');
 jest.mock('../pr');
@@ -37,7 +35,6 @@ const schedule = mocked(_schedule);
 const checkExisting = mocked(_checkExisting);
 const reuse = mocked(_reuse);
 const npmPostExtract = mocked(_npmPostExtract);
-const statusChecks = mocked(_statusChecks);
 const automerge = mocked(_automerge);
 const commit = mocked(_commit);
 const prWorker = mocked(_prWorker);
@@ -83,12 +80,20 @@ describe('workers/branch', () => {
       const res = await branchWorker.processBranch(config);
       expect(res).toEqual(ProcessBranchResult.NotScheduled);
     });
-    it('skips branch if not unpublishSafe + pending', async () => {
+    it('skips branch for fresh release with stabilityDays', async () => {
       schedule.isScheduledNow.mockReturnValueOnce(true);
-      config.unpublishSafe = true;
-      config.canBeUnpublished = true;
       config.prCreation = 'not-pending';
-      git.branchExists.mockReturnValueOnce(true);
+      config.upgrades = [
+        {
+          releaseTimestamp: new Date('2019-01-01').getTime(),
+          stabilityDays: 1,
+        },
+        {
+          releaseTimestamp: new Date().getTime(),
+          stabilityDays: 1,
+        },
+      ] as never;
+      git.branchExists.mockReturnValueOnce(false);
       const res = await branchWorker.processBranch(config);
       expect(res).toEqual(ProcessBranchResult.Pending);
     });
@@ -270,7 +275,6 @@ describe('workers/branch', () => {
       commit.commitFilesToBranch.mockResolvedValueOnce(null);
       automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged');
       await branchWorker.processBranch(config);
-      expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1);
       expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1);
       expect(prWorker.ensurePr).toHaveBeenCalledTimes(0);
     });
@@ -289,7 +293,6 @@ describe('workers/branch', () => {
         ...config,
         requiredStatusChecks: null,
       });
-      expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1);
       expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1);
       expect(prWorker.ensurePr).toHaveBeenCalledTimes(0);
     });
@@ -306,7 +309,6 @@ describe('workers/branch', () => {
       commit.commitFilesToBranch.mockResolvedValueOnce(null);
       automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged');
       await branchWorker.processBranch({ ...config, dryRun: true });
-      expect(statusChecks.setUnpublishable).toHaveBeenCalledTimes(1);
       expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1);
       expect(prWorker.ensurePr).toHaveBeenCalledTimes(0);
     });
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index f1c66d7c1801abdc0b4a3dc1e5ea64c2d3b57d22..8650a2d5854a79fc150bce2a41bbdec4b2e4ecbf 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -37,7 +37,7 @@ import { commitFilesToBranch } from './commit';
 import { getUpdatedPackageFiles } from './get-updated';
 import { shouldReuseExistingBranch } from './reuse';
 import { isScheduledNow } from './schedule';
-import { setStability, setUnpublishable } from './status-checks';
+import { setStability } from './status-checks';
 
 function rebaseCheck(config: RenovateConfig, branchPr: Pr): boolean {
   const titleRebase = branchPr.title?.startsWith('rebase!');
@@ -230,19 +230,6 @@ export async function processBranch(
       );
     }
 
-    if (
-      config.updateType !== 'lockFileMaintenance' &&
-      config.unpublishSafe &&
-      config.canBeUnpublished &&
-      (config.prCreation === 'not-pending' ||
-        /* istanbul ignore next */ config.prCreation === 'status-success')
-    ) {
-      logger.debug(
-        'Skipping branch creation due to unpublishSafe + status checks'
-      );
-      return ProcessBranchResult.Pending;
-    }
-
     if (
       config.upgrades.some(
         (upgrade) => upgrade.stabilityDays && upgrade.releaseTimestamp
@@ -494,7 +481,6 @@ export async function processBranch(
     }
     // Set branch statuses
     await setStability(config);
-    await setUnpublishable(config);
 
     // break if we pushed a new commit because status check are pretty sure pending but maybe not reported yet
     if (
diff --git a/lib/workers/branch/status-checks.spec.ts b/lib/workers/branch/status-checks.spec.ts
index bd800cb365277ddf6908d27ba8029660c0c70d11..ed9f3b31915e967e299d7ff98597a51d23843e81 100644
--- a/lib/workers/branch/status-checks.spec.ts
+++ b/lib/workers/branch/status-checks.spec.ts
@@ -1,11 +1,6 @@
 import { defaultConfig, platform } from '../../../test/util';
 import { BranchStatus } from '../../types';
-import {
-  StabilityConfig,
-  UnpublishableConfig,
-  setStability,
-  setUnpublishable,
-} from './status-checks';
+import { StabilityConfig, setStability } from './status-checks';
 
 describe('workers/branch/status-checks', () => {
   describe('setStability', () => {
@@ -35,40 +30,10 @@ describe('workers/branch/status-checks', () => {
       expect(platform.getBranchStatusCheck).toHaveBeenCalledTimes(1);
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
     });
-  });
-  describe('setUnpublishable', () => {
-    let config: UnpublishableConfig;
-    beforeEach(() => {
-      config = {
-        ...defaultConfig,
-        branchName: 'renovate/some-branch',
-      };
-    });
-    afterEach(() => {
-      jest.resetAllMocks();
-    });
-    it('returns if not configured', async () => {
-      await setUnpublishable(config);
-      expect(platform.getBranchStatusCheck).toHaveBeenCalledTimes(0);
-    });
-    it('defaults to canBeUnpublished', async () => {
-      config.unpublishSafe = true;
-      await setUnpublishable(config);
-      expect(platform.getBranchStatusCheck).toHaveBeenCalledTimes(1);
-      expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
-    });
-    it('finds canBeUnpublished false and sets status', async () => {
-      config.canBeUnpublished = true;
-      config.unpublishSafe = true;
-      await setUnpublishable(config);
-      expect(platform.getBranchStatusCheck).toHaveBeenCalledTimes(1);
-      expect(platform.setBranchStatus).toHaveBeenCalledTimes(1);
-    });
-    it('finds canBeUnpublished false and skips status', async () => {
-      config.unpublishSafe = true;
-      config.canBeUnpublished = false;
+    it('skips status if already set', async () => {
+      config.stabilityStatus = BranchStatus.green;
       platform.getBranchStatusCheck.mockResolvedValueOnce(BranchStatus.green);
-      await setUnpublishable(config);
+      await setStability(config);
       expect(platform.getBranchStatusCheck).toHaveBeenCalledTimes(1);
       expect(platform.setBranchStatus).toHaveBeenCalledTimes(0);
     });
diff --git a/lib/workers/branch/status-checks.ts b/lib/workers/branch/status-checks.ts
index f86062b5a60b15225c910c6cd23898db0b495736..eedc10c9125a98d4a64890a697f25a7e9877f2d7 100644
--- a/lib/workers/branch/status-checks.ts
+++ b/lib/workers/branch/status-checks.ts
@@ -14,7 +14,6 @@ async function setStatusCheck(
     branchName,
     context
   );
-  // Check if state needs setting
   if (existingState === state) {
     logger.debug(`Status check ${context} is already up-to-date`);
   } else {
@@ -51,32 +50,3 @@ export async function setStability(config: StabilityConfig): Promise<void> {
     config.productLinks.documentation
   );
 }
-
-export type UnpublishableConfig = RenovateConfig & {
-  unpublishSafe?: boolean;
-  canBeUnpublished?: boolean;
-  branchName: string;
-};
-
-export async function setUnpublishable(
-  config: UnpublishableConfig
-): Promise<void> {
-  if (!config.unpublishSafe) {
-    return;
-  }
-  const context = `renovate/unpublish-safe`;
-  // Set canBeUnpublished status check
-  const state = config.canBeUnpublished
-    ? BranchStatus.yellow
-    : BranchStatus.green;
-  const description = config.canBeUnpublished
-    ? 'Packages < 24 hours old can be unpublished'
-    : 'Packages cannot be unpublished';
-  await setStatusCheck(
-    config.branchName,
-    context,
-    description,
-    state,
-    config.productLinks.docs
-  );
-}
diff --git a/lib/workers/common.ts b/lib/workers/common.ts
index 8da5952cd2d90724aad5cd105ae6297a7287bbc2..bc378100beb4727f5fc19d8bd7144a500bd5be22 100644
--- a/lib/workers/common.ts
+++ b/lib/workers/common.ts
@@ -104,7 +104,6 @@ export interface BranchConfig
   automergeComment?: string;
   automergeType?: string;
   baseBranch?: string;
-  canBeUnpublished?: boolean;
   errors?: ValidationMessage[];
   hasTypes?: boolean;
   dependencyDashboardChecks?: Record<string, string>;
diff --git a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
index 62ea2170b9865cc6b1b8cd8bf1dbee0c39fc20a3..72b8136a6759e2b0e41d8df09a19598ef72ec52a 100644
--- a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
+++ b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
@@ -10,7 +10,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -26,7 +25,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() disables major release separation (minor) 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -49,7 +47,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.9.4",
     "isRange": true,
     "isSingleVersion": true,
@@ -62,7 +59,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.9.4",
     "isRange": true,
     "isSingleVersion": true,
@@ -214,7 +210,6 @@ Object {
   "sourceUrl": "https://github.com/kriskowal/q",
   "updates": Array [
     Object {
-      "canBeUnpublished": false,
       "fromVersion": "0.9.99",
       "isSingleVersion": true,
       "newMajor": 1,
@@ -245,7 +240,6 @@ Marking the latest version of an npm package as deprecated results in the entire
   "sourceUrl": "https://github.com/kriskowal/q",
   "updates": Array [
     Object {
-      "canBeUnpublished": false,
       "fromVersion": "1.3.0",
       "isSingleVersion": true,
       "newMajor": 1,
@@ -270,7 +264,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -293,7 +286,6 @@ Object {
   "sourceUrl": "https://github.com/kriskowal/q",
   "updates": Array [
     Object {
-      "canBeUnpublished": false,
       "fromVersion": "1.3.0",
       "isSingleVersion": true,
       "newMajor": 1,
@@ -330,7 +322,6 @@ exports[`workers/repository/process/lookup .lookupUpdates() rejects reverse orde
 exports[`workers/repository/process/lookup .lookupUpdates() replaces major complex ranged versions if configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -347,7 +338,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() replaces minor complex ranged versions if configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -364,7 +354,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() replaces non-range in-range updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -380,7 +369,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns additional update if grouping but separateMinorPatch=true 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -391,7 +379,6 @@ Array [
     "updateType": "patch",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -402,7 +389,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -425,7 +411,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -437,7 +422,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -459,7 +443,6 @@ Object {
   "sourceUrl": "https://github.com/kriskowal/q",
   "updates": Array [
     Object {
-      "canBeUnpublished": false,
       "fromVersion": "1.3.0",
       "isSingleVersion": true,
       "newMajor": 1,
@@ -477,7 +460,6 @@ Object {
 exports[`workers/repository/process/lookup .lookupUpdates() returns minor update if automerging both patch and minor 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -488,7 +470,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -504,7 +485,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns minor update if separate patches not configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -515,7 +495,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -531,7 +510,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns multiple updates if grouping but separateMajorMinor=true 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -542,7 +520,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -558,7 +535,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns one update if grouping and separateMajorMinor=false 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -574,7 +550,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns only one update if automerging 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -597,7 +572,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -613,7 +587,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns patch minor and major 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.8.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -624,7 +597,6 @@ Array [
     "updateType": "patch",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.8.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -635,7 +607,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.8.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -651,7 +622,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns patch update if automerging patch 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -662,7 +632,6 @@ Array [
     "updateType": "patch",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -678,7 +647,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() returns patch update if separateMinorPatch 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -689,7 +657,6 @@ Array [
     "updateType": "patch",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -714,7 +681,6 @@ Array [
     "updateType": "rollback",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.99",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -744,7 +710,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() should allow unstable versions if the current version is unstable 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "3.1.0-dev.20180731",
     "isSingleVersion": true,
     "newMajor": 3,
@@ -760,7 +725,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() should allow unstable versions if the ignoreUnstable=false 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.5.16",
     "isSingleVersion": true,
     "newMajor": 2,
@@ -788,7 +752,6 @@ Object {
 exports[`workers/repository/process/lookup .lookupUpdates() should follow dist-tag even if newer version exists 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "3.0.1-insiders.20180713",
     "isSingleVersion": true,
     "newMajor": 3,
@@ -818,7 +781,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() should jump unstable versions if followTag 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "3.0.0-insiders.20180706",
     "isSingleVersion": true,
     "newMajor": 3,
@@ -834,7 +796,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() should not jump unstable versions 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "3.0.1-insiders.20180726",
     "isSingleVersion": true,
     "newMajor": 3,
@@ -864,7 +825,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() should treat zero zero caret ranges as pinned 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.0.34",
     "isRange": true,
     "isSingleVersion": false,
@@ -978,7 +938,6 @@ Object {
 exports[`workers/repository/process/lookup .lookupUpdates() supports > latest versions if configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.4.1",
     "isSingleVersion": true,
     "newMajor": 2,
@@ -994,7 +953,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports complex major hyphen ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1011,7 +969,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports complex major ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1027,7 +984,6 @@ Array [
 
 exports[`workers/repository/process/lookup .lookupUpdates() supports complex ranges 1`] = `
 Object {
-  "canBeUnpublished": false,
   "fromVersion": "0.8.12",
   "isRange": true,
   "isSingleVersion": false,
@@ -1043,7 +999,6 @@ Object {
 exports[`workers/repository/process/lookup .lookupUpdates() supports complex tilde ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1060,7 +1015,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports in-range caret updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isBump": true,
     "isRange": true,
@@ -1078,7 +1032,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports in-range gte updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isBump": true,
     "isRange": true,
@@ -1096,7 +1049,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports in-range tilde patch updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isBump": true,
     "isRange": true,
@@ -1109,7 +1061,6 @@ Array [
     "updateType": "patch",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1126,7 +1077,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports in-range tilde updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isBump": true,
     "isRange": true,
@@ -1139,7 +1089,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1156,7 +1105,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports lock file updates mixed with regular updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "displayFrom": "0.4.0",
     "displayTo": "0.4.4",
     "fromVersion": "0.4.0",
@@ -1171,7 +1119,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isRange": true,
     "isSingleVersion": false,
@@ -1183,7 +1130,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isRange": true,
     "isSingleVersion": false,
@@ -1200,7 +1146,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() supports majorgte updates 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.0",
     "isBump": true,
     "isRange": true,
@@ -1225,7 +1170,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -1237,7 +1181,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1260,7 +1203,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 0,
@@ -1272,7 +1214,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "0.4.4",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1288,7 +1229,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades .x complex minor ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1305,7 +1245,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades .x major ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isRange": true,
     "isSingleVersion": false,
@@ -1329,7 +1268,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1345,7 +1283,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades .x minor ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1362,7 +1299,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades equal minor ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.1",
     "isRange": true,
     "isSingleVersion": true,
@@ -1379,7 +1315,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades less than equal major ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.4.1",
     "isRange": true,
     "isSingleVersion": false,
@@ -1396,7 +1331,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades less than equal minor ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1413,7 +1347,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades less than equal ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1425,7 +1358,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1442,7 +1374,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades less than major ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isRange": true,
     "isSingleVersion": false,
@@ -1459,7 +1390,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades less than ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.1",
     "isRange": true,
     "isSingleVersion": false,
@@ -1471,7 +1401,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.1",
     "isRange": true,
     "isSingleVersion": false,
@@ -1488,7 +1417,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades major greater than less than ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isRange": true,
     "isSingleVersion": false,
@@ -1505,7 +1433,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades major less than equal ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1522,7 +1449,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades major less than ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isRange": true,
     "isSingleVersion": false,
@@ -1539,7 +1465,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades minor greater than less than equals ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.8.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1551,7 +1476,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.8.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1568,7 +1492,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades minor greater than less than ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1580,7 +1503,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1604,7 +1526,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "1.0.1",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1620,7 +1541,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades multiple caret ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1632,7 +1552,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1649,7 +1568,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades multiple tilde ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1661,7 +1579,6 @@ Array [
     "updateType": "minor",
   },
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.7.2",
     "isRange": true,
     "isSingleVersion": false,
@@ -1678,7 +1595,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades shorthand major ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "0.9.7",
     "isRange": true,
     "isSingleVersion": false,
@@ -1695,7 +1611,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades shorthand minor ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1719,7 +1634,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1735,7 +1649,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() upgrades tilde ranges without pinning 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1752,7 +1665,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() uses minimum version for vulnerabilityAlerts 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1775,7 +1687,6 @@ Array [
   },
   Object {
     "blockedByPin": true,
-    "canBeUnpublished": false,
     "fromVersion": "1.0.0",
     "isSingleVersion": true,
     "newMajor": 1,
@@ -1791,7 +1702,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() widens .x OR ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1808,7 +1718,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() widens major ranged versions if configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1825,7 +1734,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() widens minor ranged versions if configured 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "1.3.0",
     "isRange": true,
     "isSingleVersion": false,
@@ -1842,7 +1750,6 @@ Array [
 exports[`workers/repository/process/lookup .lookupUpdates() widens stanndalone major OR ranges 1`] = `
 Array [
   Object {
-    "canBeUnpublished": false,
     "fromVersion": "2.7.0",
     "isRange": true,
     "isSingleVersion": false,
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index b42602b5361a38ba5e9634df593f4134bc16e756..796ebc2a11e260d352e76188e89d9dcafb58580c 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -348,12 +348,8 @@ export async function lookupUpdates(
       // TODO: think more about whether to just Object.assign this
       const releaseFields: (keyof Pick<
         Release,
-        | 'releaseTimestamp'
-        | 'canBeUnpublished'
-        | 'downloadUrl'
-        | 'checksumUrl'
-        | 'newDigest'
-      >)[] = ['releaseTimestamp', 'canBeUnpublished', 'newDigest'];
+        'releaseTimestamp' | 'downloadUrl' | 'checksumUrl' | 'newDigest'
+      >)[] = ['releaseTimestamp', 'newDigest'];
       releaseFields.forEach((field) => {
         if (updateRelease[field] !== undefined) {
           update[field] = updateRelease[field] as never;
diff --git a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
index 67a2d9c2b934d50e4b51d7c1622e99a286a47c70..14b906d10e19ae67a80f3205311bf847b187387d 100644
--- a/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
+++ b/lib/workers/repository/updates/__snapshots__/generate.spec.ts.snap
@@ -11,7 +11,6 @@ Object {
   "automerge": false,
   "blockedByPin": false,
   "branchName": "some-branch",
-  "canBeUnpublished": false,
   "commitMessage": "",
   "constraints": Object {},
   "depName": "some-dep",
@@ -66,7 +65,6 @@ Object {
   "automerge": false,
   "blockedByPin": false,
   "branchName": "some-branch",
-  "canBeUnpublished": false,
   "commitBodyTable": true,
   "commitMessage": "
 
diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts
index c1d68a170062ec50f143e6dd4dca458037a66ffa..1430a6a1d7baf9b106a9cfecb6663ec16744ca9a 100644
--- a/lib/workers/repository/updates/generate.spec.ts
+++ b/lib/workers/repository/updates/generate.spec.ts
@@ -72,7 +72,6 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
           releaseTimestamp: '2017-02-07T20:01:41+00:00',
-          canBeUnpublished: false,
           automerge: true,
           constraints: {
             foo: '1.0.0',
@@ -92,7 +91,6 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
           releaseTimestamp: '2017-02-06T20:01:41+00:00',
-          canBeUnpublished: true,
           automerge: false,
           constraints: {
             foo: '1.0.0',
@@ -113,7 +111,6 @@ describe('workers/repository/updates/generate', () => {
             foo: 2,
           },
           releaseTimestamp: '2017-02-06T20:01:41+00:00',
-          canBeUnpublished: true,
           automerge: false,
         },
       ];
@@ -121,7 +118,6 @@ describe('workers/repository/updates/generate', () => {
       expect(res.foo).toBe(2);
       expect(res.groupName).toBeDefined();
       expect(res.releaseTimestamp).toEqual('2017-02-07T20:01:41+00:00');
-      expect(res.canBeUnpublished).toBe(true);
       expect(res.automerge).toBe(false);
       expect(res.constraints).toEqual({
         foo: '1.0.0',
diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts
index a65315ebf20155b8936cc9341c3c93037ba2a9f4..04ff5ffd94fb669d3044972adaf23ef827991455 100644
--- a/lib/workers/repository/updates/generate.ts
+++ b/lib/workers/repository/updates/generate.ts
@@ -298,9 +298,6 @@ export function generateBranchConfig(
   }
   // Now assign first upgrade's config as branch config
   config = { ...config, ...config.upgrades[0], releaseTimestamp }; // TODO: fixme
-  config.canBeUnpublished = config.upgrades.some(
-    (upgrade) => upgrade.canBeUnpublished
-  );
   config.reuseLockFiles = config.upgrades.every(
     (upgrade) => upgrade.updateType !== 'lockFileMaintenance'
   );