diff --git a/assets/img/wd-projekt-safeaddress.jpg b/assets/img/wd-projekt-safeaddress.jpg
new file mode 100644
index 00000000..bf061e41
Binary files /dev/null and b/assets/img/wd-projekt-safeaddress.jpg differ
diff --git a/assets/js/i18n-wd-portfolio.js b/assets/js/i18n-wd-portfolio.js
index 3f220804..e83c54f3 100644
--- a/assets/js/i18n-wd-portfolio.js
+++ b/assets/js/i18n-wd-portfolio.js
@@ -26,19 +26,26 @@ window.I18N_WD = {
},
pf_eyebrow: { de: "Portfolio", "de-CH": "Portfolio", en: "Portfolio", fr: "Portfolio", pt: "Portfólio" },
+ /* "die es wirklich gibt" statt "die man anfassen kann" (26.08.2026).
+
+ Mit SafeAddress steht hier erstmals ein Projekt, das man NICHT
+ besuchen kann -- es ist bis zur anwaltlichen Freigabe vollstaendig
+ gesperrt. Die alte Ueberschrift haette damit ein Versprechen
+ gegeben, das eine der sechs Kacheln nicht einloest. Lieber eine
+ Ueberschrift, die fuer alle sechs stimmt. */
pf_h1: {
- de: "Fünf Projekte, die man anfassen kann",
- "de-CH": "Föif Projekt, wo mer aalange cha",
- en: "Five projects you can actually visit",
- fr: "Cinq projets que l'on peut réellement visiter",
- pt: "Cinco projetos que se podem mesmo visitar",
+ de: "Sechs Projekte, die es wirklich gibt",
+ "de-CH": "Sächs Projekt, wo s würklich git",
+ en: "Six projects that genuinely exist",
+ fr: "Six projets qui existent vraiment",
+ pt: "Seis projetos que existem mesmo",
},
pf_lead: {
- de: "Jede dieser Seiten läuft wirklich, unter ihrer eigenen Adresse. Die Vorschaubilder sind echte Aufnahmen der laufenden Seiten — keine gezeichneten Entwürfe. Wo eine Aufnahme bearbeitet ist, steht der Grund beim Projekt dabei.",
- "de-CH": "Jedi vo dene Site lauft würklich, under ihrer eigene Adress. D Vorschaubilder sind ächti Ufnahme vo de laufende Site — kei zeichneti Entwürf. Wo en Ufnahm bearbeitet isch, staht de Grund bim Projekt debii.",
- en: "Every one of these sites is genuinely running, at its own address. The preview images are real captures of the live sites — not drawn mockups. Where a capture has been edited, the reason is given with the project.",
- fr: "Chacun de ces sites fonctionne réellement, à sa propre adresse. Les aperçus sont de vraies captures des sites en ligne — pas des maquettes dessinées. Lorsqu'une capture a été retouchée, la raison est indiquée avec le projet.",
- pt: "Cada um destes sites está mesmo no ar, no seu próprio endereço. As pré-visualizações são capturas reais dos sites ativos — não são maquetes desenhadas. Sempre que uma captura foi editada, o motivo é indicado junto ao projeto.",
+ de: "Jede dieser Seiten läuft wirklich, unter ihrer eigenen Adresse. Die Vorschaubilder sind echte Aufnahmen der laufenden Seiten — keine gezeichneten Entwürfe. Wo eine Aufnahme bearbeitet ist, steht der Grund beim Projekt dabei. Eine der Seiten ist bewusst gesperrt und lässt sich nicht besuchen; auch das steht dort.",
+ "de-CH": "Jedi vo dene Site lauft würklich, under ihrer eigene Adress. D Vorschaubilder sind ächti Ufnahme vo de laufende Site — kei zeichneti Entwürf. Wo en Ufnahm bearbeitet isch, staht de Grund bim Projekt debii. Ei Site isch bewusst gsperrt und cha mer nöd bsueche; au das staht det.",
+ en: "Every one of these sites is genuinely running, at its own address. The preview images are real captures of the live sites — not drawn mockups. Where a capture has been edited, the reason is given with the project. One of the sites is deliberately locked and cannot be visited; that is stated there too.",
+ fr: "Chacun de ces sites fonctionne réellement, à sa propre adresse. Les aperçus sont de vraies captures des sites en ligne — pas des maquettes dessinées. Lorsqu'une capture a été retouchée, la raison est indiquée avec le projet. L'un des sites est délibérément verrouillé et ne peut pas être visité ; cela y est également précisé.",
+ pt: "Cada um destes sites está mesmo no ar, no seu próprio endereço. As pré-visualizações são capturas reais dos sites ativos — não são maquetes desenhadas. Sempre que uma captura foi editada, o motivo é indicado junto ao projeto. Um dos sites está deliberadamente bloqueado e não pode ser visitado; isso também está lá indicado.",
},
/* Gemeinsame Beschriftungen — gleiches Format für jede Referenz */
@@ -307,12 +314,124 @@ window.I18N_WD = {
pt: "Os rostos da captura foram desfocados. O site pertence à equipa, não a mim — e ninguém consentiu que a sua imagem fosse mostrada aqui.",
},
+ /* ---------------- Projekt 6: Spicy SafeAddress ----------------
+
+ Beim Formulieren wurde eine Vorgabe des Projekts selbst uebernommen:
+ In seiner Dokumentation steht ausdruecklich, dass die Wendung
+ "100 Prozent rechtssicher" dort nirgends verwendet wird. Ein
+ Portfolio, das mehr verspricht als die Sache selbst, waere genau der
+ Fehler, den das Projekt vermeiden will. Deshalb steht im Ergebnis,
+ dass die Plattform gesperrt ist und auf eine anwaltliche Freigabe
+ wartet -- und nicht, dass sie "im Einsatz" sei. */
+ p6_h2: {
+ de: "Spicy SafeAddress", "de-CH": "Spicy SafeAddress",
+ en: "Spicy SafeAddress", fr: "Spicy SafeAddress", pt: "Spicy SafeAddress",
+ },
+ p6_art: {
+ de: "Rechtsplattform",
+ "de-CH": "Rächtsplattform",
+ en: "Legal platform",
+ fr: "Plateforme juridique",
+ pt: "Plataforma jurídica",
+ },
+ p6_alt: {
+ de: "Zugangswand von safeaddress.dogfather-universe.com, die Gesichter sind zum Schutz der Beteiligten unkenntlich gemacht",
+ "de-CH": "Zuegangswand vo safeaddress.dogfather-universe.com, d Gsichter sind zum Schutz vo de Beteiligte unkenntlich gmacht",
+ en: "Access gate of safeaddress.dogfather-universe.com, faces obscured to protect those involved",
+ fr: "Page d'accès de safeaddress.dogfather-universe.com, les visages sont floutés pour protéger les personnes concernées",
+ pt: "Página de acesso de safeaddress.dogfather-universe.com, os rostos foram desfocados para proteger os envolvidos",
+ },
+ p6_ausgang: {
+ de: "Wer im Netz etwas anbietet, muss im Impressum eine Anschrift angeben, an die Post zugestellt werden kann. Für Creator ist das die eigene Wohnadresse — und die steht damit für jeden lesbar im Netz.",
+ "de-CH": "Wer im Netz öppis aabietet, mues im Impressum e Adress aagee, wo mer Poscht cha häre schicke. Für Creator isch das di eigeni Wohnadress — und die staht denn für jede läsbar im Netz.",
+ en: "Anyone offering something online must state an address in the legal notice where mail can be delivered. For creators that is their home address — and it is then readable by anyone online.",
+ fr: "Toute personne qui propose quelque chose en ligne doit indiquer dans ses mentions légales une adresse où le courrier peut être remis. Pour les créateurs, c'est leur adresse privée — et elle devient alors lisible par tout le monde.",
+ pt: "Quem oferece algo online tem de indicar no aviso legal uma morada onde possa receber correio. Para os criadores é a morada da própria casa — e fica assim legível para qualquer pessoa.",
+ },
+ p6_loesung: {
+ de: "Eine Plattform, die eine Anschrift für das Impressum bereitstellt, die eingehende Post ordnet und die Wohnadresse getrennt davon unter Verschluss hält.",
+ "de-CH": "E Plattform, wo e Adress fürs Impressum zur Verfüegig stellt, di iigehendi Poscht ornet und d Wohnadress trennt dervo under Verschluss hebt.",
+ en: "A platform that provides an address for the legal notice, sorts incoming mail, and keeps the home address locked away separately from it.",
+ fr: "Une plateforme qui fournit une adresse pour les mentions légales, trie le courrier entrant et conserve l'adresse privée sous clé, séparément.",
+ pt: "Uma plataforma que disponibiliza uma morada para o aviso legal, organiza o correio recebido e mantém a morada de casa guardada em separado.",
+ },
+ p6_ergebnis: {
+ de: "Fertig gebaut und bewusst noch vollständig gesperrt. Sie geht erst dann online, wenn eine deutsche Fachkanzlei Betreiber, Standort, Verträge und den Postablauf schriftlich freigegeben hat.",
+ "de-CH": "Fertig baut und bewusst no ganz gsperrt. Si gaht erscht denn online, wenn e tüütschi Fachkanzlei Betriiber, Standort, Verträg und de Poschtablauf schriftlich freigee hät.",
+ en: "Built and deliberately still fully locked. It will only go online once a German specialist law firm has approved the operator, location, contracts and mail process in writing.",
+ fr: "Terminée et volontairement encore entièrement verrouillée. Elle ne sera mise en ligne qu'une fois qu'un cabinet d'avocats allemand aura validé par écrit l'exploitant, le site, les contrats et le circuit du courrier.",
+ pt: "Concluída e deliberadamente ainda totalmente bloqueada. Só entra online quando um escritório de advogados alemão especializado aprovar por escrito o operador, o local, os contratos e o circuito do correio.",
+ },
+ p6_f1: {
+ de: "Die Wohnadresse liegt in einer eigenen Tabelle — keine Liste, keine Suche und kein Export kann sie versehentlich mitnehmen",
+ "de-CH": "D Wohnadress liit in ere eigene Tabälle — kei Lischte, kei Suech und kein Export cha si us Versehe mitnee",
+ en: "The home address sits in a table of its own — no list, no search and no export can take it along by accident",
+ fr: "L'adresse privée se trouve dans une table à part — aucune liste, aucune recherche et aucun export ne peut l'emporter par mégarde",
+ pt: "A morada de casa está numa tabela própria — nenhuma lista, pesquisa ou exportação a pode levar por engano",
+ },
+ p6_f2: {
+ de: "Die fachlichen Regeln stehen in der Datenbank, nicht nur im Formular: Ein Fehler in der Oberfläche kann sie nicht umgehen",
+ "de-CH": "D fachliche Rägle stönd i dr Datebank, nöd nur im Formular: E Fähler i dr Oberflächi cha si nöd umgah",
+ en: "The rules live in the database, not just in the form: a mistake in the interface cannot bypass them",
+ fr: "Les règles métier sont dans la base de données, pas seulement dans le formulaire : une erreur d'interface ne peut pas les contourner",
+ pt: "As regras estão na base de dados, não apenas no formulário: um erro na interface não as consegue contornar",
+ },
+ p6_f3: {
+ de: "Ein Protokoll, das sich nicht nachträglich ändern lässt — jede Manipulation fällt beim Prüfen auf",
+ "de-CH": "Es Protokoll, wo mer nachträglich nöd cha ändere — jedi Manipulation fallt bim Prüefe uf",
+ en: "A log that cannot be altered after the fact — any tampering shows up when it is checked",
+ fr: "Un journal qui ne peut pas être modifié après coup — toute manipulation se voit lors de la vérification",
+ pt: "Um registo que não pode ser alterado depois — qualquer manipulação aparece na verificação",
+ },
+ p6_f4: {
+ de: "Adressfelder werden einzeln verschlüsselt, mit einem eigenen Schlüssel",
+ "de-CH": "Adressfälder werdet einzeln verschlüsselet, mit eme eigene Schlüssel",
+ en: "Address fields are encrypted individually, with a key of their own",
+ fr: "Les champs d'adresse sont chiffrés un par un, avec une clé dédiée",
+ pt: "Os campos de morada são cifrados individualmente, com uma chave própria",
+ },
+ p6_f5: {
+ de: "Die Impressumsseiten kommen ohne JavaScript aus, denn sie müssen dauerhaft erreichbar sein",
+ "de-CH": "D Impressumssite chömed ohni JavaScript uus, well si duurhaft erreichbar si müend",
+ en: "The legal notice pages work without JavaScript, because they have to stay reachable at all times",
+ fr: "Les pages de mentions légales fonctionnent sans JavaScript, car elles doivent rester accessibles en permanence",
+ pt: "As páginas do aviso legal funcionam sem JavaScript, porque têm de estar sempre acessíveis",
+ },
+ p6_stil: {
+ de: "Sehr dunkel, mit einem einzigen kräftigen Rot, das sparsam eingesetzt wird. Kein Countdown und kein Plätze-Zähler — Druck als Verkaufsmittel ist hier ausdrücklich ausgeschlossen.",
+ "de-CH": "Sehr dunkel, mit eim einzige chräftige Rot, wo sparsam iigsetzt wird. Kei Countdown und kei Plätz-Zähler — Druck als Verchaufsmittel isch do uusdrücklich uusgschlosse.",
+ en: "Very dark, with a single strong red used sparingly. No countdown and no seats-left counter — pressure as a sales tool is expressly ruled out here.",
+ fr: "Très sombre, avec un seul rouge intense utilisé avec parcimonie. Pas de compte à rebours ni de compteur de places — la pression comme argument de vente est ici expressément exclue.",
+ pt: "Muito escuro, com um único vermelho forte usado com parcimónia. Sem contagem decrescente e sem contador de vagas — a pressão como argumento de venda está aqui expressamente excluída.",
+ },
+ p6_hinweis_h3: {
+ de: "Zum Vorschaubild", "de-CH": "Zum Vorschaubild",
+ en: "About the preview image", fr: "À propos de l'aperçu", pt: "Sobre a imagem de pré-visualização",
+ },
+ p6_hinweis: {
+ de: "Die Gesichter auf der Aufnahme sind unkenntlich gemacht. Auf der Seite arbeiten zwei Menschen zusammen, und niemand hat zugestimmt, sein Bild hier zu zeigen.",
+ "de-CH": "D Gsichter uf de Ufnahm sind unkenntlich gmacht. Uf dr Site schaffed zwöi Mönsche zäme, und niemert hät zuegstimmt, sis Bild do z zeige.",
+ en: "The faces in the capture have been obscured. Two people work together on that site, and nobody agreed to have their picture shown here.",
+ fr: "Les visages de la capture ont été floutés. Deux personnes travaillent ensemble sur ce site, et personne n'a consenti à ce que son image figure ici.",
+ pt: "Os rostos da captura foram desfocados. Duas pessoas trabalham juntas nesse site, e ninguém consentiu que a sua imagem fosse mostrada aqui.",
+ },
+ p6_kein_link: {
+ de: "Diese Seite lässt sich nicht ansehen: Sie ist vollständig gesperrt und zeigt nach außen nur die Zugangswand.",
+ "de-CH": "Die Site cha mer nöd aaluege: Si isch ganz gsperrt und zeigt nach usse nur d Zuegangswand.",
+ en: "This site cannot be viewed: it is fully locked and shows nothing but the access gate to the outside.",
+ fr: "Ce site ne peut pas être consulté : il est entièrement verrouillé et ne montre vers l'extérieur que la page d'accès.",
+ pt: "Este site não pode ser visto: está totalmente bloqueado e mostra para fora apenas a página de acesso.",
+ },
+
+ /* Die Zahl im Schlussaufruf wird leicht uebersehen: Sie zaehlt die
+ Projekte oben mit. Bei sechs Projekten waere "das sechste" das
+ Angebot, eines der bestehenden zu ersetzen. */
pf_cta_h2: {
- de: "Soll deins das sechste sein?",
- "de-CH": "Söll dis s sächste si?",
- en: "Shall yours be the sixth?",
- fr: "Le tien sera-t-il le sixième ?",
- pt: "O teu vai ser o sexto?",
+ de: "Soll deins das siebte sein?",
+ "de-CH": "Söll dis s sibte si?",
+ en: "Shall yours be the seventh?",
+ fr: "Le tien sera-t-il le septième ?",
+ pt: "O teu vai ser o sétimo?",
},
pf_cta_p: {
de: "Ob dein Projekt hier später auftaucht, entscheidest ausschließlich du — die Aufnahme ins Portfolio ist von der Veröffentlichung deiner Seite getrennt und braucht deine ausdrückliche Erlaubnis.",
diff --git a/pruef-portfolio-computer.png b/pruef-portfolio-computer.png
index 2712e7c7..24e4a4dc 100644
Binary files a/pruef-portfolio-computer.png and b/pruef-portfolio-computer.png differ
diff --git a/pruef-portfolio-handy.png b/pruef-portfolio-handy.png
index 874cd278..f7715e5f 100644
Binary files a/pruef-portfolio-handy.png and b/pruef-portfolio-handy.png differ
diff --git a/pruef-portfolio.mjs b/pruef-portfolio.mjs
index 2ddeace9..672ddb38 100644
--- a/pruef-portfolio.mjs
+++ b/pruef-portfolio.mjs
@@ -74,7 +74,7 @@ srv.listen(4403, async () => {
});
await seite.waitForTimeout(1200);
- console.log("1. SIND ALLE FUENF PROJEKTE DA?");
+ console.log("1. SIND ALLE SECHS PROJEKTE DA?");
const projekte = await seite.evaluate(() =>
[...document.querySelectorAll(".pfo-projekt")].map((a) => ({
titel: a.querySelector("h2")?.textContent.trim(),
@@ -82,7 +82,7 @@ srv.listen(4403, async () => {
geladen: a.querySelector("img")?.naturalWidth > 0,
link: a.querySelector("a[href^='http']")?.href || null,
})));
- pruefe("fuenf Projekte auf der Seite", projekte.length === 5, String(projekte.length));
+ pruefe("sechs Projekte auf der Seite", projekte.length === 6, String(projekte.length));
for (const p of projekte) {
pruefe(` ${p.titel}: Vorschaubild geladen`, p.geladen, p.bild);
}
@@ -225,7 +225,22 @@ srv.listen(4403, async () => {
const treffer = [];
for (const [k, v] of Object.entries(t)) {
for (const [s, txt] of Object.entries(v)) {
- if (/\b(Zwei|Two|Deux|Dois|Beide|Both|Ambos)\b/i.test(txt)) treffer.push(k + "/" + s);
+ /* Gesucht ist die veraltete AUSSAGE "es gibt zwei Projekte",
+ nicht jedes Vorkommen des Zahlworts.
+
+ Ohne den Bezug auf Projekt/Seite schlug der Test bei einem
+ Satz an, der voellig richtig von zwei MENSCHEN sprach
+ (p6_hinweis, 26.08.2026). Solche Fehlalarme sind gefaehrlich:
+ Sie verleiten beim naechsten Mal dazu, den Test einfach
+ abzuschalten -- und dann faengt er auch den echten Fall nicht
+ mehr. */
+ /* Hoechstens EIN Wort dazwischen ("zwei echte Projekte"), sonst
+ faengt das Muster Saetze, die etwas voellig anderes sagen:
+ "Two people work together on that site" enthaelt beide Woerter
+ und meint zwei MENSCHEN. */
+ const veraltet =
+ /\b(zwei|two|deux|dois|beide|both|ambos)\b(\s+\w+)?\s+\b(projekt|projekte|projects|project|projets|projet|projetos|projeto|seiten|sites|site|referenzen)\b/i;
+ if (veraltet.test(txt)) treffer.push(k + "/" + s);
}
}
return treffer;
diff --git a/webdesign/portfolio.html b/webdesign/portfolio.html
index fa3a97f1..78bd1ea0 100644
--- a/webdesign/portfolio.html
+++ b/webdesign/portfolio.html
@@ -9,7 +9,7 @@
der Inhalt sonst installiert unter Uhr und Akkuanzeige. -->
Jede dieser Seiten läuft wirklich, unter ihrer eigenen Adresse. Die Vorschaubilder sind echte Aufnahmen der laufenden Seiten — keine gezeichneten Entwürfe. Wo eine Aufnahme bearbeitet ist, steht der Grund beim Projekt dabei.
+
Sechs Projekte, die es wirklich gibt
+
Jede dieser Seiten läuft wirklich, unter ihrer eigenen Adresse. Die Vorschaubilder sind echte Aufnahmen der laufenden Seiten — keine gezeichneten Entwürfe. Wo eine Aufnahme bearbeitet ist, steht der Grund beim Projekt dabei. Eine der Seiten ist bewusst gesperrt und lässt sich nicht besuchen; auch das steht dort.
@@ -414,6 +414,62 @@
+
+
+
+
+
+
Spicy SafeAddress
+ Rechtsplattform
+
+
+
+
Ausgangslage
+
Wer im Netz etwas anbietet, muss im Impressum eine Anschrift angeben, an die Post zugestellt werden kann. Für Creator ist das die eigene Wohnadresse — und die steht damit für jeden lesbar im Netz.
+
+
+
Umgesetzte Lösung
+
Eine Plattform, die eine Anschrift für das Impressum bereitstellt, die eingehende Post ordnet und die Wohnadresse getrennt davon unter Verschluss hält.
+
+
+
Ergebnis
+
Fertig gebaut und bewusst noch vollständig gesperrt. Sie geht erst dann online, wenn eine deutsche Fachkanzlei Betreiber, Standort, Verträge und den Postablauf schriftlich freigegeben hat.
+
+
+
+ Details ansehen
+
+
+
Wichtigste Funktionen
+
+
Die Wohnadresse liegt in einer eigenen Tabelle — keine Liste, keine Suche und kein Export kann sie versehentlich mitnehmen
+
Die fachlichen Regeln stehen in der Datenbank, nicht nur im Formular: Ein Fehler in der Oberfläche kann sie nicht umgehen
+
Ein Protokoll, das sich nicht nachträglich ändern lässt — jede Manipulation fällt beim Prüfen auf
+
Adressfelder werden einzeln verschlüsselt, mit einem eigenen Schlüssel
+
Die Impressumsseiten kommen ohne JavaScript aus, denn sie müssen dauerhaft erreichbar sein
+
+
+
+
Stilrichtung
+
Sehr dunkel, mit einem einzigen kräftigen Rot, das sparsam eingesetzt wird. Kein Countdown und kein Plätze-Zähler — Druck als Verkaufsmittel ist hier ausdrücklich ausgeschlossen.
+
+
+
+
Zum Vorschaubild
+
Die Gesichter auf der Aufnahme sind unkenntlich gemacht. Auf der Seite arbeiten zwei Menschen zusammen, und niemand hat zugestimmt, sein Bild hier zu zeigen.
+
+
+
+
+
+
Diese Seite lässt sich nicht ansehen: Sie ist vollständig gesperrt und zeigt nach außen nur die Zugangswand.
+
+
+
diff --git a/webdesign/sw.js b/webdesign/sw.js
index 1852de8e..07b26976 100644
--- a/webdesign/sw.js
+++ b/webdesign/sw.js
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */
-const CACHE_NAME = "dogfather-webdesign-v53";
+const CACHE_NAME = "dogfather-webdesign-v54";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */