diff --git a/bin/create-json-schema.js b/bin/create-json-schema.js
index c6c8ecb938126f93e2b30e0107b7154b8599c2b0..5657c021ad2f7a6a6c1b4097b63bfaea41ef73be 100644
--- a/bin/create-json-schema.js
+++ b/bin/create-json-schema.js
@@ -40,6 +40,9 @@ function createSingleConfig(option) {
   if (option.default !== undefined) {
     temp.default = option.default;
   }
+  if (option.additionalProperties !== undefined) {
+    temp.additionalProperties = option.additionalProperties;
+  }
   if (temp.type === 'object' && !option.freeChoice) {
     temp.$ref = '#';
   }
diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 61785615cb502e24f1b129bcde941e927a7a7824..8692ad6155aec7029c97dd68c0f28eb37ee08416 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -21,6 +21,22 @@ Also, be sure to check out Renovate's [shareable config presets](/config-presets
 
 If you have any questions about the below config options, or would like to get help/feedback about a config, please post it as an issue in [renovatebot/config-help](https://github.com/renovatebot/config-help) where it will be promptly answered.
 
+## aliases
+
+Package managers that support repo aliases can be configured here.
+
+Currently only helm is supported, which contains this default repository alias:
+
+```json
+{
+  "aliases": {
+    "stable": "https://kubernetes-charts.storage.googleapis.com/"
+  }
+}
+```
+
+Alias values must be properly formatted URIs.
+
 ## ansible
 
 Add configuration here if you want to enable or disable something in particular for Ansible files and override the default Docker settings.
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index ddb37f960a9281a5c781cbfd2d035bbace9fc625..b7268838480ca513c5943d5ab3887e1008705271 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -62,6 +62,7 @@ export interface RenovateStringOption extends RenovateOptionBase {
 
 export interface RenovateObjectOption extends RenovateOptionBase {
   default?: any;
+  additionalProperties?: {} | boolean;
   mergeable?: boolean;
   type: 'object';
 }
@@ -525,6 +526,16 @@ const options: RenovateOptions[] = [
     mergeable: true,
     cli: false,
   },
+  {
+    name: 'aliases',
+    description: 'Aliases for registries, package manager specific',
+    type: 'object',
+    default: {},
+    additionalProperties: {
+      type: 'string',
+      format: 'uri',
+    },
+  },
   {
     name: 'registryUrls',
     description:
@@ -1604,6 +1615,9 @@ const options: RenovateOptions[] = [
     stage: 'package',
     type: 'object',
     default: {
+      aliases: {
+        stable: 'https://kubernetes-charts.storage.googleapis.com/',
+      },
       commitMessageTopic: 'helm chart {{depName}}',
       fileMatch: ['(^|/)requirements.yaml$'],
     },
diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index 1eb6cc8476f040234eccff9e1dadcffc10dae5e6..71040809bb6ee4ae1a15a57dd1cf75994f0d7425 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -18,6 +18,7 @@ export interface ExtractConfig extends ManagerConfig {
   endpoint?: string;
   global?: any;
   gradle?: { timeout?: number };
+  aliases?: Record<string, string>;
   ignoreNpmrcFile?: boolean;
 
   skipInstalls?: boolean;
diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts
index 1cb380779e5c797c9c62d2d1abd68320668d2549..a9b51571723b9154f75b9c3a0c29400592704ca8 100644
--- a/lib/manager/helm-requirements/extract.ts
+++ b/lib/manager/helm-requirements/extract.ts
@@ -3,12 +3,13 @@ import upath from 'upath';
 import yaml from 'js-yaml';
 
 import { logger } from '../../logger';
-import { PackageFile, PackageDependency } from '../common';
+import { PackageFile, PackageDependency, ExtractConfig } from '../common';
 import { platform } from '../../platform';
 
 export async function extractPackageFile(
   content: string,
-  fileName: string
+  fileName: string,
+  config: ExtractConfig
 ): Promise<PackageFile> {
   try {
     const baseDir = upath.parse(fileName).dir;
@@ -50,6 +51,13 @@ export async function extractPackageFile(
     if (dep.repository) {
       res.registryUrls = [dep.repository];
       if (dep.repository.startsWith('@')) {
+        const repoWithAtRemoved = dep.repository.slice(1);
+        const alias = config.aliases[repoWithAtRemoved];
+        if (alias) {
+          res.registryUrls = [alias];
+          return res;
+        }
+
         res.skipReason = 'placeholder-url';
       } else {
         try {
diff --git a/renovate-schema.json b/renovate-schema.json
index 800492c0400de6364b07b20228a54ceb5ab0fc8f..d59a344cab120d6c981bc9c5d4e4aaa10d8e067e 100644
--- a/renovate-schema.json
+++ b/renovate-schema.json
@@ -290,6 +290,16 @@
       "default": {},
       "$ref": "#"
     },
+    "aliases": {
+      "description": "Aliases for registries, package manager specific",
+      "type": "object",
+      "default": {},
+      "additionalProperties": {
+        "type": "string",
+        "format": "uri"
+      },
+      "$ref": "#"
+    },
     "registryUrls": {
       "description": "List of URLs to try for dependency lookup. Package manager-specific",
       "type": "array",
@@ -1058,6 +1068,9 @@
       "description": "Configuration object for helm requirements.yaml files.",
       "type": "object",
       "default": {
+        "aliases": {
+          "stable": "https://kubernetes-charts.storage.googleapis.com/"
+        },
         "commitMessageTopic": "helm chart {{depName}}",
         "fileMatch": ["(^|/)requirements.yaml$"]
       },
diff --git a/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap b/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap
index d96cd95435b6a29ccaacbbeab09dfb91743e1300..07b0173fb45f58cb2999c5c9858e809e9f36feeb 100644
--- a/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap
+++ b/test/manager/helm-requirements/__snapshots__/extract.spec.ts.snap
@@ -22,6 +22,21 @@ Object {
 }
 `;
 
+exports[`lib/manager/helm/extract extractPackageFile() resolves aliased registry urls 1`] = `
+Object {
+  "datasource": "helm",
+  "deps": Array [
+    Object {
+      "currentValue": "0.9.0",
+      "depName": "redis",
+      "registryUrls": Array [
+        "https://my-registry.gcr.io/",
+      ],
+    },
+  ],
+}
+`;
+
 exports[`lib/manager/helm/extract extractPackageFile() skips invalid registry urls 1`] = `
 Object {
   "datasource": "helm",
diff --git a/test/manager/helm-requirements/extract.spec.ts b/test/manager/helm-requirements/extract.spec.ts
index 69fcf2dee32638ee823d2db8023b618153125351..df1ec9f0e9e88bfd68020d218574ce09887b6c1d 100644
--- a/test/manager/helm-requirements/extract.spec.ts
+++ b/test/manager/helm-requirements/extract.spec.ts
@@ -28,7 +28,11 @@ describe('lib/manager/helm/extract', () => {
           version: 0.8.1
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).not.toBeNull();
       expect(result).toMatchSnapshot();
       expect(result.deps.every(dep => dep.skipReason));
@@ -51,7 +55,11 @@ describe('lib/manager/helm/extract', () => {
           repository: https://kubernetes-charts.storage.googleapis.com/
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).not.toBeNull();
       expect(result).toMatchSnapshot();
     });
@@ -63,9 +71,37 @@ describe('lib/manager/helm/extract', () => {
       name: example
       `);
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile('', fileName);
+      const result = await extractPackageFile('', fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).toBeNull();
     });
+    it('resolves aliased registry urls', async () => {
+      platform.getFile.mockReturnValueOnce(`
+      apiVersion: v1
+      appVersion: "1.0"
+      description: A Helm chart for Kubernetes
+      name: example
+      version: 0.1.0
+      `);
+      const content = `
+      dependencies:
+        - name: redis
+          version: 0.9.0
+          repository: '@placeholder'
+      `;
+      const fileName = 'requirements.yaml';
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          placeholder: 'https://my-registry.gcr.io/',
+        },
+      });
+      expect(result).not.toBeNull();
+      expect(result).toMatchSnapshot();
+      expect(result.deps.every(dep => dep.skipReason));
+    });
     it("doesn't fail if Chart.yaml is invalid", async () => {
       platform.getFile.mockReturnValueOnce(`
       Invalid Chart.yaml content.
@@ -82,7 +118,11 @@ describe('lib/manager/helm/extract', () => {
           repository: https://kubernetes-charts.storage.googleapis.com/
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).toBeNull();
     });
     it('skips local dependencies', async () => {
@@ -103,7 +143,11 @@ describe('lib/manager/helm/extract', () => {
           repository: file:///some/local/path/
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).not.toBeNull();
       expect(result).toMatchSnapshot();
     });
@@ -119,7 +163,11 @@ describe('lib/manager/helm/extract', () => {
       hello: world
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).toBeNull();
     });
     it('returns null if requirements.yaml is invalid', async () => {
@@ -136,13 +184,21 @@ describe('lib/manager/helm/extract', () => {
       [
       `;
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).toBeNull();
     });
     it('returns null if Chart.yaml is empty', async () => {
       const content = '';
       const fileName = 'requirements.yaml';
-      const result = await extractPackageFile(content, fileName);
+      const result = await extractPackageFile(content, fileName, {
+        aliases: {
+          stable: 'https://kubernetes-charts.storage.googleapis.com/',
+        },
+      });
       expect(result).toBeNull();
     });
   });