{
  "name": "PingPong — Grid Trading",
  "short_name": "PingPong",
  "description": "Professional AI-powered grid trading bot for crypto",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#0a0e17",
  "theme_color": "#1652f0",
  "icons": [
    {"src": "/PNGP_Logo.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable"},
    {"src": "/PNGP_Logo.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable"}
  ],
  "shortcuts": [
    {"name": "Trade", "url": "/"},
    {"name": "AI Agent", "url": "/agent"},
    {"name": "PNGP Wallet", "url": "/pngp"}
  ]
}
EOF~
cat > /var/www/pingpong/sw.js << 'EOF'
const CACHE = 'pingpong-v1';
const ASSETS = ['/', '/agent', '/pngp', '/ico', '/PNGP_Logo.png'];
self.addEventListener('install', e => { e.waitUntil(caches.open(CACHE).then(c => c.addAll(ASSETS))); self.skipWaiting(); });
self.addEventListener('activate', e => { self.clients.claim(); });
self.addEventListener('fetch', e => { e.respondWith(fetch(e.request).then(res => { caches.open(CACHE).then(c => c.put(e.request, res.clone())); return res; }).catch(() => caches.match(e.request))); });
