diff --git a/404.html b/404.html
index 3b32397..3d41027 100644
--- a/404.html
+++ b/404.html
@@ -4,6 +4,8 @@
+
+
diff --git a/aktion-detail.html b/aktion-detail.html
index 017a246..a65412c 100644
--- a/aktion-detail.html
+++ b/aktion-detail.html
@@ -6,6 +6,8 @@
Aktion — DOGFATHER UNIVERSE
+
+
diff --git a/assets/img/icon-192.png b/assets/img/icon-192.png
new file mode 100644
index 0000000..9746d7c
Binary files /dev/null and b/assets/img/icon-192.png differ
diff --git a/assets/img/icon-512.png b/assets/img/icon-512.png
new file mode 100644
index 0000000..5d9ce4b
Binary files /dev/null and b/assets/img/icon-512.png differ
diff --git a/assets/js/main.js b/assets/js/main.js
index a01891a..f129596 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -869,4 +869,21 @@
const sprache = getSprache();
return feld[sprache] || feld.de || "";
};
+
+ /* ===================================================================
+ PWA: Service-Worker-Registrierung
+ Voraussetzung dafür, dass Chrome/Edge auf dem Desktop "App
+ installieren" anbietet (Icon landet dann auf dem Desktop/Startmenü).
+ Bewusst defensiv: registriert NUR über http(s), niemals bei file://
+ (dort schlägt die Registrierung ohnehin fehl, die Seite muss aber
+ laut Projektregel auch per Doppelklick funktionieren — deshalb kein
+ ungefangener Fehler in der Konsole). ===================================================================== */
+ if ("serviceWorker" in navigator && /^https?:$/.test(location.protocol)) {
+ window.addEventListener("load", () => {
+ navigator.serviceWorker.register("/sw.js").catch(() => {
+ /* Stiller Fallback — Seite funktioniert auch ohne Service Worker,
+ nur ohne Installierbarkeit/Offline-Cache. */
+ });
+ });
+ }
})();
diff --git a/bewerben-creator.html b/bewerben-creator.html
index ea9091a..3cce77a 100644
--- a/bewerben-creator.html
+++ b/bewerben-creator.html
@@ -6,6 +6,8 @@
Streamer gesucht — DOGFATHER UNIVERSE
+
+
diff --git a/bewerben-kooperation.html b/bewerben-kooperation.html
index d73bc78..756e374 100644
--- a/bewerben-kooperation.html
+++ b/bewerben-kooperation.html
@@ -6,6 +6,8 @@
Kooperation anfragen — DOGFATHER UNIVERSE
+
+
diff --git a/bewerben-modi.html b/bewerben-modi.html
index 2647b59..04d297c 100644
--- a/bewerben-modi.html
+++ b/bewerben-modi.html
@@ -6,6 +6,8 @@
Modi werden — DOGFATHER UNIVERSE
+
+
diff --git a/bewerben-scout.html b/bewerben-scout.html
index 4fe75f1..77d8d29 100644
--- a/bewerben-scout.html
+++ b/bewerben-scout.html
@@ -6,6 +6,8 @@
Scout werden — DOGFATHER UNIVERSE
+
+
diff --git a/bewerben.html b/bewerben.html
index 1333fa2..39b4567 100644
--- a/bewerben.html
+++ b/bewerben.html
@@ -6,6 +6,8 @@
Bewerben — DOGFATHER UNIVERSE
+
+
diff --git a/casper.html b/casper.html
index 42f20d1..1d6db87 100644
--- a/casper.html
+++ b/casper.html
@@ -6,6 +6,8 @@
Casper — DOGFATHER UNIVERSE
+
+
diff --git a/community.html b/community.html
index 462a97b..ac2e1a4 100644
--- a/community.html
+++ b/community.html
@@ -6,6 +6,8 @@
Die Community — DOGFATHER UNIVERSE
+
+
diff --git a/creator.html b/creator.html
index b41a279..546666a 100644
--- a/creator.html
+++ b/creator.html
@@ -6,6 +6,8 @@
Creator im Team — DOGFATHER UNIVERSE
+
+
diff --git a/dogfather.html b/dogfather.html
index d6d64cc..f5675a6 100644
--- a/dogfather.html
+++ b/dogfather.html
@@ -6,6 +6,8 @@
Die Person, die DogFather erschuf — DOGFATHER UNIVERSE
+
+
diff --git a/hasidog.html b/hasidog.html
index ed87f19..58e8303 100644
--- a/hasidog.html
+++ b/hasidog.html
@@ -6,6 +6,8 @@
HasiDog-Welt — DOGFATHER UNIVERSE
+
+
diff --git a/index.html b/index.html
index 7e80b54..9202251 100644
--- a/index.html
+++ b/index.html
@@ -6,6 +6,8 @@
DOGFATHER UNIVERSE — Streamer. Community. HasiDog. Manager.
+
+
diff --git a/kontakt.html b/kontakt.html
index 6bafb82..dd66c97 100644
--- a/kontakt.html
+++ b/kontakt.html
@@ -6,6 +6,8 @@
Kontakt & Rechtliches — DOGFATHER UNIVERSE
+
+
diff --git a/links.html b/links.html
index 7a4313f..c9b6b75 100644
--- a/links.html
+++ b/links.html
@@ -6,6 +6,8 @@
Alle Links — DOGFATHER UNIVERSE
+
+
diff --git a/manager.html b/manager.html
index a3784f9..ded547e 100644
--- a/manager.html
+++ b/manager.html
@@ -6,6 +6,8 @@
Manager DogFather — Spicy Media — DOGFATHER UNIVERSE
+
+
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..9f016b0
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,28 @@
+{
+ "name": "DOGFATHER UNIVERSE",
+ "short_name": "DogFather",
+ "description": "Streamer. Community. HasiDog. Manager. Gemeinsam stark.",
+ "start_url": "/index.html",
+ "id": "/index.html",
+ "scope": "/",
+ "display": "standalone",
+ "orientation": "any",
+ "background_color": "#0b0d10",
+ "theme_color": "#0b0d10",
+ "lang": "de",
+ "dir": "ltr",
+ "icons": [
+ {
+ "src": "/assets/img/icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "any"
+ },
+ {
+ "src": "/assets/img/icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "any"
+ }
+ ]
+}
diff --git a/medien-casper.html b/medien-casper.html
index 57c17fb..f44609d 100644
--- a/medien-casper.html
+++ b/medien-casper.html
@@ -6,6 +6,8 @@
Medien — Casper — DOGFATHER UNIVERSE
+
+
diff --git a/medien-dogfather.html b/medien-dogfather.html
index 8914eaa..25969b2 100644
--- a/medien-dogfather.html
+++ b/medien-dogfather.html
@@ -6,6 +6,8 @@
Medien — DogFather — DOGFATHER UNIVERSE
+
+
diff --git a/medien-hasidog.html b/medien-hasidog.html
index 2a08332..a3a8642 100644
--- a/medien-hasidog.html
+++ b/medien-hasidog.html
@@ -6,6 +6,8 @@
Medien — HasiDog — DOGFATHER UNIVERSE
+
+
diff --git a/profil.html b/profil.html
index efc6cd9..cc7bf64 100644
--- a/profil.html
+++ b/profil.html
@@ -6,6 +6,8 @@
Profil — DOGFATHER UNIVERSE
+
+
diff --git a/stimmen.html b/stimmen.html
index 666438e..7b34a79 100644
--- a/stimmen.html
+++ b/stimmen.html
@@ -6,6 +6,8 @@
Stimmen über DogFather — DOGFATHER UNIVERSE
+
+
diff --git a/streamer.html b/streamer.html
index 649392e..0412964 100644
--- a/streamer.html
+++ b/streamer.html
@@ -6,6 +6,8 @@
Wer ist DogFather? — DOGFATHER UNIVERSE
+
+
diff --git a/streamplan.html b/streamplan.html
index af9202b..2cc3b27 100644
--- a/streamplan.html
+++ b/streamplan.html
@@ -6,6 +6,8 @@
Streamplan & Livebereich — DOGFATHER UNIVERSE
+
+
diff --git a/sw.js b/sw.js
new file mode 100644
index 0000000..c67af4c
--- /dev/null
+++ b/sw.js
@@ -0,0 +1,71 @@
+/* =====================================================================
+ sw.js — minimaler Service Worker für DOGFATHER UNIVERSE
+ Zweck: NICHT primär Offline-Funktionalität, sondern die technische
+ Voraussetzung, damit Chrome/Edge auf dem Desktop den "App installieren"-
+ Prompt zuverlässig anzeigt (Chrome verlangt dafür einen registrierten
+ Service Worker mit fetch()-Handler, siehe developer.chrome.com/blog/
+ update-install-criteria, Stand 2026). Nebenbei cached er die wichtigsten
+ Shell-Dateien, damit die Seite bei Verbindungsabbruch nicht komplett
+ leer bleibt — bewusst simpel gehalten (kein Offline-Vollausbau).
+ ===================================================================== */
+
+const CACHE_NAME = "dogfather-universe-shell-v1";
+const SHELL_ASSETS = [
+ "/",
+ "/index.html",
+ "/assets/css/main.css",
+ "/assets/css/theme-dogfather.css",
+ "/assets/css/theme-hasidog.css",
+ "/assets/css/theme-spicymedia.css",
+ "/assets/js/main.js",
+ "/assets/img/favicon.png",
+ "/assets/img/icon-192.png",
+ "/assets/img/icon-512.png",
+];
+
+self.addEventListener("install", (event) => {
+ event.waitUntil(
+ caches
+ .open(CACHE_NAME)
+ .then((cache) => cache.addAll(SHELL_ASSETS))
+ .catch(() => {
+ /* Einzelne Assets könnten fehlen (z.B. beim allerersten Deploy) —
+ soll die Installation des Service Workers nicht blockieren. */
+ })
+ );
+ self.skipWaiting();
+});
+
+self.addEventListener("activate", (event) => {
+ event.waitUntil(
+ caches
+ .keys()
+ .then((keys) =>
+ Promise.all(
+ keys
+ .filter((key) => key !== CACHE_NAME)
+ .map((key) => caches.delete(key))
+ )
+ )
+ .then(() => self.clients.claim())
+ );
+});
+
+/* Network-first mit Cache-Fallback: liefert immer die aktuellste Version,
+ greift nur bei echtem Verbindungsausfall auf den Cache zurück — damit
+ Änderungen an der Seite nicht durch veraltete Caches verdeckt werden. */
+self.addEventListener("fetch", (event) => {
+ if (event.request.method !== "GET") return;
+ const url = new URL(event.request.url);
+ if (url.origin !== self.location.origin) return;
+
+ event.respondWith(
+ fetch(event.request)
+ .then((response) => {
+ const copy = response.clone();
+ caches.open(CACHE_NAME).then((cache) => cache.put(event.request, copy));
+ return response;
+ })
+ .catch(() => caches.match(event.request))
+ );
+});
diff --git a/team-modis.html b/team-modis.html
index a21ce52..9dd5a4d 100644
--- a/team-modis.html
+++ b/team-modis.html
@@ -6,6 +6,8 @@
Modi-Team — DOGFATHER UNIVERSE
+
+
diff --git a/team-scouts.html b/team-scouts.html
index e8e1db2..1a025cd 100644
--- a/team-scouts.html
+++ b/team-scouts.html
@@ -6,6 +6,8 @@
Scout-Team — DOGFATHER UNIVERSE
+
+
diff --git a/vanvan.html b/vanvan.html
index 8614252..1db469e 100644
--- a/vanvan.html
+++ b/vanvan.html
@@ -6,6 +6,8 @@
VanVan — die rechte Hand von Dogi — DOGFATHER UNIVERSE
+
+
diff --git a/werte.html b/werte.html
index 0c1a6ab..ec179a9 100644
--- a/werte.html
+++ b/werte.html
@@ -6,6 +6,8 @@
Werte als Manager — DOGFATHER UNIVERSE
+
+
diff --git a/zeitreise.html b/zeitreise.html
index 188bf77..8da43ef 100644
--- a/zeitreise.html
+++ b/zeitreise.html
@@ -6,6 +6,8 @@
Zeitreise — DOGFATHER UNIVERSE
+
+