diff --git a/js/script.js b/js/script.js
index 080d5de..0daa399 100644
--- a/js/script.js
+++ b/js/script.js
@@ -182,35 +182,33 @@
   if (searchParams.has('concert'))
     forceConcert = searchParams.get('concert');
 
-  if (!searchParams.has('noServiceWorker')) {
-    if ('serviceWorker' in navigator) {
-      navigator.serviceWorker.register('/sw.js')
-          .then(reg => {
-            reg.addEventListener('updatefound', _ => {
-              showUpdateFooter();
-            });
-
-            var promises = [];
-            bookletNames.forEach(name => {
-              var p = fetch('concerts/' + name + '.json').then(res => res.json());
-              promises.push(p);
-            });
-
-            Promise.all(promises).then(booklets => {
-              showSection('wait-screen');
-              loadPreviousBookletsList(booklets);
-              checkBooklets(booklets);
-              interval = window.setInterval(_ => {
-                checkBooklets(booklets);
-              }, 15 * 1000);
-            });
-          })
-          .catch(err => {
-            showSection('cant-install');
-            console.error('The service worker failed to be registered.');
+  if ('serviceWorker' in navigator) {
+    navigator.serviceWorker.register('/sw.js')
+        .then(reg => {
+          reg.addEventListener('updatefound', _ => {
+            showUpdateFooter();
           });
-    } else {
-      showSection('no-service-worker');
-    }
+
+          var promises = [];
+          bookletNames.forEach(name => {
+            var p = fetch('concerts/' + name + '.json').then(res => res.json());
+            promises.push(p);
+          });
+
+          Promise.all(promises).then(booklets => {
+            showSection('wait-screen');
+            loadPreviousBookletsList(booklets);
+            checkBooklets(booklets);
+            interval = window.setInterval(_ => {
+              checkBooklets(booklets);
+            }, 15 * 1000);
+          });
+        })
+        .catch(err => {
+          showSection('cant-install');
+          console.error('The service worker failed to be registered.');
+        });
+  } else {
+    showSection('no-service-worker');
   }
 });
