diff --git a/overrides/assets/javascripts/version_page.js b/overrides/assets/javascripts/version_page.js
index 825a57c..ecc57d1 100644
--- a/overrides/assets/javascripts/version_page.js
+++ b/overrides/assets/javascripts/version_page.js
@@ -23,272 +23,93 @@
 
 var actualversion;
 
+function detectCrVersion() {
+  if (!navigator?.userAgentData)
+    return Promise.resolve(
+        window.navigator.appVersion.match(/Chrome\/(.*?) /)?.[1]);
+
+  return navigator.userAgentData.getHighEntropyValues(['fullVersionList'])
+      .then(res => {
+        let brands = res?.fullVersionList ?? [];
+        for (const b of brands)
+          if (b?.brand == 'Chromium' || b?.brand == 'Google Chrome')
+            return b?.version;
+
+        return undefined;
+      });
+}
+
+function convert2OmahaOS(os) {
+  if (os == 'linux' || os == 'mac' || os == 'cros') return os;
+  if (os == 'win_7_or_less' || os == 'win_latest') return 'win64';
+  return undefined;
+}
+
+function prettifyOS(os) {
+  if (os == 'linux') return 'Linux';
+  if (os == 'mac') return 'Mac';
+  if (os == 'cros') return 'Chrome OS';
+  if (os == 'win_7_or_less' || os == 'win_latest') return 'Windows';
+  return undefined;
+}
+
 var app = {
   init: function() {
-    fetch('https://omahaproxy.appspot.com/all.json')
-        .then(res => res.json())
-        .then(chromeversions => {
-          var browser = BrowserDetect.browser, version = BrowserDetect.version,
-              version2, os3, os2 = System.OS(), os = BrowserDetect.OS;
-          if (navigator.appVersion.indexOf('OPR') != -1) browser = 'Opera';
-          if (browser == 'Chrome') {
-            version2 = window.navigator.appVersion.match(/Chrome\/(.*?) /)[1];
-            if (navigator.appVersion.indexOf('CrOS') != -1)
-              var os = 'Chrome OS', os2 = 'cros', os3 = 'Chrome OS';
-            else
-              var os3 = os2,
-                  os2 = str_replace(
-                      ['Windows', 'Mac', 'iPhone/iPod', 'Chrome OS', 'Linux'],
-                      ['win64', 'mac', 'ios', 'cros', 'linux'], os);
-            var matches = chromeversions.filter(function(val, index, array) {
-              return val.os === os2;
-            });
-            var actualchrome =
-                matches[0].versions.filter(function(val, index, array) {
-                  return val.channel === 'stable';
-                });
-            actualversion = actualchrome[0].version.split('.')[0];
-            if (version < actualversion) {
-              document.getElementById('updated').innerHTML =
-                  '¡Oh, no! Google Chrome ' +
-                  '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
-            } else if (version > actualversion) {
-              document.getElementById('updated').innerHTML =
-                  'No estás usando el canal estable de Chrome. Ve con cuidado ;-)';
-            } else if (version2 != actualchrome[0].version) {
-              document.getElementById('updated').innerHTML =
-                  'Oops, Google Chrome ' +
-                  '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
-            } else {
-              document.getElementById('updated').innerHTML =
-                  'Chrome está actualizado';
-            }
-          } else {
-            os3 = os2;
-            version2 = version;
+    let promises = [];
+    promises.push(fetch('https://omahaproxy.appspot.com/all.json')
+                      .then(res => res.json()));
+    promises.push(detectOS());
+    promises.push(detectCrVersion());
+
+    Promise.all(promises)
+        .then(responses => {
+          const [chromeVersions, os, version] = responses;
+          if (!version) {
+            document.getElementById('version').textContent =
+                'No hemos podido determinar tu versión.';
+            document.getElementById('updated').textContent =
+                'Es posible que no estés usando Chrome o que la página no funcione correctamente.';
+            return;
           }
+
+          let majorVersion = version?.split?.('.')?.[0];
+          let omahaOS = convert2OmahaOS(os);
+          let matches = chromeVersions.filter(function(val, index, array) {
+            return val.os === omahaOS;
+          });
+          var actualChrome =
+              matches?.[0]?.versions?.filter?.(function(val, index, array) {
+                return val.channel === 'stable';
+              });
+          actualVersion = actualChrome?.[0]?.version?.split?.('.')?.[0];
+          if (majorVersion < actualVersion) {
+            document.getElementById('updated').innerHTML =
+                '¡Oh, no! Google Chrome ' +
+                '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
+          } else if (majorVersion > actualVersion) {
+            document.getElementById('updated').innerHTML =
+                'No estás usando el canal estable de Chrome. Ve con cuidado ;-)';
+          } else if (version != actualChrome[0].version) {
+            document.getElementById('updated').innerHTML =
+                'Oops, Google Chrome ' +
+                '<a href=\'https://support.google.com/chrome/answer/95414\'>no está actualizado</a>.';
+          } else {
+            document.getElementById('updated').innerHTML =
+                'Chrome está actualizado';
+          }
+          let prettyOS = prettifyOS(os);
+          document.getElementById('version').textContent = 'Usas la versión ' +
+              version + ' de Chrome' + (prettyOS ? ' en ' + prettyOS : '');
+        })
+        .catch(err => {
           document.getElementById('version').textContent =
-              'Usas la versión ' + version2 + ' de ' + browser + ' en ' + os3;
+              'Ha ocurrido un error inesperado.';
+          document.getElementById('updated').textContent =
+              'Error: ' + err + '.';
         });
   }
-}
-
-// Function to detect navigator (informally browser)
-// Source:
-
-var BrowserDetect = {
-  init: function() {
-    this.browser = this.searchString(this.dataBrowser) || '?';
-    this.version = this.searchVersion(navigator.userAgent) ||
-        this.searchVersion(navigator.appVersion) || '?';
-    this.OS = this.searchString(this.dataOS) || '?';
-  },
-  searchString: function(data) {
-    for (var i = 0; i < data.length; i++) {
-      var dataString = data[i].string;
-      var dataProp = data[i].prop;
-      this.versionSearchString = data[i].versionSearch || data[i].identity;
-      if (dataString) {
-        if (dataString.indexOf(data[i].subString) != -1)
-          return data[i].identity;
-      } else if (dataProp)
-        return data[i].identity;
-    }
-  },
-  searchVersion: function(dataString) {
-    var index = dataString.indexOf(this.versionSearchString);
-    if (index == -1) return;
-    return parseFloat(
-        dataString.substring(index + this.versionSearchString.length + 1));
-  },
-  dataBrowser: [
-    {string: navigator.userAgent, subString: 'Chrome', identity: 'Chrome'}, {
-      string: navigator.userAgent,
-      subString: 'OmniWeb',
-      versionSearch: 'OmniWeb/',
-      identity: 'OmniWeb'
-    },
-    {
-      string: navigator.vendor,
-      subString: 'Apple',
-      identity: 'Safari',
-      versionSearch: 'Version'
-    },
-    {prop: window.opera, identity: 'Opera', versionSearch: 'Version'},
-    {string: navigator.vendor, subString: 'iCab', identity: 'iCab'},
-    {string: navigator.vendor, subString: 'KDE', identity: 'Konqueror'},
-    {string: navigator.userAgent, subString: 'Firefox', identity: 'Firefox'},
-    {string: navigator.vendor, subString: 'Camino', identity: 'Camino'}, {
-      // for newer Netscapes (6+)
-      string: navigator.userAgent,
-      subString: 'Netscape',
-      identity: 'Netscape'
-    },
-    {
-      string: navigator.userAgent,
-      subString: 'MSIE',
-      identity: 'Explorer',
-      versionSearch: 'MSIE'
-    },
-    {
-      string: navigator.userAgent,
-      subString: 'Gecko',
-      identity: 'Mozilla',
-      versionSearch: 'rv'
-    },
-    {
-      // for older Netscapes (4-)
-      string: navigator.userAgent,
-      subString: 'Mozilla',
-      identity: 'Netscape',
-      versionSearch: 'Mozilla'
-    }
-  ],
-  dataOS: [
-    {string: navigator.platform, subString: 'Win', identity: 'Windows'},
-    {string: navigator.platform, subString: 'Mac', identity: 'Mac'},
-    {string: navigator.userAgent, subString: 'iPhone', identity: 'iPhone/iPod'},
-    {string: navigator.platform, subString: 'Linux', identity: 'Linux'}
-  ]
-};
-
-function str_replace(search, replace, subject, count) {
-  // http://kevin.vanzonneveld.net
-  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  // +   improved by: Gabriel Paderni
-  // +   improved by: Philip Peterson
-  // +   improved by: Simon Willison (http://simonwillison.net)
-  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
-  // +   bugfixed by: Anton Ongson
-  // +      input by: Onno Marsman
-  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  // +    tweaked by: Onno Marsman
-  // +      input by: Brett Zamir (http://brett-zamir.me)
-  // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  // +   input by: Oleg Eremeev
-  // +   improved by: Brett Zamir (http://brett-zamir.me)
-  // +   bugfixed by: Oleg Eremeev
-  // %          note 1: The count parameter must be passed as a string in order
-  // %          note 1:  to find a global variable in which the result will be
-  // given
-  // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
-  // *     returns 1: 'Kevin.van.Zonneveld'
-  // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name},
-  // lars');
-  // *     returns 2: 'hemmo, mars'
-  var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0, f = [].concat(search),
-      r = [].concat(replace), s = subject,
-      ra = Object.prototype.toString.call(r) === '[object Array]',
-      sa = Object.prototype.toString.call(s) === '[object Array]';
-  s = [].concat(s);
-  if (count) {
-    this.window[count] = 0;
-  }
-
-  for (i = 0, sl = s.length; i < sl; i++) {
-    if (s[i] === '') {
-      continue;
-    }
-    for (j = 0, fl = f.length; j < fl; j++) {
-      temp = s[i] + '';
-      repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
-      s[i] = (temp).split(f[j]).join(repl);
-      if (count && s[i] !== temp) {
-        this.window[count] += (temp.length - s[i].length) / f[j].length;
-      }
-    }
-  }
-  return sa ? s : s[0];
-}
-
-/**
- * JavaScript Client Detection
- * (C) viazenetti GmbH (Christian Ludwig)
- */
-
-var System = {
-  OS: function() {
-    var unknown = '?';
-
-    // browser
-    var nVer = navigator.appVersion;
-    var nAgt = navigator.userAgent;
-    var browser = navigator.appName;
-    var version = '' + parseFloat(navigator.appVersion);
-    var majorVersion = parseInt(navigator.appVersion, 10);
-    var nameOffset, verOffset, ix;
-
-    // system
-    var os = unknown;
-    var clientStrings = [
-      {s: 'Windows 3.11', r: /Win16/},
-      {s: 'Windows 95', r: /(Windows 95|Win95|Windows_95)/},
-      {s: 'Windows ME', r: /(Win 9x 4.90|Windows ME)/},
-      {s: 'Windows 98', r: /(Windows 98|Win98)/},
-      {s: 'Windows CE', r: /Windows CE/},
-      {s: 'Windows 2000', r: /(Windows NT 5.0|Windows 2000)/},
-      {s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/},
-      {s: 'Windows Server 2003', r: /Windows NT 5.2/},
-      {s: 'Windows Vista', r: /Windows NT 6.0/},
-      {s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/},
-      {s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/},
-      {s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/},
-      {s: 'Windows NT 4.0', r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},
-      {s: 'Windows ME', r: /Windows ME/},
-      {s: 'Android', r: /Android/},
-      {s: 'Open BSD', r: /OpenBSD/},
-      {s: 'Sun OS', r: /SunOS/},
-      {s: 'Linux', r: /(Linux|X11)/},
-      {s: 'iOS', r: /(iPhone|iPad|iPod)/},
-      {s: 'Mac OS X', r: /Mac OS X/},
-      {s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},
-      {s: 'QNX', r: /QNX/},
-      {s: 'UNIX', r: /UNIX/},
-      {s: 'BeOS', r: /BeOS/},
-      {s: 'OS/2', r: /OS\/2/},
-      {
-        s: 'Search Bot',
-        r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/
-      }
-    ];
-    for (var id in clientStrings) {
-      var cs = clientStrings[id];
-      if (cs.r.test(nAgt)) {
-        os = cs.s;
-        break;
-      }
-    }
-
-    var osVersion = 'unknown';
-
-    if (/Windows/.test(os)) {
-      osVersion = /Windows (.*)/.exec(os)[1];
-      os = 'Windows';
-    }
-
-    switch (os) {
-      case 'Mac OS X':
-        osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
-        break;
-
-      case 'Android':
-        osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
-        break;
-
-      case 'iOS':
-        osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
-        osVersion =
-            osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
-        break;
-    }
-
-    var jscd = {os: os, osVersion: osVersion};
-
-    return (jscd.os + ' ' + jscd.osVersion);
-  }
 };
 
 window.addEventListener('load', _ => {
-  BrowserDetect.init();
   app.init();
 });
