diff --git a/index.php b/index.php
index 7db2710..16d001b 100644
--- a/index.php
+++ b/index.php
@@ -15,14 +15,65 @@ require_once __DIR__ . '/includes/lib/server_status.php';
require_once __DIR__ . '/includes/lib/view_helpers.php';
// ── Serverstatus ─────────────────────────────────────────────────────────
-// Wichtig für Performance: Beim initialen Rendern NICHT blockierend live prüfen.
-// Die Badges starten als „Unbekannt“ und werden clientseitig über /server_status.php aktualisiert.
+// Performance: Beim ersten Rendern sofort antworten (=> Unbekannt).
+// Nach ~1s lädt die Seite einmal neu mit ?status=1 und rendert dann serverseitig Online/Offline.
+$shouldComputeStatus = isset($_GET['status']) && $_GET['status'] === '1';
+
$serverStatusByUrl = [];
+if ($shouldComputeStatus) {
+ $cacheTtlSeconds = 30;
+ $cacheKey = 'server_status_v5';
+ $cacheFile = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $cacheKey . '.json';
+
+ $serverStatus = null;
+ if (is_file($cacheFile)) {
+ $raw = @file_get_contents($cacheFile);
+ if ($raw !== false) {
+ $decoded = json_decode($raw, true);
+ if (is_array($decoded) && isset($decoded['ts'], $decoded['data']) && is_array($decoded['data'])) {
+ $age = time() - (int)$decoded['ts'];
+ if ($age >= 0 && $age <= $cacheTtlSeconds) {
+ $serverStatus = $decoded['data'];
+ }
+ }
+ }
+ }
+
+ if (!is_array($serverStatus)) {
+ $serverStatus = build_server_status($serverStatusTargets);
+ @file_put_contents($cacheFile, json_encode(['ts' => time(), 'data' => $serverStatus], JSON_UNESCAPED_SLASHES));
+ }
+
+ foreach ($serverStatus as $svc) {
+ if (!empty($svc['url']) && is_string($svc['url'])) {
+ $serverStatusByUrl[$svc['url']] = $svc;
+ }
+ }
+}
require __DIR__ . '/includes/views/layout_head.php';
require __DIR__ . '/includes/views/header.php';
?>
+
+
+
+
$items): ?>