diff --git a/assets/js/src/pwa.js b/assets/js/src/pwa.js
index c3bdd7272c9ea162e317e4a6ffb962f0e757a097..5e1a43b085c58d0daa25c637bd1d2fea388be7e9 100644
--- a/assets/js/src/pwa.js
+++ b/assets/js/src/pwa.js
@@ -5,14 +5,14 @@
 
   if ('serviceWorker' in navigator) {
     window.addEventListener('load', function () {
-      navigator.serviceWorker.register('/sw.js').then(function (registration) {
+      navigator.serviceWorker.register('/sw.js').then(function (registration) { // eslint-disable-line compat/compat
         console.log('ServiceWorker registration successful with scope: ', registration.scope)
         registration.onupdatefound = function () {
           var installingWorker = registration.installing
           installingWorker.onstatechange = function () {
             switch (installingWorker.state) {
               case 'installed':
-                if (navigator.serviceWorker.controller) {
+                if (navigator.serviceWorker.controller) { // eslint-disable-line compat/compat
                   console.log('new update available')
                   location.reload(true)
                 }
diff --git a/build/postcss.config.js b/build/postcss.config.js
index cadd98d03b233de4e8e4a8470f9de9ba3fcd0c9a..721e467c6e384bb27676ec30375118adcf3d51ae 100644
--- a/build/postcss.config.js
+++ b/build/postcss.config.js
@@ -5,27 +5,6 @@ module.exports = (ctx) => ({
     sourcesContent: true
   },
   plugins: {
-    autoprefixer: {
-      browsers: [
-        //
-        // Official browser support policy:
-        // https://getbootstrap.com/docs/4.0/getting-started/browsers-devices/#supported-browsers
-        //
-        'Chrome >= 45', // Exact version number here is kinda arbitrary
-        'Firefox ESR',
-        // Note: Edge versions in Autoprefixer & Can I Use refer to the EdgeHTML rendering engine version,
-        // NOT the Edge app version shown in Edge's "About" screen.
-        // For example, at the time of writing, Edge 20 on an up-to-date system uses EdgeHTML 12.
-        // See also https://github.com/Fyrd/caniuse/issues/1928
-        'Edge >= 12',
-        'Explorer >= 10',
-        // Out of leniency, we prefix these 1 version further back than the official policy.
-        'iOS >= 9',
-        'Safari >= 9',
-        // The following remain NOT officially supported, but we're lenient and include their prefixes to avoid severely breaking in them.
-        'Android >= 4.4',
-        'Opera >= 30'
-      ]
-    }
+    autoprefixer: {}
   }
 })
diff --git a/docs/4.0/getting-started/build-tools.md b/docs/4.0/getting-started/build-tools.md
index c675fee89dbca14406ac9b190bf348e72fc68937..82b8586ec29ba5621c5403864ede6265bb09fd4b 100644
--- a/docs/4.0/getting-started/build-tools.md
+++ b/docs/4.0/getting-started/build-tools.md
@@ -36,7 +36,7 @@ Our [package.json]({{ site.repo }}/blob/v{{ site.current_version }}/package.json
 
 Bootstrap uses [Autoprefixer][autoprefixer] (included in our build process) to automatically add vendor prefixes to some CSS properties at build time. Doing so saves us time and code by allowing us to write key parts of our CSS a single time while eliminating the need for vendor mixins like those found in v3.
 
-We maintain the list of browsers supported through Autoprefixer in a separate file within our GitHub repository. See [/build/postcss.config.js]({{ site.repo }}/blob/v{{ site.current_version }}/build/postcss.config.js) for details.
+We maintain the list of browsers supported through Autoprefixer in a separate file within our GitHub repository. See [/package.json]({{ site.repo }}/blob/v{{ site.current_version }}/package.json) for details.
 
 ## Local documentation
 
diff --git a/js/.eslintrc.json b/js/.eslintrc.json
index cc4e58ebd119821e37fc3eb319e5d88b6cd8e539..7316e6f2250167f47c86bc71965385916c864c1d 100644
--- a/js/.eslintrc.json
+++ b/js/.eslintrc.json
@@ -7,6 +7,7 @@
     "jquery": true
   },
   "extends": "eslint:recommended",
+  "plugins": ["compat"],
   "parserOptions": {
     "ecmaVersion": 8,
     "sourceType": "module"
@@ -17,6 +18,7 @@
     "no-extra-parens": "error",
     "no-prototype-builtins": "error",
     "no-template-curly-in-string": "error",
+    "compat/compat": "error",
     "valid-jsdoc": "error",
 
     // Best Practices
diff --git a/package-lock.json b/package-lock.json
index 0f222abf69499c18b676cf17217b145f93a4e664..6514f3a13137607308b4b46650408748e8d05b5c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1071,6 +1071,12 @@
         "map-obj": "1.0.1"
       }
     },
+    "caniuse-db": {
+      "version": "1.0.30000671",
+      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000671.tgz",
+      "integrity": "sha1-nwcbvHuWmUY4zLr0eCnVihV3qO0=",
+      "dev": true
+    },
     "caniuse-lite": {
       "version": "1.0.30000732",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000732.tgz",
@@ -1771,6 +1777,30 @@
         }
       }
     },
+    "eslint-plugin-compat": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-1.0.4.tgz",
+      "integrity": "sha512-16yjDdjrivRQT7/Kov+3O6DMvfg8WYC1JKPAsvf/UNtdLBeMXVYATohAM4nOak1ynGP69mKUlOjw7nroUqY9Sg==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "browserslist": "2.1.4",
+        "caniuse-db": "1.0.30000671",
+        "requireindex": "1.1.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.4.tgz",
+          "integrity": "sha1-zFJq9KExK30uBWU+VtDIq3DA4FM=",
+          "dev": true,
+          "requires": {
+            "caniuse-lite": "1.0.30000730",
+            "electron-to-chromium": "1.3.21"
+          }
+        }
+      }
+    },
     "eslint-scope": {
       "version": "3.7.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
@@ -5501,6 +5531,12 @@
         "resolve-from": "1.0.1"
       }
     },
+    "requireindex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz",
+      "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=",
+      "dev": true
+    },
     "resolve": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
diff --git a/package.json b/package.json
index 6cced3006f3093fbb5951eda2b773a2c41d269a3..9bd1c6f39cd995ba910b8a33c5ee46103e9d6713 100644
--- a/package.json
+++ b/package.json
@@ -85,6 +85,7 @@
     "clean-css-cli": "^4.1.6",
     "cross-env": "^5.0.5",
     "eslint": "^4.2.0",
+    "eslint-plugin-compat": "^1.0.4",
     "grunt": "^1.0.1",
     "grunt-cli": "^1.2.0",
     "grunt-saucelabs": "^9.0.0",
@@ -121,6 +122,16 @@
     "scss/**/*.scss",
     "LICENSE"
   ],
+  "browserslist": [
+    "Chrome >= 45",
+    "Firefox ESR",
+    "Edge >= 12",
+    "Explorer >= 10",
+    "iOS >= 9",
+    "Safari >= 9",
+    "Android >= 4.4",
+    "Opera >= 30"
+  ],
   "jspm": {
     "registry": "npm",
     "main": "js/bootstrap",