{
  "name": "PWA_SEFMO — Gemashield World OS",
  "short_name": "PWA_SEFMO",
  "description": "Forensic media scanning and sovereign compute hub by IMP Gernovamarket UG.",
  "start_url": "./index.html",
  "display": "standalone",
  "background_color": "#02060f",
  "theme_color": "#02060f",
  "orientation": "portrait",
  "icons": [
    { "src": "icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
    { "src": "icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" }
  ]
}
```

---

Файл 3: /opt/gemashield/public/sw.js

```javascript
const CACHE = 'pwa-sefmo-v1';
const ASSETS = ['./', './index.html', './manifest.json', './icon-192.png', './icon-512.png'];

self.addEventListener('install', e => {
  e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS)).then(() => self.skipWaiting()));
});

self.addEventListener('activate', e => {
  e.waitUntil(
    caches.keys().then(keys =>
      Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))
    ).then(() => self.clients.claim())
  );
});

self.addEventListener('fetch', e => {
  if (e.request.url.includes('/api/')) return; // never cache API
  e.respondWith(caches.match(e.request).then(c => c || fetch(e.request)));
});
