Files
worldmonitor/public/offline.html
Elie Habib c353cf2070 Reduce egress costs, add PWA support, fix Polymarket and Railway relay
Egress optimization:
- Add s-maxage + stale-while-revalidate to all API endpoints for Vercel CDN caching
- Add vercel.json with immutable caching for hashed assets
- Add gzip compression to sidecar responses >1KB
- Add gzip to Railway RSS responses (4 paths previously uncompressed)
- Increase polling intervals: markets/crypto 60s→120s, ETF/macro/stablecoins 60s→180s
- Remove hardcoded Railway URL from theater-posture.js (now env-var only)

PWA / Service Worker:
- Add vite-plugin-pwa with autoUpdate strategy
- Cache map tiles (CacheFirst), fonts (StaleWhileRevalidate), static assets
- NetworkOnly for all /api/* routes (real-time data must be fresh)
- Manual SW registration (web only, skip Tauri)
- Add offline fallback page
- Replace manual manifest with plugin-generated manifest

Polymarket fix:
- Route dev proxy through production Vercel (bypasses JA3 blocking)
- Add 4th fallback tier: production URL as absolute fallback

Desktop/Sidecar:
- Dual-backend cache (_upstash-cache.js): Redis cloud + in-memory+file desktop
- Settings window OK/Cancel redesign
- Runtime config and secret injection improvements
2026-02-14 19:53:04 +04:00

27 lines
941 B
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WorldMonitor - Offline</title>
<style>
body { background: #0a0f0a; color: #e0e0e0; font-family: system-ui;
display: flex; align-items: center; justify-content: center;
min-height: 100vh; margin: 0; }
.c { text-align: center; padding: 2rem; }
h1 { font-size: 1.5rem; margin-bottom: 0.5rem; }
p { color: #888; font-size: 0.9rem; }
button { margin-top: 1rem; padding: 0.5rem 1.5rem; background: #1a3a1a;
color: #4ade80; border: 1px solid #2a5a2a; border-radius: 4px;
cursor: pointer; }
</style>
</head>
<body>
<div class="c">
<h1>You're Offline</h1>
<p>WorldMonitor requires an internet connection for real-time intelligence data.</p>
<button onclick="location.reload()">Retry</button>
</div>
</body>
</html>