// Gather every live number the dashboard shows and write dashboard/data.js. // // Two rules shape this file: // 1. NO SOURCE MAY BREAK THE RENDER. Each source is fetched inside its own // try; a failure keeps the *previous* value and marks it stale rather than // blanking the panel. A dashboard that goes half-empty when the wifi blips // is worse than one that says "3h old". // 2. The output is a .js file, not .json, because the page is loaded over // file:// where fetch() is blocked by CORS but