add live status indicators next to service entries

This commit is contained in:
2026-05-23 10:27:38 -04:00
parent 4a672d42d6
commit ec1ee5f5ed
+77 -49
View File
@@ -93,6 +93,12 @@
.section-header h2 { font-size: 22px; }
.nav-links { display: none; }
}
.status-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; margin-right: 4px; }
.status-dot.online { background: #22c55e; box-shadow: 0 0 6px rgba(34,197,94,0.5); }
.status-dot.offline { background: #ef4444; }
.status-dot.checking { background: #f59e0b; animation: pulse 1s infinite; }
@keyframes pulse { 0%,100% { opacity: 1 } 50% { opacity: 0.3 } }
.svc-status { display: flex; align-items: center; gap: 2px; }
</style>
</head>
<body>
@@ -175,28 +181,28 @@
<p style="font-size:13px;color:var(--gray-400);margin:-16px 0 24px;">All accessible via <code style="background:var(--gray-50);padding:1px 6px;border-radius:3px;">*.ourpad.casa</code> behind NPMplus + Cloudflare</p>
<div class="grid-4">
<a href="https://gitea.ourpad.casa" class="svc-card"><span class="svc-icon">🦊</span><div><div class="svc-name">Gitea</div><div class="svc-desc">Self-hosted Git — repos, issues, CI</div></div></a>
<a href="https://pass.ourpad.casa" class="svc-card"><span class="svc-icon">🔐</span><div><div class="svc-name">Pass Vault</div><div class="svc-desc">Web-based secret management</div></div></a>
<a href="https://projects.ourpad.casa" class="svc-card"><span class="svc-icon">📂</span><div><div class="svc-name">Project Directory</div><div class="svc-desc">This page</div></div></a>
<a href="https://dashboard.ourpad.casa" class="svc-card"><span class="svc-icon">🏠</span><div><div class="svc-name">Heimdall Dashboard</div><div class="svc-desc">Service landing page</div></div></a>
<a href="https://sonarr.ourpad.casa" class="svc-card"><span class="svc-icon">📺</span><div><div class="svc-name">Sonarr</div><div class="svc-desc">TV show automation</div></div></a>
<a href="https://radarr.ourpad.casa" class="svc-card"><span class="svc-icon">🎬</span><div><div class="svc-name">Radarr</div><div class="svc-desc">Movie automation</div></div></a>
<a href="https://jellyseerr.ourpad.casa" class="svc-card"><span class="svc-icon">🎞️</span><div><div class="svc-name">Jellyseerr</div><div class="svc-desc">Media requests</div></div></a>
<a href="https://deluge.ourpad.casa" class="svc-card"><span class="svc-icon">📥</span><div><div class="svc-name">Deluge</div><div class="svc-desc">Torrent client</div></div></a>
<a href="https://jellyfin.ourpad.casa" class="svc-card"><span class="svc-icon">▶️</span><div><div class="svc-name">Jellyfin</div><div class="svc-desc">Media streaming</div></div></a>
<a href="https://obsidian.ourpad.casa" class="svc-card"><span class="svc-icon">🔄</span><div><div class="svc-name">Obsidian LiveSync</div><div class="svc-desc">CouchDB sync server</div></div></a>
<a href="https://inventory.ourpad.casa" class="svc-card"><span class="svc-icon">📦</span><div><div class="svc-name">Inventree</div><div class="svc-desc">Inventory management</div></div></a>
<a href="https://npmplus.ourpad.casa" class="svc-card"><span class="svc-icon">🌐</span><div><div class="svc-name">NPMplus</div><div class="svc-desc">Reverse proxy admin</div></div></a>
<a href="https://admin.ourpad.casa" class="svc-card"><span class="svc-icon">🖥️</span><div><div class="svc-name">Proxmox Admin</div><div class="svc-desc">VE management UI</div></div></a>
<a href="https://media.ourpad.casa" class="svc-card"><span class="svc-icon">💾</span><div><div class="svc-name">Proxmox Media</div><div class="svc-desc">Secondary VE host</div></div></a>
<a href="https://rustdesk.ourpad.casa" class="svc-card"><span class="svc-icon">🖧</span><div><div class="svc-name">RustDesk</div><div class="svc-desc">Remote desktop relay</div></div></a>
<a href="https://canteen.ourpad.casa" class="svc-card"><span class="svc-icon">🏗️</span><div><div class="svc-name">Canteen App</div><div class="svc-desc">Asset tracker (WIP)</div></div></a>
<a href="https://geotagger.ourpad.casa" class="svc-card"><span class="svc-icon">📍</span><div><div class="svc-name">Photo Geotagger</div><div class="svc-desc">Batch GPS updater</div></div></a>
<a href="https://hermes.ourpad.casa" class="svc-card"><span class="svc-icon">🤖</span><div><div class="svc-name">Hermes Dashboard</div><div class="svc-desc">Agent management UI</div></div></a>
<a href="https://coder.ourpad.casa" class="svc-card"><span class="svc-icon">💻</span><div><div class="svc-name">Hermes Coder</div><div class="svc-desc">Agent dashboard (coder profile)</div></div></a>
<a href="https://system-dashboard.ourpad.casa" class="svc-card"><span class="svc-icon">📊</span><div><div class="svc-name">System Dashboard</div><div class="svc-desc">Real-time server monitoring</div></div></a>
<a href="https://admin.canteen.ourpad.casa" class="svc-card"><span class="svc-icon">🛠️</span><div><div class="svc-name">Canteen Admin</div><div class="svc-desc">Asset tracker admin panel</div></div></a>
<a href="https://status.ourpad.casa" class="svc-card"><span class="svc-icon">📡</span><div><div class="svc-name">Network Status</div><div class="svc-desc">Live service health monitor</div></div></a>
<a data-svc="gitea" class="svc-card"><span class="svc-icon">🦊</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Gitea</div><div class="svc-desc">Self-hosted Git — repos, issues, CI</div></div></a>
<a data-svc="pass-vault" class="svc-card"><span class="svc-icon">🔐</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Pass Vault</div><div class="svc-desc">Web-based secret management</div></div></a>
<a data-svc="projects" class="svc-card"><span class="svc-icon">📂</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Project Directory</div><div class="svc-desc">This page</div></div></a>
<a href="https://dashboard.ourpad.casa" class="svc-card"><span class="svc-icon">🏠</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Heimdall Dashboard</div><div class="svc-desc">Service landing page</div></div></a>
<a data-svc="sonarr" class="svc-card"><span class="svc-icon">📺</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Sonarr</div><div class="svc-desc">TV show automation</div></div></a>
<a data-svc="radarr" class="svc-card"><span class="svc-icon">🎬</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Radarr</div><div class="svc-desc">Movie automation</div></div></a>
<a data-svc="jellyseerr" class="svc-card"><span class="svc-icon">🎞️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Jellyseerr</div><div class="svc-desc">Media requests</div></div></a>
<a data-svc="deluge" class="svc-card"><span class="svc-icon">📥</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Deluge</div><div class="svc-desc">Torrent client</div></div></a>
<a data-svc="jellyfin" class="svc-card"><span class="svc-icon">▶️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Jellyfin</div><div class="svc-desc">Media streaming</div></div></a>
<a data-svc="obsidian" class="svc-card"><span class="svc-icon">🔄</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Obsidian LiveSync</div><div class="svc-desc">CouchDB sync server</div></div></a>
<a data-svc="inventree" class="svc-card"><span class="svc-icon">📦</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Inventree</div><div class="svc-desc">Inventory management</div></div></a>
<a data-svc="npmplus" class="svc-card"><span class="svc-icon">🌐</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>NPMplus</div><div class="svc-desc">Reverse proxy admin</div></div></a>
<a data-svc="proxmox" class="svc-card"><span class="svc-icon">🖥️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Proxmox Admin</div><div class="svc-desc">VE management UI</div></div></a>
<a data-svc="media" class="svc-card"><span class="svc-icon">💾</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Proxmox Media</div><div class="svc-desc">Secondary VE host</div></div></a>
<a data-svc="rustdesk" class="svc-card"><span class="svc-icon">🖧</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>RustDesk</div><div class="svc-desc">Remote desktop relay</div></div></a>
<a data-svc="canteen" class="svc-card"><span class="svc-icon">🏗️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Canteen App</div><div class="svc-desc">Asset tracker (WIP)</div></div></a>
<a data-svc="geotagger" class="svc-card"><span class="svc-icon">📍</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Photo Geotagger</div><div class="svc-desc">Batch GPS updater</div></div></a>
<a data-svc="hermes" class="svc-card"><span class="svc-icon">🤖</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Hermes Dashboard</div><div class="svc-desc">Agent management UI</div></div></a>
<a data-svc="coder" class="svc-card"><span class="svc-icon">💻</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Hermes Coder</div><div class="svc-desc">Agent dashboard (coder profile)</div></div></a>
<a data-svc="system-db" class="svc-card"><span class="svc-icon">📊</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>System Dashboard</div><div class="svc-desc">Real-time server monitoring</div></div></a>
<a data-svc="canteen-admin" class="svc-card"><span class="svc-icon">🛠️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Canteen Admin</div><div class="svc-desc">Asset tracker admin panel</div></div></a>
<a data-svc="status" class="svc-card"><span class="svc-icon">📡</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Network Status</div><div class="svc-desc">Live service health monitor</div></div></a>
</div>
</div>
@@ -209,16 +215,16 @@
<p style="font-size:13px;color:var(--gray-400);margin:-16px 0 24px;">Not publicly exposed — accessible via Tailscale or internal network only</p>
<div class="grid-4">
<span class="svc-card svc-internal"><span class="svc-icon">🔍</span><div><div class="svc-name">Prowlarr</div><div class="svc-desc">Indexer aggregator (CT 104)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📚</span><div><div class="svc-name">Readarr</div><div class="svc-desc">Book management (CT 108)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⚙️</span><div><div class="svc-name">Configarr</div><div class="svc-desc">Config sync (CT 107)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📦</span><div><div class="svc-name">Unpackerr</div><div class="svc-desc">RAR extraction (CT 114)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">💬</span><div><div class="svc-name">Element Synapse</div><div class="svc-desc">Matrix server (CT 112)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🐳</span><div><div class="svc-name">Portainer</div><div class="svc-desc">Docker management (CT 100:9443)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🧠</span><div><div class="svc-name">Hermes WebUI</div><div class="svc-desc">Agent dashboard (CT 102:8787)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⌨️</span><div><div class="svc-name">Deskbrid</div><div class="svc-desc">Desktop automation</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">☁️</span><div><div class="svc-name">Cloudflare DDNS</div><div class="svc-desc">Dynamic DNS updater (CT 105)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🔗</span><div><div class="svc-name">Tailscale</div><div class="svc-desc">Mesh VPN — 2 nodes</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🔍</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Prowlarr</div><div class="svc-desc">Indexer aggregator (CT 104)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📚</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Readarr</div><div class="svc-desc">Book management (CT 108)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⚙️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Configarr</div><div class="svc-desc">Config sync (CT 107)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📦</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Unpackerr</div><div class="svc-desc">RAR extraction (CT 114)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">💬</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Element Synapse</div><div class="svc-desc">Matrix server (CT 112)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🐳</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Portainer</div><div class="svc-desc">Docker management (CT 100:9443)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🧠</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Hermes WebUI</div><div class="svc-desc">Agent dashboard (CT 102:8787)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⌨️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Deskbrid</div><div class="svc-desc">Desktop automation</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">☁️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Cloudflare DDNS</div><div class="svc-desc">Dynamic DNS updater (CT 105)</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🔗</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>Tailscale</div><div class="svc-desc">Mesh VPN — 2 nodes</div></div></span>
</div>
</div>
@@ -264,24 +270,24 @@
<div class="section-header"><h2>LXC Inventory</h2><span class="badge">17</span></div>
<p style="font-size:13px;color:var(--gray-400);margin:-16px 0 24px;">All containers across both Proxmox hosts</p>
<div class="grid-4">
<span class="svc-card svc-internal"><span class="svc-icon">🐳</span><div><div class="svc-name">CT 100 docker</div><div class="svc-desc">192.168.0.223 · Gitea, Portainer, LiveSync</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🐧</span><div><div class="svc-name">CT 101 debian</div><div class="svc-desc">Debian utility container</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🧠</span><div><div class="svc-name">CT 102 hermes</div><div class="svc-desc">100.89.190.113 · Hermes Agent host</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📺</span><div><div class="svc-name">CT 103 sonarr</div><div class="svc-desc">192.168.0.178 · Sonarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🔍</span><div><div class="svc-name">CT 104 prowlarr</div><div class="svc-desc">192.168.0.225 · Prowlarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🎬</span><div><div class="svc-name">CT 105 radarr</div><div class="svc-desc">192.168.0.123 · Radarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🎞️</span><div><div class="svc-name">CT 106 jellyseerr</div><div class="svc-desc">192.168.0.229 · Jellyseerr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⚙️</span><div><div class="svc-name">CT 107 configarr</div><div class="svc-desc">192.168.0.238 · Configarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📚</span><div><div class="svc-name">CT 108 readarr</div><div class="svc-desc">192.168.0.193 · Readarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📥</span><div><div class="svc-name">CT 109 deluge</div><div class="svc-desc">192.168.0.243 · Deluge</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">💬</span><div><div class="svc-name">CT 112 elementsynapse</div><div class="svc-desc">192.168.0.220 · Matrix</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📦</span><div><div class="svc-name">CT 114 unpackerr</div><div class="svc-desc">192.168.0.119 · Unpackerr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🏠</span><div><div class="svc-name">CT 115 heimdall</div><div class="svc-desc">192.168.0.213 · Dashboard</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📋</span><div><div class="svc-name">CT 116 inventree</div><div class="svc-desc">192.168.0.132 · Inventory</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🐳</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 100 docker</div><div class="svc-desc">192.168.0.223 · Gitea, Portainer, LiveSync</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🐧</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 101 debian</div><div class="svc-desc">Debian utility container</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🧠</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 102 hermes</div><div class="svc-desc">100.89.190.113 · Hermes Agent host</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📺</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 103 sonarr</div><div class="svc-desc">192.168.0.178 · Sonarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🔍</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 104 prowlarr</div><div class="svc-desc">192.168.0.225 · Prowlarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🎬</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 105 radarr</div><div class="svc-desc">192.168.0.123 · Radarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🎞️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 106 jellyseerr</div><div class="svc-desc">192.168.0.229 · Jellyseerr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">⚙️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 107 configarr</div><div class="svc-desc">192.168.0.238 · Configarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📚</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 108 readarr</div><div class="svc-desc">192.168.0.193 · Readarr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📥</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 109 deluge</div><div class="svc-desc">192.168.0.243 · Deluge</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">💬</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 112 elementsynapse</div><div class="svc-desc">192.168.0.220 · Matrix</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📦</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 114 unpackerr</div><div class="svc-desc">192.168.0.119 · Unpackerr</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🏠</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 115 heimdall</div><div class="svc-desc">192.168.0.213 · Dashboard</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">📋</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 116 inventree</div><div class="svc-desc">192.168.0.132 · Inventory</div></div></span>
<!-- Secondary host -->
<span class="svc-card svc-internal"><span class="svc-icon">🌐</span><div><div class="svc-name">CT 102 npmplus</div><div class="svc-desc">192.168.0.115 · Reverse proxy</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">▶️</span><div><div class="svc-name">CT 104 jellyfin</div><div class="svc-desc">192.168.0.125 · Media server</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">☁️</span><div><div class="svc-name">CT 105 cloudflare-ddns</div><div class="svc-desc">Dynamic DNS updater</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">🌐</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 102 npmplus</div><div class="svc-desc">192.168.0.115 · Reverse proxy</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">▶️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 104 jellyfin</div><div class="svc-desc">192.168.0.125 · Media server</div></div></span>
<span class="svc-card svc-internal"><span class="svc-icon">☁️</span><div><div class="svc-name"><span class="svc-status"><span class="status-dot checking"></span></span>CT 105 cloudflare-ddns</div><div class="svc-desc">Dynamic DNS updater</div></div></span>
</div>
</div>
</div>
@@ -290,5 +296,27 @@
<p>Built with <a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a> · Served via <a href="https://gitea.ourpad.casa">Gitea</a> + NPMplus · <a href="https://gitea.ourpad.casa/shawn/project-directory">Source</a></p>
</footer>
<script>
(async function() {
const STATUS_API = "https://status.ourpad.casa/api/status";
async function update() {
try {
const r = await fetch(STATUS_API);
const d = await r.json();
const byId = {};
for (const s of d.services) { byId[s.id] = s.status; }
for (const el of document.querySelectorAll("[data-svc]")) {
const sid = el.dataset.svc;
const dot = el.querySelector(".status-dot");
if (dot) {
dot.className = "status-dot " + (byId[sid] || "checking");
}
}
} catch(e) { console.log("status check failed"); }
}
update();
setInterval(update, 60000);
})();
</script>
</body>
</html>