Automatischer öffentlicher Start um 21 Uhr + Countdown auf der Zugangsseite

Nutzer-Wunsch 21.08.2026: "ich will dass du auch ein countdown zu der
seite hinzufügst wo wir den zugangscode eingeben müssen. den um 21h heute
abend geht die seite live. kannst du das sogar so anpassen dass es
automatisch läuft?"

server/gate.js:
- Neue Einstellung SITE_PUBLIC_LAUNCH_AT (ISO-Zeitstempel mit Zeitzone).
  Ab diesem Moment lässt gateMiddleware ausnahmslos jeden durch -- ganz
  ohne Neustart oder manuellen Eingriff, weil jede Anfrage die aktuelle
  Serverzeit live neu prüft. Die Freischaltung "passiert" also von selbst
  in der Sekunde, in der die Uhrzeit erreicht wird. Vorher bleiben die
  Zugangscodes unverändert nötig, damit das Team schon vorher rein kann.
  Fail-safe statt fail-open geprüft: ein kaputter/unparsbarer Zeitwert
  (z.B. Tippfehler in der .env) lässt die Schranke aktiv, statt die Seite
  versehentlich für alle zu öffnen.
- Neuer öffentlicher Endpunkt GET /gate-launch-info (immer erreichbar,
  auch ohne gültige Sitzung) liefert launchAt/isLive/serverTime für die
  Countdown-Anzeige im Frontend.

gate.html:
- Neue Countdown-Box zwischen Titel-Karte und den Zugangscode-Kacheln
  (bleibt unsichtbar, solange kein Starttermin konfiguriert ist). Rechnet
  auf der SERVERZEIT statt der eigenen Uhr (einmaliger Zeit-Abgleich beim
  Laden), damit eine falsch gehende Besucher-Uhr weder zu früh noch zu
  spät zählt. Bei Erreichen von Null folgt ein letzter Abgleich mit dem
  Server, bevor automatisch zur Zielseite weitergeleitet wird -- kein
  Klick, kein Neuladen nötig.
- Zugangscode-Kacheln (Dogi/VanVan/Diene) bleiben während des Countdowns
  unverändert nutzbar.

Getestet: 18 Middleware-Tests (inkl. Fail-safe bei kaputtem Zeitwert,
weiterhin funktionierender Zugangscode vor dem Start) + 10 Playwright-
Tests der Countdown-Oberfläche (Anzeige, Format, automatischer Sprung bei
Ablauf, sofortige Weiterleitung falls schon live, stiller Fallback bei
Netzwerkfehler). Zusätzlich alle 32 echten Seiten auf PC-Installierbarkeit
geprüft (Manifest, Icons, Service Worker, Install-Knopf, echter
Install-Klick-Ablauf simuliert) -- keine Probleme gefunden.

