From a4f9787e77ac182e9776135f97b3edebe0d01226 Mon Sep 17 00:00:00 2001 From: Chris Zerafa Date: Mon, 3 Aug 2026 16:16:51 -0400 Subject: [PATCH] Display live backup and Git telemetry --- js/voyager.js | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/js/voyager.js b/js/voyager.js index 528edb1..a5c784e 100644 --- a/js/voyager.js +++ b/js/voyager.js @@ -41,13 +41,46 @@ function renderServices(targetId, items, disabled = false) { } loadConfig() - .then(config => { - renderStatus(config.status); +Promise.all([loadConfig(), loadTelemetry()]) + .then(([config, telemetry]) => { + const staticStatus = config.status.filter( + item => !['Backups', 'Git'].includes(item.name) + ); + + renderStatus([ + ...staticStatus, + ...telemetryStatus(telemetry.systems) + ]); + renderServices('service-grid', config.services); renderServices('home-grid', config.home, true); }) .catch(error => { console.error(error); document.getElementById('status-grid').innerHTML = - '
Configuration
Unavailable
Could not load services.json
'; + '
Telemetry
Unavailable
Could not load Voyager data
'; }); +async function loadTelemetry() { + const response = await fetch('data/status.json', { cache: 'no-store' }); + if (!response.ok) throw new Error(`Telemetry load failed: ${response.status}`); + return response.json(); +} + +function telemetryStatus(systems) { + return [ + { + name: 'Backups', + state: systems.backup.state, + label: systems.backup.summary, + value: systems.backup.detail, + detail: 'Restic backup repository' + }, + { + name: 'Git', + state: systems.git.state, + label: systems.git.state === 'online' ? 'Healthy' : 'Attention', + value: systems.git.detail, + detail: systems.git.summary + } + ]; +}