From 37f417eb5b82beeecda7a6f9ce8ef3c1f11b26e6 Mon Sep 17 00:00:00 2001 From: kamaji Date: Sat, 7 Feb 2026 22:16:07 -0600 Subject: [PATCH] Fix SW scope to intercept page navigations for offline support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SW was served from /static/sw.js with default scope /static/, so it only intercepted static asset requests. Page navigations to /capture, /queue, /browser were not handled by the SW at all — Safari showed its native offline error. Fix: serve SW from /sw.js route with Service-Worker-Allowed: / header and register with scope: /. Now the SW intercepts all navigations and serves the offline fallback page when the network is unavailable. Also remove auth-protected page routes from precache (they would cache the login redirect). Pages are cached via network-first on visit instead. Co-Authored-By: Claude Opus 4.6 --- app/routes/views.py | 14 +++++++++++++- app/static/sw.js | 10 +++------- app/templates/base.html | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/routes/views.py b/app/routes/views.py index 41d3709..763ba56 100644 --- a/app/routes/views.py +++ b/app/routes/views.py @@ -1,7 +1,19 @@ -from flask import Blueprint, render_template, redirect, url_for, session, jsonify +from flask import Blueprint, render_template, redirect, url_for, session, jsonify, send_from_directory, current_app bp = Blueprint('views', __name__) + +@bp.route('/sw.js') +def service_worker(): + """Serve service worker from root scope.""" + response = send_from_directory( + current_app.static_folder, 'sw.js', + mimetype='application/javascript' + ) + response.headers['Service-Worker-Allowed'] = '/' + response.headers['Cache-Control'] = 'no-cache' + return response + @bp.route('/') def index(): """Root route - redirect to capture if logged in, otherwise show login.""" diff --git a/app/static/sw.js b/app/static/sw.js index ea22bdb..f475515 100644 --- a/app/static/sw.js +++ b/app/static/sw.js @@ -1,9 +1,9 @@ // NextSnap Service Worker // Provides offline-first caching for the app shell -const CACHE_VERSION = 'nextsnap-v21'; -const APP_SHELL_CACHE = 'nextsnap-shell-v17'; -const RUNTIME_CACHE = 'nextsnap-runtime-v17'; +const CACHE_VERSION = 'nextsnap-v22'; +const APP_SHELL_CACHE = 'nextsnap-shell-v18'; +const RUNTIME_CACHE = 'nextsnap-runtime-v18'; // Offline fallback page (served when network fails and no cached version exists) const OFFLINE_PAGE = ` @@ -26,10 +26,6 @@ button:active{opacity:0.8} // Assets to cache on install const APP_SHELL_ASSETS = [ - '/', - '/capture', - '/queue', - '/browser', '/static/css/style.css', '/static/js/app.js', '/static/js/auth.js', diff --git a/app/templates/base.html b/app/templates/base.html index 2b7f13d..1e3c911 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -65,7 +65,7 @@