Cache-Busting-Version auf 20260821s erhöht.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-08-21 19:25:12 +02:00
co-authored by Claude Sonnet 5
parent 41faf22614
commit 57966e24d0
37 changed files with 408 additions and 243 deletions
+6 -6
View File
@@ -18,10 +18,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<title>Seite nicht gefunden — DOGFATHER UNIVERSE</title> <title>Seite nicht gefunden — DOGFATHER UNIVERSE</title>
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -41,7 +41,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-404.js?v=20260821r"></script> <script src="assets/js/i18n-404.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Unterstütze Dogfather dauerhaft mit der DogiCrew 🩵 und sammle exklusive Treueprämien — die Teddy-Kollektion entsteht in Kooperation mit VanVan." /> <meta name="twitter:description" content="Unterstütze Dogfather dauerhaft mit der DogiCrew 🩵 und sammle exklusive Treueprämien — die Teddy-Kollektion entsteht in Kooperation mit VanVan." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* ===================================================================== /* =====================================================================
Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback
@@ -603,9 +603,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-abonnieren.js?v=20260821r"></script> <script src="assets/js/i18n-abonnieren.js?v=20260821s"></script>
<script src="assets/js/supporter.js?v=20260821r"></script> <script src="assets/js/supporter.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
(function () { (function () {
const S = window.DogiSupporter; const S = window.DogiSupporter;
+5 -5
View File
@@ -20,10 +20,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -134,6 +134,6 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." /> <meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -51,9 +51,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-aktionen.js?v=20260821r"></script> <script src="assets/js/data-aktionen.js?v=20260821s"></script>
<script src="assets/js/i18n-aktion-detail.js?v=20260821r"></script> <script src="assets/js/i18n-aktion-detail.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const params = new URLSearchParams(location.search); const params = new URLSearchParams(location.search);
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Du bist Streamer und suchst einen Manager? Bewirb dich als Creator bei Spicy Media." /> <meta name="twitter:description" content="Du bist Streamer und suchst einen Manager? Bewirb dich als Creator bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-creator.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-creator-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-creator.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-creator-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -70,8 +70,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821r"></script> <script src="assets/js/forms.js?v=20260821s"></script>
<script src="assets/js/i18n-bewerben-creator.js?v=20260821r"></script> <script src="assets/js/i18n-bewerben-creator.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -22,10 +22,10 @@
<meta name="twitter:description" content="Kooperationsanfrage an Manager DogFather / Spicy Media." /> <meta name="twitter:description" content="Kooperationsanfrage an Manager DogFather / Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -68,8 +68,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821r"></script> <script src="assets/js/forms.js?v=20260821s"></script>
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260821r"></script> <script src="assets/js/i18n-bewerben-kooperation.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Modi bei Team Dogi — DogFathers persönliches Community-Team." /> <meta name="twitter:description" content="Werde Modi bei Team Dogi — DogFathers persönliches Community-Team." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-modi.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-modi-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-modi.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-modi-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -79,8 +79,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821r"></script> <script src="assets/js/forms.js?v=20260821s"></script>
<script src="assets/js/i18n-bewerben-modi.js?v=20260821r"></script> <script src="assets/js/i18n-bewerben-modi.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Scout für DogFather bei der Spicy Media Agentur — finde neue Talente." /> <meta name="twitter:description" content="Werde Scout für DogFather bei der Spicy Media Agentur — finde neue Talente." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-scout.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-scout-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-scout.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-scout-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -71,8 +71,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821r"></script> <script src="assets/js/forms.js?v=20260821s"></script>
<script src="assets/js/i18n-bewerben-scout.js?v=20260821r"></script> <script src="assets/js/i18n-bewerben-scout.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Teil vom Team: Modi bei Team Dogi, Scout oder Creator bei Spicy Media, oder Kooperation anfragen." /> <meta name="twitter:description" content="Werde Teil vom Team: Modi bei Team Dogi, Scout oder Creator bei Spicy Media, oder Kooperation anfragen." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-split.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-split-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-split.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-split-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -85,7 +85,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-bewerben.js?v=20260821r"></script> <script src="assets/js/i18n-bewerben.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Der Husky an DogFathers Seite — das tierische Gesicht der HasiDog-Welt." /> <meta name="twitter:description" content="Der Husky an DogFathers Seite — das tierische Gesicht der HasiDog-Welt." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-casper.jpg');--page-bg-mobile:url('/assets/img/bg-casper-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-casper.jpg');--page-bg-mobile:url('/assets/img/bg-casper-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -85,7 +85,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-casper.js?v=20260821r"></script> <script src="assets/js/i18n-casper.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Team Dogi ist Familie — die Community rund um DogFather und HasiDog." /> <meta name="twitter:description" content="Team Dogi ist Familie — die Community rund um DogFather und HasiDog." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-community.jpg');--page-bg-mobile:url('/assets/img/bg-community-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-community.jpg');--page-bg-mobile:url('/assets/img/bg-community-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -84,7 +84,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-community.js?v=20260821r"></script> <script src="assets/js/i18n-community.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Content Creator, die Teil von DogFather / Spicy Media sind." /> <meta name="twitter:description" content="Content Creator, die Teil von DogFather / Spicy Media sind." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-creator.jpg');--page-bg-mobile:url('/assets/img/bg-creator-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-creator.jpg');--page-bg-mobile:url('/assets/img/bg-creator-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -60,9 +60,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-creator.js?v=20260821r"></script> <script src="assets/js/data-creator.js?v=20260821s"></script>
<script src="assets/js/i18n-creator.js?v=20260821r"></script> <script src="assets/js/i18n-creator.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", async () => { document.addEventListener("DOMContentLoaded", async () => {
const grid = document.getElementById("creator-grid"); const grid = document.getElementById("creator-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Wer ist DogFather wirklich? Persönlichkeit, Werte und die Geschichte hinter dem Content." /> <meta name="twitter:description" content="Wer ist DogFather wirklich? Persönlichkeit, Werte und die Geschichte hinter dem Content." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-dogfather-person.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-person-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-dogfather-person.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-person-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -158,7 +158,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-dogfather.js?v=20260821r"></script> <script src="assets/js/i18n-dogfather.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+120 -2
View File
@@ -26,8 +26,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="DogFather" /> <meta name="apple-mobile-web-app-title" content="DogFather" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<style> <style>
/* ===================================================================== /* =====================================================================
Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern
@@ -246,6 +246,37 @@
.gate-cards { flex-direction: column; align-items: center; } .gate-cards { flex-direction: column; align-items: center; }
.gate-card { max-width: 300px; width: 100%; } .gate-card { max-width: 300px; width: 100%; }
} }
/* ---------- Countdown zum öffentlichen Start (21.08.2026) ----------
Nutzer-Wunsch: "ich will dass du auch ein countdown zu der seite
hinzufügst wo wir den zugangscode eingeben müssen. den um 21h heute
abend geht die seite live." Eigene, ruhige Optik statt einer reinen
Zahlenanzeige — passt zur restlichen Gold/Aurora-Bühne der Seite.
[hidden] per Default: erscheint erst, wenn server/gate.js per
/gate-launch-info wirklich einen Start-Zeitpunkt meldet (siehe Skript
unten) — ohne das bleibt die Seite unverändert wie vorher. */
.gate-countdown {
position: relative; z-index: 2; width: 100%; text-align: center;
margin-top: 1.3rem; padding: 1.1rem 1.4rem;
border-radius: 16px; border: 1.5px solid rgba(212,175,55,.35);
background: linear-gradient(180deg, rgba(20,23,29,.85), rgba(10,12,15,.9));
box-shadow: 0 20px 50px -25px rgba(0,0,0,.7);
}
.gate-countdown[hidden] { display: none; }
.gate-countdown-label {
margin: 0 0 .5rem; font-size: .78rem; letter-spacing: .1em; text-transform: uppercase;
color: var(--text-muted);
}
.gate-countdown-zeit {
margin: 0; font-family: var(--font-head); font-weight: 800; letter-spacing: .04em;
font-size: clamp(1.7rem, 6vw, 2.4rem); font-variant-numeric: tabular-nums;
background: linear-gradient(135deg, #fff, #ffe9a8 55%, #d4af37);
-webkit-background-clip: text; background-clip: text; color: transparent;
animation: gate-countdown-puls 2.4s ease-in-out infinite;
}
@keyframes gate-countdown-puls { 0%,100% { opacity: .92; } 50% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .gate-countdown-zeit { animation: none; } }
.gate-countdown-hinweis { margin: .55rem 0 0; font-size: .82rem; color: var(--text-muted); }
</style> </style>
</head> </head>
<body> <body>
@@ -269,6 +300,15 @@
</p> </p>
</div> </div>
<!-- Countdown zum öffentlichen Start (21.08.2026) — bleibt leer/unsichtbar,
solange server/gate.js keinen SITE_PUBLIC_LAUNCH_AT meldet (siehe
/gate-launch-info im Skript unten). -->
<div class="gate-countdown" id="gate-countdown" hidden>
<p class="gate-countdown-label">🎉 Startet automatisch in</p>
<p class="gate-countdown-zeit" id="gate-countdown-zeit">--:--:--</p>
<p class="gate-countdown-hinweis">Kein Neuladen nötig — die Seite öffnet sich von selbst.</p>
</div>
<!-- Nutzer-Wunsch 07.08.2026: statt einem gemeinsamen Eingabefeld für <!-- Nutzer-Wunsch 07.08.2026: statt einem gemeinsamen Eingabefeld für
Dogi/VanVan jetzt 2 getrennte Kacheln, gleiches Muster wie schon in Dogi/VanVan jetzt 2 getrennte Kacheln, gleiches Muster wie schon in
verwaltung.html — beide Formulare rufen weiterhin denselben verwaltung.html — beide Formulare rufen weiterhin denselben
@@ -405,6 +445,84 @@
bindeGateKachel("gate-form-vanvan", "gate-code-vanvan", "gate-fehler-vanvan"); bindeGateKachel("gate-form-vanvan", "gate-code-vanvan", "gate-fehler-vanvan");
bindeGateKachel("gate-form-diene", "gate-code-diene", "gate-fehler-diene"); bindeGateKachel("gate-form-diene", "gate-code-diene", "gate-fehler-diene");
/* ---------- Countdown zum öffentlichen Start (21.08.2026) ----------
Nutzer-Wunsch: "um 21h heute abend geht die seite live. kannst du das
sogar so anpassen dass es automatisch läuft?" -- server/gate.js meldet
über /gate-launch-info den echten Start-Zeitpunkt (SITE_PUBLIC_LAUNCH_AT
in der .env) und lässt ab genau diesem Moment jeden ohne Code durch.
Diese Uhr hier ist rein die SICHTBARE Anzeige dafür + der automatische
Sprung zur Zielseite, sobald es soweit ist -- die eigentliche
Freischaltung passiert unabhängig davon serverseitig.
Läuft bewusst auf der SERVERZEIT, nicht der eigenen Uhr: viele Handys/
PCs gehen ein paar Minuten falsch, das würde sonst entweder zu früh
"00:00:00" zeigen (und dann an der noch verschlossenen Schranke
scheitern) oder unnötig lange nachzählen. offsetMs wird einmal beim
Laden bestimmt (Server-Zeit minus eigene Zeit) und auf die eigene,
lokal tickende Uhr addiert -- kein Dauer-Nachfragen nötig, nur beim
Erreichen von Null ein letzter Abgleich als Sicherheitsnetz. */
const countdownBox = document.getElementById("gate-countdown");
const countdownZeit = document.getElementById("gate-countdown-zeit");
function formatiereCountdown(ms) {
const gesamtSekunden = Math.max(0, Math.round(ms / 1000));
const std = Math.floor(gesamtSekunden / 3600);
const min = Math.floor((gesamtSekunden % 3600) / 60);
const sek = gesamtSekunden % 60;
const zweistellig = (n) => String(n).padStart(2, "0");
return `${zweistellig(std)}:${zweistellig(min)}:${zweistellig(sek)}`;
}
async function holeLaunchInfo() {
try {
const res = await fetch("/gate-launch-info", { cache: "no-store" });
const data = await res.json();
return data && data.ok ? data : null;
} catch {
return null;
}
}
if (countdownBox && countdownZeit) {
async function richteCountdownEin(info) {
const launchAtMs = new Date(info.launchAt).getTime();
const offsetMs = new Date(info.serverTime).getTime() - Date.now();
countdownBox.hidden = false;
const timerId = setInterval(async () => {
const serverJetzt = Date.now() + offsetMs;
const rest = launchAtMs - serverJetzt;
if (rest > 0) {
countdownZeit.textContent = formatiereCountdown(rest);
return;
}
countdownZeit.textContent = "00:00:00";
clearInterval(timerId);
// Letzter Abgleich mit dem Server statt blind der eigenen Uhr zu
// vertrauen -- erst wenn ER bestätigt "live", wird weitergeleitet.
// Sagt er "noch nicht" (z.B. Uhr wich ein paar Sekunden ab, oder
// der Zeitpunkt wurde inzwischen verschoben), richtet sich der
// Countdown mit den frischen Werten einfach neu ein, statt
// stumm bei "00:00:00" stehen zu bleiben.
const bestaetigung = await holeLaunchInfo();
if (bestaetigung && bestaetigung.isLive) location.href = next;
else if (bestaetigung && bestaetigung.launchAt) richteCountdownEin(bestaetigung);
}, 1000);
}
(async function starteCountdown() {
const info = await holeLaunchInfo();
if (!info || !info.launchAt) return; // kein Starttermin gesetzt -> Box bleibt versteckt
if (info.isLive) {
location.href = next; // schon live (z.B. Seite kurz nach dem Start neu geöffnet)
return;
}
richteCountdownEin(info);
})();
}
/* Service-Worker-Registrierung — auf allen anderen Seiten macht das main.js, diese Seite /* Service-Worker-Registrierung — auf allen anderen Seiten macht das main.js, diese Seite
ist aber bewusst eigenstaendig und laedt main.js nicht. Ohne registrierten Service ist aber bewusst eigenstaendig und laedt main.js nicht. Ohne registrierten Service
Worker bietet Chrome hier gar kein "App installieren" an (siehe Kommentar im Kopfbereich). Worker bietet Chrome hier gar kein "App installieren" an (siehe Kommentar im Kopfbereich).
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="HasiDog: Maskottchen, Musikprojekt und die verspielte, familiäre Seite von Team Dogi." /> <meta name="twitter:description" content="HasiDog: Maskottchen, Musikprojekt und die verspielte, familiäre Seite von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-hasidog-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-hasidog-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -186,7 +186,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-hasidog.js?v=20260821r"></script> <script src="assets/js/i18n-hasidog.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+8 -8
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DOGFATHER UNIVERSE: die Heimat von DogFather als Streamer, der HasiDog-Community und Manager DogFather bei Spicy Media." /> <meta name="twitter:description" content="DOGFATHER UNIVERSE: die Heimat von DogFather als Streamer, der HasiDog-Community und Manager DogFather bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="start-seite"> <body class="start-seite">
<div id="site-header"></div> <div id="site-header"></div>
@@ -290,10 +290,10 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821r"></script> <script src="assets/js/data-modis.js?v=20260821s"></script>
<script src="assets/js/data-scouts.js?v=20260821r"></script> <script src="assets/js/data-scouts.js?v=20260821s"></script>
<script src="assets/js/i18n-index.js?v=20260821r"></script> <script src="assets/js/i18n-index.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
// Gleiche URL wie in assets/js/forms.js / postfach.html — läuft seit // Gleiche URL wie in assets/js/forms.js / postfach.html — läuft seit
// 05.08.2026 auf dem eigenen Server statt auf Cloudflare Workers. // 05.08.2026 auf dem eigenen Server statt auf Cloudflare Workers.
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Kontakt, Impressum und Datenschutz von DOGFATHER UNIVERSE." /> <meta name="twitter:description" content="Kontakt, Impressum und Datenschutz von DOGFATHER UNIVERSE." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -126,7 +126,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-kontakt.js?v=20260821r"></script> <script src="assets/js/i18n-kontakt.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Alle Social-Media- und Musik-Links von DogFather an einem Ort — plus QR-Codes." /> <meta name="twitter:description" content="Alle Social-Media- und Musik-Links von DogFather an einem Ort — plus QR-Codes." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* Rabattcodes: an das Supporter-Abo gekoppelt (Nutzer-Feedback /* Rabattcodes: an das Supporter-Abo gekoppelt (Nutzer-Feedback
03.08.2026: "verbinde es mit dem Abo... wenn die Leute drauf drücken 03.08.2026: "verbinde es mit dem Abo... wenn die Leute drauf drücken
@@ -140,8 +140,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-links.js?v=20260821r"></script> <script src="assets/js/i18n-links.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
(function () { (function () {
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DogFather als Manager bei der Spicy Media Agency: Scouts, Creator und faire Zusammenarbeit." /> <meta name="twitter:description" content="DogFather als Manager bei der Spicy Media Agency: Scouts, Creator und faire Zusammenarbeit." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-manager.jpg');--page-bg-mobile:url('/assets/img/bg-manager-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-manager.jpg');--page-bg-mobile:url('/assets/img/bg-manager-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -139,9 +139,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-manager.js?v=20260821r"></script> <script src="assets/js/data-manager.js?v=20260821s"></script>
<script src="assets/js/i18n-manager.js?v=20260821r"></script> <script src="assets/js/i18n-manager.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
// "Weitere Manager" (21.08.2026) -- siehe Kommentar bei #weitere-manager-root // "Weitere Manager" (21.08.2026) -- siehe Kommentar bei #weitere-manager-root
// oben. Aktuell IMMER window.MANAGERS === [] (siehe data-manager.js), Inhalt // oben. Aktuell IMMER window.MANAGERS === [] (siehe data-manager.js), Inhalt
+9 -9
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos und Videos rund um Husky Casper an einem Ort." /> <meta name="twitter:description" content="Fotos und Videos rund um Husky Casper an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" data-welt="casper" style="--page-bg:url('/assets/img/bg-medien-casper.jpg');--page-bg-mobile:url('/assets/img/bg-medien-casper-mobile.jpg');"> <body class="mit-hintergrund" data-welt="casper" style="--page-bg:url('/assets/img/bg-medien-casper.jpg');--page-bg-mobile:url('/assets/img/bg-medien-casper-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -59,10 +59,10 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821r"></script> <script src="assets/js/data-media.js?v=20260821s"></script>
<script src="assets/js/data-videos.js?v=20260821r"></script> <script src="assets/js/data-videos.js?v=20260821s"></script>
<script src="assets/js/medien-welt.js?v=20260821r"></script> <script src="assets/js/medien-welt.js?v=20260821s"></script>
<script src="assets/js/i18n-medien-casper.js?v=20260821r"></script> <script src="assets/js/i18n-medien-casper.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus DogFathers Welt an einem Ort." /> <meta name="twitter:description" content="Fotos, Videos und Events aus DogFathers Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" data-welt="dogfather" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');"> <body class="mit-hintergrund" data-welt="dogfather" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -65,11 +65,11 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821r"></script> <script src="assets/js/data-media.js?v=20260821s"></script>
<script src="assets/js/data-videos.js?v=20260821r"></script> <script src="assets/js/data-videos.js?v=20260821s"></script>
<script src="assets/js/data-aktionen.js?v=20260821r"></script> <script src="assets/js/data-aktionen.js?v=20260821s"></script>
<script src="assets/js/medien-welt.js?v=20260821r"></script> <script src="assets/js/medien-welt.js?v=20260821s"></script>
<script src="assets/js/i18n-medien-dogfather.js?v=20260821r"></script> <script src="assets/js/i18n-medien-dogfather.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus der HasiDog-Welt an einem Ort." /> <meta name="twitter:description" content="Fotos, Videos und Events aus der HasiDog-Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" data-welt="hasidog" style="--page-bg:url('/assets/img/bg-medien-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-medien-hasidog-mobile.jpg');"> <body class="mit-hintergrund" data-welt="hasidog" style="--page-bg:url('/assets/img/bg-medien-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-medien-hasidog-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -65,11 +65,11 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821r"></script> <script src="assets/js/data-media.js?v=20260821s"></script>
<script src="assets/js/data-videos.js?v=20260821r"></script> <script src="assets/js/data-videos.js?v=20260821s"></script>
<script src="assets/js/data-aktionen.js?v=20260821r"></script> <script src="assets/js/data-aktionen.js?v=20260821s"></script>
<script src="assets/js/medien-welt.js?v=20260821r"></script> <script src="assets/js/medien-welt.js?v=20260821s"></script>
<script src="assets/js/i18n-medien-hasidog.js?v=20260821r"></script> <script src="assets/js/i18n-medien-hasidog.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -16,10 +16,10 @@
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="robots" content="noindex" /> <!-- generische URL, echte Team-Seiten verlinken hierher --> <meta name="robots" content="noindex" /> <!-- generische URL, echte Team-Seiten verlinken hierher -->
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
.profil-photo { aspect-ratio: 4/5; max-width: 420px; margin: 0 auto; } .profil-photo { aspect-ratio: 4/5; max-width: 420px; margin: 0 auto; }
.profil-photo img { width: 100%; height: 100%; object-fit: cover; display: block; } .profil-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
@@ -130,12 +130,12 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821r"></script> <script src="assets/js/data-modis.js?v=20260821s"></script>
<script src="assets/js/data-scouts.js?v=20260821r"></script> <script src="assets/js/data-scouts.js?v=20260821s"></script>
<script src="assets/js/data-creator.js?v=20260821r"></script> <script src="assets/js/data-creator.js?v=20260821s"></script>
<script src="assets/js/data-manager.js?v=20260821r"></script> <script src="assets/js/data-manager.js?v=20260821s"></script>
<script src="assets/js/i18n-profil.js?v=20260821r"></script> <script src="assets/js/i18n-profil.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", async () => { document.addEventListener("DOMContentLoaded", async () => {
const slug = new URLSearchParams(location.search).get("p") || ""; const slug = new URLSearchParams(location.search).get("p") || "";
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Rabattcodes von Dogis Partnern für Team Dogi — spar bares Geld bei ausgewählten Marken." /> <meta name="twitter:description" content="Rabattcodes von Dogis Partnern für Team Dogi — spar bares Geld bei ausgewählten Marken." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* Leere-Zustand-Kachel im "Gutschein"-Look: gestrichelter Rand wie ein /* Leere-Zustand-Kachel im "Gutschein"-Look: gestrichelter Rand wie ein
ausgeschnittener Coupon, damit auch OHNE echte Codes schon klar ist, ausgeschnittener Coupon, damit auch OHNE echte Codes schon klar ist,
@@ -131,8 +131,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-rabattcodes.js?v=20260821r"></script> <script src="assets/js/i18n-rabattcodes.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
(function () { (function () {
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
+9
View File
@@ -6,3 +6,12 @@ PORT=4100
SITE_ACCESS_SECRET= SITE_ACCESS_SECRET=
SITE_ACCESS_CODE_DOGI= SITE_ACCESS_CODE_DOGI=
SITE_ACCESS_CODE_VANVAN= SITE_ACCESS_CODE_VANVAN=
SITE_ACCESS_CODE_DIENE=
# Automatischer öffentlicher Start (21.08.2026): ab diesem Zeitpunkt lässt
# gate.js JEDEN durch, ganz ohne Neustart/manuellen Eingriff -- die Codes
# oben bleiben bis dahin unverändert nötig. ISO-Format MIT Zeitzone, sonst
# wird der Wert als UTC statt als Ortszeit gelesen. Leer lassen = kein
# automatischer Start, die Schranke bleibt dauerhaft aktiv.
# Beispiel (21 Uhr deutscher Sommerzeit): 2026-08-21T21:00:00+02:00
SITE_PUBLIC_LAUNCH_AT=
+38
View File
@@ -214,9 +214,47 @@ export async function gateAuthHandler(req, res) {
return res.json({ ok: true, next }); return res.json({ ok: true, next });
} }
/* Automatischer öffentlicher Start (21.08.2026, Nutzer-Wunsch: "um 21h heute
abend geht die seite live. kannst du das sogar so anpassen dass es
automatisch läuft?"). SITE_PUBLIC_LAUNCH_AT ist ein fester Zeitpunkt
(ISO-String MIT Zeitzone in der .env, z.B. "2026-08-21T21:00:00+02:00").
Ab diesem Moment lässt diese Prüfung ausnahmslos jeden durch — ganz ohne
Neustart und ohne jeden manuellen Eingriff: jede einzelne Anfrage prüft
die aktuelle Serverzeit neu, die Freischaltung "passiert" also von selbst
in der Sekunde, in der die Uhrzeit erreicht wird. Vorher (isLive: false)
ändert sich am bisherigen Verhalten nichts — die Zugangscodes bleiben bis
dahin unverändert nötig, damit das Team schon vorher rein kann.
Fehlt die Variable (z.B. lokal beim Testen), bleibt isLive dauerhaft
false — reines Opt-in, kein Verhalten ändert sich ohne diese Einstellung. */
function ermittleLiveStatus() {
const wert = process.env.SITE_PUBLIC_LAUNCH_AT;
if (!wert) return { launchAt: null, isLive: false };
const launchMs = new Date(wert).getTime();
if (Number.isNaN(launchMs)) return { launchAt: null, isLive: false };
return { launchAt: launchMs, isLive: Date.now() >= launchMs };
}
export function gateMiddleware(req, res, next) { export function gateMiddleware(req, res, next) {
const pfad = req.path; const pfad = req.path;
/* Öffentlicher, IMMER erreichbarer Status-Endpunkt für den Countdown auf
gate.html — unabhängig davon, ob gerade Codes verlangt werden, damit
das Frontend jederzeit den echten (serverseitigen) Stand erfragen kann,
statt sich auf die möglicherweise falsch gestellte Uhr des Besuchers zu
verlassen. Bewusst vor jeder anderen Prüfung, damit er auch dann noch
antwortet, wenn z.B. SITE_ACCESS_SECRET fehlt oder die Sperre aktiv ist. */
if (pfad === "/gate-launch-info" && req.method === "GET") {
const { launchAt, isLive } = ermittleLiveStatus();
return res.json({
ok: true,
launchAt: launchAt ? new Date(launchAt).toISOString() : null,
isLive,
serverTime: new Date().toISOString(),
});
}
if (ermittleLiveStatus().isLive) return next(); // Uhrzeit erreicht -> Seite ist automatisch öffentlich
const codesKonfiguriert = !!(process.env.SITE_ACCESS_SECRET && (process.env.SITE_ACCESS_CODE_DOGI || process.env.SITE_ACCESS_CODE_VANVAN || process.env.SITE_ACCESS_CODE_DIENE)); const codesKonfiguriert = !!(process.env.SITE_ACCESS_SECRET && (process.env.SITE_ACCESS_CODE_DOGI || process.env.SITE_ACCESS_CODE_VANVAN || process.env.SITE_ACCESS_CODE_DIENE));
if (!codesKonfiguriert) return next(); if (!codesKonfiguriert) return next();
+8 -8
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Was die Community und das Team über DogFather sagen." /> <meta name="twitter:description" content="Was die Community und das Team über DogFather sagen." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-stimmen.jpg');--page-bg-mobile:url('/assets/img/bg-stimmen-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-stimmen.jpg');--page-bg-mobile:url('/assets/img/bg-stimmen-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -102,9 +102,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-stimmen-avatare.js?v=20260821r"></script> <script src="assets/js/data-stimmen-avatare.js?v=20260821s"></script>
<script src="assets/js/i18n-stimmen.js?v=20260821r"></script> <script src="assets/js/i18n-stimmen.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script src="assets/js/stimmen.js?v=20260821r"></script> <script src="assets/js/stimmen.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die persönliche Geschichte hinter DogFather — Filipe, Streamer, Manager bei Spicy Media und Hundepapa von Husky Casper." /> <meta name="twitter:description" content="Die persönliche Geschichte hinter DogFather — Filipe, Streamer, Manager bei Spicy Media und Hundepapa von Husky Casper." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamer.jpg');--page-bg-mobile:url('/assets/img/bg-streamer-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamer.jpg');--page-bg-mobile:url('/assets/img/bg-streamer-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -217,7 +217,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-streamer.js?v=20260821r"></script> <script src="assets/js/i18n-streamer.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+9 -9
View File
@@ -19,17 +19,17 @@
<meta name="twitter:description" content="Wann geht DogFather live? Streamplan und Livebereich." /> <meta name="twitter:description" content="Wann geht DogFather live? Streamplan und Livebereich." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260821r');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260821r');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260821s');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260821s');">
<div id="site-header"></div> <div id="site-header"></div>
<main> <main>
<section class="hero page-bg"> <section class="hero page-bg">
<div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260821r" alt="" loading="eager" /></div> <div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260821s" alt="" loading="eager" /></div>
<div class="container"> <div class="container">
<span class="eyebrow" data-i18n="sp_eyebrow">Welt 1 — DogFather</span> <span class="eyebrow" data-i18n="sp_eyebrow">Welt 1 — DogFather</span>
<h1 data-i18n="sp_h1">Streamplan &amp; Livebereich</h1> <h1 data-i18n="sp_h1">Streamplan &amp; Livebereich</h1>
@@ -126,8 +126,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-streamplan.js?v=20260821r"></script> <script src="assets/js/i18n-streamplan.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script src="assets/js/streamplan.js?v=20260821r"></script> <script src="assets/js/streamplan.js?v=20260821s"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -9,10 +9,10 @@
<link rel="manifest" href="/manifest.json" /> <link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#0b0d10" /> <meta name="theme-color" content="#0b0d10" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* ===================================================================== /* =====================================================================
Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback
@@ -515,9 +515,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-supporter.js?v=20260821r"></script> <script src="assets/js/i18n-supporter.js?v=20260821s"></script>
<script src="assets/js/supporter.js?v=20260821r"></script> <script src="assets/js/supporter.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
(function () { (function () {
const S = window.DogiSupporter; const S = window.DogiSupporter;
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." /> <meta name="twitter:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-modis.jpg');--page-bg-mobile:url('/assets/img/bg-modis.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-modis.jpg');--page-bg-mobile:url('/assets/img/bg-modis.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -72,9 +72,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821r"></script> <script src="assets/js/data-modis.js?v=20260821s"></script>
<script src="assets/js/i18n-team-modis.js?v=20260821r"></script> <script src="assets/js/i18n-team-modis.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("modis-grid"); const grid = document.getElementById("modis-grid");
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Scouts von Team Dogi bei Spicy Media." /> <meta name="twitter:description" content="Die Scouts von Team Dogi bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-scouts.jpg');--page-bg-mobile:url('/assets/img/bg-scouts-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-scouts.jpg');--page-bg-mobile:url('/assets/img/bg-scouts-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -49,9 +49,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-scouts.js?v=20260821r"></script> <script src="assets/js/data-scouts.js?v=20260821s"></script>
<script src="assets/js/i18n-team-scouts.js?v=20260821r"></script> <script src="assets/js/i18n-team-scouts.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("scouts-grid"); const grid = document.getElementById("scouts-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Eine persönliche Widmung von Dogi an Tili — seine TikTok-Muddi, die erste und bis heute einzige Streamerin, die ihm all die Zeit treu geblieben ist." /> <meta name="twitter:description" content="Eine persönliche Widmung von Dogi an Tili — seine TikTok-Muddi, die erste und bis heute einzige Streamerin, die ihm all die Zeit treu geblieben ist." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* Gleiche Anpassung wie vanvan.html: der site-weit etwas größere /* Gleiche Anpassung wie vanvan.html: der site-weit etwas größere
Fließtext wirkt bei einem so langen persönlichen Brief zu wuchtig — Fließtext wirkt bei einem so langen persönlichen Brief zu wuchtig —
@@ -153,7 +153,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-tt-muddi.js?v=20260821r"></script> <script src="assets/js/i18n-tt-muddi.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan erzählt ihre Geschichte: wie sie zu Team Dogi kam, wer sie ist und was DogFather und Team Dogi ihr bedeuten." /> <meta name="twitter:description" content="VanVan erzählt ihre Geschichte: wie sie zu Team Dogi kam, wer sie ist und was DogFather und Team Dogi ihr bedeuten." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* Auf Wunsch: der site-weit vergrößerte Fließtext wirkte auf VanVans /* Auf Wunsch: der site-weit vergrößerte Fließtext wirkte auf VanVans
eigener Seite zu groß (viel Text am Stück) — hier gezielt wieder eigener Seite zu groß (viel Text am Stück) — hier gezielt wieder
@@ -175,7 +175,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-vanvan.js?v=20260821r"></script> <script src="assets/js/i18n-vanvan.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+11 -11
View File
@@ -19,10 +19,10 @@
<link rel="apple-touch-icon" href="assets/img/apple-touch-icon-admin.png" /> <link rel="apple-touch-icon" href="assets/img/apple-touch-icon-admin.png" />
<meta name="apple-mobile-web-app-title" content="DogiCrew-Verwaltung" /> <meta name="apple-mobile-web-app-title" content="DogiCrew-Verwaltung" />
<meta name="theme-color" content="#0e0a16" /> <meta name="theme-color" content="#0e0a16" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
<style> <style>
/* ===================================================================== /* =====================================================================
verwaltung.html — Dogis privater Command-Center-Bereich. verwaltung.html — Dogis privater Command-Center-Bereich.
@@ -1232,13 +1232,13 @@
<!-- 21.08.2026: für den "Bestehende Mitglieder importieren"-Knopf in der <!-- 21.08.2026: für den "Bestehende Mitglieder importieren"-Knopf in der
Team-Verwaltung -- liest die von Hand gepflegten Profile aus diesen Team-Verwaltung -- liest die von Hand gepflegten Profile aus diesen
Dateien aus und bietet an, sie 1:1 in die Datenbank zu übernehmen. --> Dateien aus und bietet an, sie 1:1 in die Datenbank zu übernehmen. -->
<script src="assets/js/data-modis.js?v=20260821r"></script> <script src="assets/js/data-modis.js?v=20260821s"></script>
<script src="assets/js/data-scouts.js?v=20260821r"></script> <script src="assets/js/data-scouts.js?v=20260821s"></script>
<script src="assets/js/data-creator.js?v=20260821r"></script> <script src="assets/js/data-creator.js?v=20260821s"></script>
<script src="assets/js/data-manager.js?v=20260821r"></script> <script src="assets/js/data-manager.js?v=20260821s"></script>
<script src="assets/js/data-stimmen-avatare.js?v=20260821r"></script> <script src="assets/js/data-stimmen-avatare.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script src="assets/js/admin-auth.js?v=20260821r"></script> <script src="assets/js/admin-auth.js?v=20260821s"></script>
<script> <script>
(function () { (function () {
const API_BASE_URL = "https://postfach.dogfather-universe.com"; const API_BASE_URL = "https://postfach.dogfather-universe.com";
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Werte, nach denen DogFather als Manager bei Spicy Media arbeitet." /> <meta name="twitter:description" content="Die Werte, nach denen DogFather als Manager bei Spicy Media arbeitet." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-werte.jpg');--page-bg-mobile:url('/assets/img/bg-werte-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-werte.jpg');--page-bg-mobile:url('/assets/img/bg-werte-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -113,7 +113,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-werte.js?v=20260821r"></script> <script src="assets/js/i18n-werte.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Geschichte von DogFather in einer interaktiven Zeitleiste." /> <meta name="twitter:description" content="Die Geschichte von DogFather in einer interaktiven Zeitleiste." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/main.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821s" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821r" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821s" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-zeitreise.jpg');--page-bg-mobile:url('/assets/img/bg-zeitreise-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-zeitreise.jpg');--page-bg-mobile:url('/assets/img/bg-zeitreise-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -237,8 +237,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-zeitreise.js?v=20260821r"></script> <script src="assets/js/i18n-zeitreise.js?v=20260821s"></script>
<script src="assets/js/main.js?v=20260821r"></script> <script src="assets/js/main.js?v=20260821s"></script>
<script> <script>
/* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt /* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt
zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft