// Service worker for Second Brain PWA
const CACHE_NAME = 'second-brain-v1';
// Cache static assets on install
self.addEventListener('install', (event) => {
caches.open(CACHE_NAME).then(cache => {
return cache.addAll([
'/',
'/static/style.css',
'/static/script.js',
'/static/manifest.json',
'/static/favicon.svg',
]);
});
self.skipWaiting();
});
// Activate and clean old caches
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then(keys =>
Promise.all(
keys.filter(k => k !== CACHE_NAME).map(k => caches.delete(k))
)
)
);
self.clients.claim();
});
// Network-first with cache fallback for API calls
self.addEventListener('fetch', (event) => {
if (event.request.url.includes('/api/')) {
event.respondWith(
fetch(event.request).catch(() => caches.match(event.request))
);
return;
}
event.respondWith(
caches.match(event.request).then(cached =>
cached || fetch(event.request).then(response => {
if (response.status === 200) {
const clone = response.clone();
caches.open(CACHE_NAME).then(cache => cache.put(event.request, clone));
}
return response;
}).catch(() => cached)
)
);
});