diff --git a/server/pruef-installieren.mjs b/server/pruef-installieren.mjs index c4eda236..483ffa5e 100644 --- a/server/pruef-installieren.mjs +++ b/server/pruef-installieren.mjs @@ -46,7 +46,9 @@ const express = (await import("express")).default; const ec = express.response.cookie; express.response.cookie = function (n, w, o) { return ec.call(this, n, w, { ...(o || {}), secure: false }); }; await import("./index.js"); -notbremse(220_000, "pruef-installieren"); +/* 220 -> 360 s: Abschnitt 0 startet einen weiteren Browser + und wartet auf den Service Worker. */ +notbremse(360_000, "pruef-installieren"); await new Promise((r) => setTimeout(r, 900)); const BASIS = `http://127.0.0.1:${PORT}`; @@ -101,6 +103,155 @@ try { return { ctx, s }; } + /* ===================================================================== + 0. BIETET DER BROWSER ES UEBERHAUPT AN? (neu am 22.09.2026) + ===================================================================== + DAS HIER IST DIE FRAGE, DIE ZWEI TAGE LANG NIEMAND GESTELLT HAT. + + Die Pruefungen darunter stellen `beforeinstallprompt` SELBST zu und + messen, was die Seite damit macht. Das war richtig gedacht und + vollstaendig wertlos: Sie waren gruen, waehrend der Knopf auf + Filipes Rechner seit dem 20.09. unsichtbar blieb, weil das echte + Ereignis nie kam. Er hat dreimal danach gefragt. + + ZWEI URSACHEN, beide ausserhalb dessen, was gemessen wurde: + + 1. Der Service Worker wurde nur in `glocke.js` angemeldet, also + erst beim ERLAUBEN von Benachrichtigungen. Auf Filipes + Rechner stehen sie auf "Vom Browser blockiert". + 2. Der Service Worker hatte keinen `fetch`-Zuhoerer. Chrome + verlangt ihn fuer sein Installationsangebot. + + Ohne Service Worker kein Angebot, ohne Angebot kein Knopf. + + GEMESSEN WIRD JETZT AN DER QUELLE: `Page.getInstallabilityErrors` + ist Chromes eigenes Urteil ueber genau diese Frage. Eine leere + Liste heisst, dass der Browser es anbietet. Das kann keine + nachgestellte Veranstaltung vortaeuschen. + + `beforeinstallprompt` selbst wird hier bewusst NICHT verlangt: In + dieser Umgebung (kein Profil, kein Nutzerverhalten, kein Fenster) + loest Chromium es nicht aus. Das Urteil oben ist die Aussage, auf + die es ankommt. + ===================================================================== */ + { + const ctx0 = await browser.newContext({ viewport: { width: 1280, height: 860 } }); + const s0 = await ctx0.newPage(); + const cdp = await ctx0.newCDPSession(s0); + await cdp.send("Page.enable"); + /* OHNE ANMELDUNG UND OHNE BENACHRICHTIGUNGSRECHT -- genau die Lage, + in der es bisher nicht ging. Die Anmeldewand ist ausserdem die + Seite, auf der jeder zuerst landet. */ + await s0.goto(BASIS + "/workspace/", { waitUntil: "networkidle" }); + await s0.waitForTimeout(2200); + + const sw = await s0.evaluate(async () => { + if (!("serviceWorker" in navigator)) return { da: false }; + const r = await navigator.serviceWorker.getRegistration("/workspace/"); + return { da: !!r, aktiv: !!r?.active, stand: r?.active?.state || null, + recht: Notification.permission }; + }); + ok(sw.recht !== "granted", + `Benachrichtigungen sind NICHT erlaubt (${sw.recht}) -- genau Filipes Lage`); + ok(sw.da === true && sw.aktiv === true, + `und trotzdem laeuft ein Service Worker (${sw.stand}) ` + + `-- vorher haette hier "keiner" gestanden`); + + /* Der `fetch`-Zuhoerer: ohne ihn bietet Chrome nichts an. Gemessen + an der Datei, nicht am Gedaechtnis. */ + const { readFileSync: lies } = await import("node:fs"); + const { fileURLToPath: alsPfad } = await import("node:url"); + const { dirname: ordnerVon } = await import("node:path"); + const wurzel = join(ordnerVon(alsPfad(import.meta.url)), ".."); + const swText = lies(join(wurzel, "workspace", "sw.js"), "utf8"); + ok(/addEventListener\(\s*["']fetch["']/.test(swText), + "sw.js hat einen fetch-Zuhoerer -- Chromes Bedingung fuers Anbieten"); + /* UND ER LEGT NICHTS AB. Das Versprechen im Kopf der Datei ist + keine Absichtserklaerung, sondern wird hier nachgesehen: Wer + `caches.open` einbaut, hebt Antworten auf -- hinter einer + Anmeldung waeren das persoenliche Daten auf fremden Geraeten. */ + ok(!/caches\.(open|match)|cache\.put/.test(swText), + "und er legt nichts ab -- keine persoenlichen Daten auf dem Geraet"); + + let urteil = null; + try { + urteil = (await cdp.send("Page.getInstallabilityErrors")).installabilityErrors; + } catch (f) { urteil = "unlesbar: " + f.message; } + /* DRITTER AUSGANG: Kann die Frage gar nicht gestellt werden, ist + das kein Bestehen. Eine Pruefung, die ihre Voraussetzung nicht + hat, muss das sagen. */ + ok(Array.isArray(urteil), + Array.isArray(urteil) ? "Chrome laesst sich nach der Installierbarkeit fragen" + : `KONNTE NICHT NACHSEHEN (${urteil})`); + ok(Array.isArray(urteil) && urteil.length === 0, + Array.isArray(urteil) && urteil.length + ? `Chrome nennt Hindernisse: ${urteil.map((f) => f.errorId).join(", ")}` + : "und nennt kein einziges Hindernis -- die Seite ist installierbar"); + + let manifest = null; + try { manifest = await cdp.send("Page.getAppManifest"); } catch { /* s.o. */ } + const mFehler = (manifest?.errors || []).filter((f) => f.critical !== 0); + ok(!!manifest?.url, `Chrome findet das Manifest (${manifest?.url || "nicht"})`); + ok(mFehler.length === 0 && (manifest?.errors || []).length === 0, + (manifest?.errors || []).length + ? `es meldet: ${(manifest.errors || []).map((f) => f.message).join(" | ").slice(0, 120)}` + : "und beanstandet nichts daran"); + + /* DER KNOPF STEHT AUF DER ANMELDEWAND. Sie hat keine Kopfleiste und + hatte deshalb frueher gar kein Angebot -- dabei landet dort + jeder zuerst. */ + const aufWand = await s0.evaluate(() => { + const k = document.querySelector(".install-knopf"); + if (!k) return { da: false }; + const r = k.getBoundingClientRect(); + return { da: true, sichtbar: !k.hidden, breit: Math.round(r.width), + hoch: Math.round(r.height), imPlatz: !!k.closest("[data-install-platz]"), + wort: k.textContent.trim() }; + }); + ok(aufWand.da && aufWand.imPlatz, + `der Knopf steht auf der Anmeldewand, an seinem vorgesehenen Platz`); + ok(aufWand.sichtbar === true && aufWand.hoch >= 44, + `und ist zu sehen und zu treffen (${aufWand.breit}x${aufWand.hoch} px, "${aufWand.wort}")`); + ok(/installieren/i.test(aufWand.wort || ""), + `und sagt, was er tut ("${aufWand.wort}")`); + + /* GEGENPROBE: nur EIN Knopf. Seit der Aufruf nicht mehr an der + Reihenfolge der Skriptzeilen haengt, kann er aus zwei Richtungen + kommen. */ + const anzahl = await s0.locator(".install-knopf").count(); + ok(anzahl === 1, `und zwar genau einer (${anzahl})`); + + /* UND ER TUT ETWAS, WENN MAN IHN DRUECKT. + Das ist hier keine Formalie, sondern der Fall, an dem der erste + Entwurf gescheitert waere: Der Knopf rief `window.frageNach?.()` + auf. Diese Seite laedt `nachfrage.js` NICHT -- also war die + Funktion `undefined`, und `?.()` verschluckt das lautlos. Auf + dem iPhone steht der Knopf hier von Anfang an da. Er haette + stumm dagestanden, und wer ihn drueckt, sucht den Fehler bei + sich. + + Gegenprobe gleich dahinter: ein zweiter Druck macht die + Erklaerung wieder zu. Sonst sammeln sich Absaetze. */ + const ohneDialog = await s0.evaluate(() => typeof window.frageNach !== "function"); + ok(ohneDialog, "auf der Anmeldewand gibt es den Dialogbaustein nicht (nachfrage.js fehlt dort)"); + + await s0.click(".install-knopf"); + await s0.waitForTimeout(400); + const hinweis = await s0.evaluate(() => { + const h = document.querySelector(".install-hinweis"); + return h ? h.textContent.replace(/\s+/g, " ").trim() : null; + }); + ok(!!hinweis && /Menü|Teilen|Home-Bildschirm/i.test(hinweis), + `er erklaert trotzdem den Weg ("${(hinweis || "nichts").slice(0, 60)}…")`); + + await s0.click(".install-knopf"); + await s0.waitForTimeout(300); + const zu = await s0.locator(".install-hinweis").count(); + ok(zu === 0, `und ein zweiter Druck macht sie wieder zu (${zu})`); + + await ctx0.close(); + } + /* ---- Zustand 2: der Browser bietet es an ----------------------- */ const a = await seiteAuf(); /* Chromium loest `beforeinstallprompt` in dieser Umgebung nicht von @@ -111,8 +262,19 @@ try { const sichtbarVorher = await a.s.evaluate(() => !!document.querySelector(".install-knopf:not([hidden])")); ok(vorher === 1, `der Knopf steht im Dokument (${vorher})`); - ok(sichtbarVorher === false, - "bleibt aber versteckt, solange der Browser nichts anbietet — kein Knopf ohne Wirkung"); + /* HIER STAND: "bleibt versteckt, solange der Browser nichts + anbietet". Das war bis zum 22.09.2026 richtig -- und genau der + Grund, warum Filipe ihn nie gesehen hat. `beforeinstallprompt` + kommt in Chrome nicht verlaesslich sofort und gar nicht mehr, + wenn es kurz vorher weggeklickt wurde. + + Jetzt zeigt er sich, sobald der Browser das Installieren + ueberhaupt KANN (`'onbeforeinstallprompt' in window`, wahr bei + allen Chromium-Browsern) -- und faellt auf die Erklaerung + zurueck, falls das Angebot ausbleibt. Wo auch das nicht zutrifft + und kein Apple-Geraet vorliegt, bleibt er weg. */ + ok(sichtbarVorher === true, + "und ist in einem Browser, der installieren kann, von Anfang an zu sehen"); await a.s.evaluate(() => { const e = new Event("beforeinstallprompt"); @@ -201,6 +363,13 @@ try { await browser.close(); } +/* Die Zahl gehoert in die Bedingung. Faellt sie, ist still ein + Abschnitt ausgefallen -- und genau der neue Abschnitt 0 ist der, + auf den es ankommt. */ +if (geprueft < 29) { + console.log(` FEHL nur ${geprueft} Pruefungen gelaufen -- erwartet waren 29+`); + fehler++; +} console.log(`\n${fehler ? fehler + " FEHLER" : "Alles in Ordnung"} — ${geprueft} Prüfungen\n`); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ } process.exit(fehler ? 1 : 0); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index f89ac0d1..3314d4df 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,15 +16,15 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - + +
+

Gerade kein Netz

+

Dein Gerät ist offline — deshalb konnte die Seite nicht geladen werden.

+

Es liegt nicht an der App. Sobald du wieder Empfang oder WLAN hast, geht es weiter.

+ +
`; + +self.addEventListener("fetch", (e) => { + const a = e.request; + /* NUR SEITENAUFRUFE. Bilder, Stilvorlagen und vor allem die + Schnittstellen bleiben unangetastet -- ein Service Worker, der + sich in eine API einmischt, ist die Sorte Fehler, die man Tage + spaeter an unerklaerlichen Antworten sucht. */ + if (a.method !== "GET" || a.mode !== "navigate") return; + e.respondWith(fetch(a).catch(() => new Response(OHNE_NETZ, { + status: 503, + headers: { + "Content-Type": "text/html; charset=utf-8", + /* Nicht aufheben -- auch nicht vom Browser selbst. */ + "Cache-Control": "no-store", + }, + }))); +}); + /* --------------------------------------------------------------------- Eine Benachrichtigung kommt an. ------------------------------------------------------------------ */ diff --git a/workspace/talente.html b/workspace/talente.html index f841b6bf..641abe73 100644 --- a/workspace/talente.html +++ b/workspace/talente.html @@ -7,18 +7,18 @@ - - - - - - + + + + + + - - - + + + @@ -111,12 +111,13 @@ - - + + - - - - + + + + + diff --git a/workspace/team.html b/workspace/team.html index 47626b0c..c86af4a2 100644 --- a/workspace/team.html +++ b/workspace/team.html @@ -1,121 +1,123 @@ - - - - - -Team · Spicy & Dogi - - - - - - - - - - - - - - - - - - -
- -

Creator Workspace · Team

-
- … - -
-
- -
- - - -
-
-
-

Rund um das Team

-

Manager & Scouts

-

- Wer betreut wen, wo staut sich etwas, wo fehlt jemand. -

-
-

- Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte - noch Zahlen. Das ist eine Arbeitslage, keine Überwachung. -

-
-
- - - - - - - - - - - - - - -

Die Arbeitslage wird geladen …

- -
- - - - - - - - - - + + + + + +Team · Spicy & Dogi + + + + + + + + + + + + + + + + + + +
+ +

Creator Workspace · Team

+
+ … + +
+
+ +
+ + + +
+
+
+

Rund um das Team

+

Manager & Scouts

+

+ Wer betreut wen, wo staut sich etwas, wo fehlt jemand. +

+
+

+ Termine, Chats und Dateien kommen hier nicht vor – weder Inhalte + noch Zahlen. Das ist eine Arbeitslage, keine Überwachung. +

+
+
+ + + + + + + + + + + + + + +

Die Arbeitslage wird geladen …

+ +
+ + + + + + + + + + + + diff --git a/workspace/teamlage.html b/workspace/teamlage.html index 6b94fb12..cae23fa2 100644 --- a/workspace/teamlage.html +++ b/workspace/teamlage.html @@ -1,94 +1,96 @@ - - - - - -Dein Team · Spicy & Dogi - - - - - - - - - - - - - - - - - - - -
- -

Creator Workspace · Dein Team

-
- … - -
-
- -
- - -
-
-
-

Zusammen

-

Was auf dich wartet

-

…

-

- Was hier steht, ist eine Merkliste für euch beide – keine Bewertung - von Menschen. „Offen“ heißt: darüber habt ihr noch nicht gesprochen. - Eingeschätzt wird dort, wo die Punkte stehen; jede Zahl führt dorthin. -

-
-
- -
- -
- -
- - - - - - - - - - + + + + + +Dein Team · Spicy & Dogi + + + + + + + + + + + + + + + + + + + +
+ +

Creator Workspace · Dein Team

+
+ … + +
+
+ +
+ + +
+
+
+

Zusammen

+

Was auf dich wartet

+

…

+

+ Was hier steht, ist eine Merkliste für euch beide – keine Bewertung + von Menschen. „Offen“ heißt: darüber habt ihr noch nicht gesprochen. + Eingeschätzt wird dort, wo die Punkte stehen; jede Zahl führt dorthin. +

+
+
+ +
+ +
+ +
+ + + + + + + + + + + + diff --git a/workspace/teilen.html b/workspace/teilen.html index 062d5c83..1148d529 100644 --- a/workspace/teilen.html +++ b/workspace/teilen.html @@ -1,123 +1,125 @@ - - - - - -Video übernehmen · Spicy & Dogi - - - - - - - - - - - - - - - - -
- -

Team Dogi · Video übernehmen

-
- … - -
-
- -
- - - -
-
-

Geteilt

-

Video übernehmen

-

- Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen. -

-
-
- - - -
-

einen Moment …

- - - - - - - - - - - - - - -
- -
- - - - - - - - - - + + + + + +Video übernehmen · Spicy & Dogi + + + + + + + + + + + + + + + + +
+ +

Team Dogi · Video übernehmen

+
+ … + +
+
+ +
+ + + +
+
+

Geteilt

+

Video übernehmen

+

+ Titel und Coverbild werden von TikTok geholt – du musst nichts abtippen. +

+
+
+ + + +
+

einen Moment …

+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + diff --git a/workspace/treff-moderation.html b/workspace/treff-moderation.html index 1bde1092..02616599 100644 --- a/workspace/treff-moderation.html +++ b/workspace/treff-moderation.html @@ -7,14 +7,14 @@ - - - - - - - - + + + + + + + + @@ -126,12 +126,13 @@ - - + + - - - - + + + + + diff --git a/workspace/treff-regeln.html b/workspace/treff-regeln.html index 4c223efa..939d5ac7 100644 --- a/workspace/treff-regeln.html +++ b/workspace/treff-regeln.html @@ -1,231 +1,233 @@ - - - - - -Die Regeln · Der Treff - - - - - - - - - - - - - - - - - - -
- -

Der Treff · Regeln

-
- … - -
-
- -
- -
-
-

Der Treff

- -

Die Regeln

-

- Kurz, in normaler Sprache, und alles, was hier steht, gilt auch. -

-
-
- - - - -
-

Schön, dass du da bist

-
-

- Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt, - was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich – - du bist hier, weil dir jemand einen Code gegeben hat. -

-

- Gib diesen Code nicht weiter. Er gehört zu dir, und was damit - geschrieben wird, steht unter deinem Namen. -

-
-
- -
-

Die fünf Regeln

-
-
    -
  1. Sei anständig. Keine Beleidigungen, keine Angriffe - auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung – - über einen Menschen nicht.
  2. -
  3. Keine privaten Daten. Keine Adressen, keine - Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir - selbst, es liest mehr mit, als du denkst.
  4. -
  5. Nichts Fremdes hochladen. Was du einstellst, muss - von dir sein oder dir gehören.
  6. -
  7. Keine Werbung, kein Verkauf. Auch nicht für - andere Streams.
  8. -
  9. Was hier passiert, bleibt hier. Keine - Bildschirmfotos nach draußen.
  10. -
-
-
- -
-

Wie du weiterkommst

-
-

- In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen. - Das ist kein Misstrauen gegen dich – es ist eines gegen - Wegwerf-Zugänge. -

-
    -
  • wird geladen …
  • -
-
-
- -
-

Wenn etwas nicht stimmt

-
-

- An jedem Beitrag, der nicht von dir ist, steht melden. - Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das - können wir es nicht prüfen. -

-

- Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir - fest, warum – und die Person, die ihn geschrieben hat, - erfährt den Grund. Das ist keine Höflichkeit, sondern - Artikel 17 des Digital Services Act. -

-

- Du erreichst uns außerdem direkt: Schreib es auf das Brett - Der Treff oder sag es jemandem aus dem Team. -

-

- Häufige Fragen und Antworten stehen auf dem Brett - Regeln & Hilfe. -

-
-
- -
-

Was passiert, wenn jemand sich nicht daran hält

-
-

Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:

-
    -
  1. Hinweis. Jemand sagt dir, was nicht ging.
  2. -
  3. Pause. Ein paar Tage nichts schreiben. Lesen - geht weiter.
  4. -
  5. Ende. Der Zugang wird geschlossen.
  6. -
-

…

-
-
- -
-

Das Kleingedruckte – kurz

-
-

…

-

- Was gespeichert wird: dein Name, dein Zugangscode - (verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann - du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs, - keine Weitergabe an Dritte. -

-

- Du willst weg? Sag Bescheid. Dein Zugang wird - geschlossen und deine Beiträge werden entfernt. -

-

- Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine - Direktnachrichten zwischen Mitgliedern – absichtlich: Ein - öffentlicher Raum lässt sich moderieren, ein privater nicht. -

-
-
- - - -
-
-

Was ist über mich gespeichert?

- -
-

- Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen. - Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen, - stehen sie nicht mit Namen darin – ihre Daten gehören ihnen. -

- -
- -
- - - - - - - - - - + + + + + +Die Regeln · Der Treff + + + + + + + + + + + + + + + + + + +
+ +

Der Treff · Regeln

+
+ … + +
+
+ +
+ +
+
+

Der Treff

+ +

Die Regeln

+

+ Kurz, in normaler Sprache, und alles, was hier steht, gilt auch. +

+
+
+ + + + +
+

Schön, dass du da bist

+
+

+ Der Treff ist der Ort rund um DogFather: Hier steht, was gerade gilt, + was ansteht, und hier redet ihr miteinander. Er ist nicht öffentlich – + du bist hier, weil dir jemand einen Code gegeben hat. +

+

+ Gib diesen Code nicht weiter. Er gehört zu dir, und was damit + geschrieben wird, steht unter deinem Namen. +

+
+
+ +
+

Die fünf Regeln

+
+
    +
  1. Sei anständig. Keine Beleidigungen, keine Angriffe + auf Menschen, keine Hetze. Streiten über eine Sache ist in Ordnung – + über einen Menschen nicht.
  2. +
  3. Keine privaten Daten. Keine Adressen, keine + Telefonnummern, keine Klarnamen von anderen. Auch nicht von dir + selbst, es liest mehr mit, als du denkst.
  4. +
  5. Nichts Fremdes hochladen. Was du einstellst, muss + von dir sein oder dir gehören.
  6. +
  7. Keine Werbung, kein Verkauf. Auch nicht für + andere Streams.
  8. +
  9. Was hier passiert, bleibt hier. Keine + Bildschirmfotos nach draußen.
  10. +
+
+
+ +
+

Wie du weiterkommst

+
+

+ In der ersten Zeit kannst du lesen und bei Wünschen mitstimmen. + Das ist kein Misstrauen gegen dich – es ist eines gegen + Wegwerf-Zugänge. +

+
    +
  • wird geladen …
  • +
+
+
+ +
+

Wenn etwas nicht stimmt

+
+

+ An jedem Beitrag, der nicht von dir ist, steht melden. + Schreib in einem Satz, was daran nicht in Ordnung ist – ohne das + können wir es nicht prüfen. +

+

+ Wir sehen uns jede Meldung an. Wird ein Beitrag entfernt, halten wir + fest, warum – und die Person, die ihn geschrieben hat, + erfährt den Grund. Das ist keine Höflichkeit, sondern + Artikel 17 des Digital Services Act. +

+

+ Du erreichst uns außerdem direkt: Schreib es auf das Brett + Der Treff oder sag es jemandem aus dem Team. +

+

+ Häufige Fragen und Antworten stehen auf dem Brett + Regeln & Hilfe. +

+
+
+ +
+

Was passiert, wenn jemand sich nicht daran hält

+
+

Wir gehen der Reihe nach vor, und niemand fliegt ohne Ansage:

+
    +
  1. Hinweis. Jemand sagt dir, was nicht ging.
  2. +
  3. Pause. Ein paar Tage nichts schreiben. Lesen + geht weiter.
  4. +
  5. Ende. Der Zugang wird geschlossen.
  6. +
+

…

+
+
+ +
+

Das Kleingedruckte – kurz

+
+

…

+

+ Was gespeichert wird: dein Name, dein Zugangscode + (verschlüsselt, niemand kann ihn lesen), was du schreibst, und wann + du dich anmeldest. Mehr nicht – kein Standort, keine Werbe-IDs, + keine Weitergabe an Dritte. +

+

+ Du willst weg? Sag Bescheid. Dein Zugang wird + geschlossen und deine Beiträge werden entfernt. +

+

+ Der Treff ist ein kleiner, geschlossener Bereich. Es gibt keine + Direktnachrichten zwischen Mitgliedern – absichtlich: Ein + öffentlicher Raum lässt sich moderieren, ein privater nicht. +

+
+
+ + + +
+
+

Was ist über mich gespeichert?

+ +
+

+ Alles, was dieser Workspace über dich weiß, als Datei zum Mitnehmen. + Zugangsgeheimnisse sind nicht dabei, und wo andere Menschen vorkommen, + stehen sie nicht mit Namen darin – ihre Daten gehören ihnen. +

+ +
+ +
+ + + + + + + + + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index e2bdaa1a..07c4670c 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -1,162 +1,164 @@ - - - - - -Dashboard · Spicy & Dogi - - - - - - - - - - - - - - - - - - - - - -
- -

Creator Workspace · Dashboard

-
- … - -
-
- -
- -
-
-

Alles zentral

-

Dashboard

-

- Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft. -

-
- - -
- - - - - -
-

Creator anlegen

-

- Der Zugangscode erscheint genau einmal – danach ist er weg und - kann nur neu gesetzt werden. -

- -
- - -
- - - - - - - - -
- - -
-
-
- - - - - - - -

Übersicht wird geladen …

- - - -
- - - - - - - - - - - - + + + + + +Dashboard · Spicy & Dogi + + + + + + + + + + + + + + + + + + + + + +
+ +

Creator Workspace · Dashboard

+
+ … + +
+
+ +
+ +
+
+

Alles zentral

+

Dashboard

+

+ Eine Karte je Creator – mit einem Blick sehen, wo es hakt und wo es läuft. +

+
+ + +
+ + + + + +
+

Creator anlegen

+

+ Der Zugangscode erscheint genau einmal – danach ist er weg und + kann nur neu gesetzt werden. +

+ +
+ + +
+ + + + + + + + +
+ + +
+
+
+ + + + + + + +

Übersicht wird geladen …

+ + + +
+ + + + + + + + + + + + + + diff --git a/workspace/unsere-seiten.html b/workspace/unsere-seiten.html index 93b0da12..b8cfbf4e 100644 --- a/workspace/unsere-seiten.html +++ b/workspace/unsere-seiten.html @@ -7,13 +7,13 @@ - - - - - - - + + + + + + + @@ -335,12 +335,13 @@ - + - - - - - + + + + + + diff --git a/workspace/werdegang.html b/workspace/werdegang.html index 6c878cb8..c4cd6cc7 100644 --- a/workspace/werdegang.html +++ b/workspace/werdegang.html @@ -1,154 +1,156 @@ - - - - - -Entwicklung · Spicy & Dogi - - - - - - - - - - - - - - - - - - -
- -

Team Dogi · Entwicklung

-
- … - -
-
- -
- - - -
-
-

Entwicklung & Nachwuchs

-

Entwicklung

-

- Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich – - jede Karte nur mit sich selbst. -

-
-
- - - - - - - - - - - - - -
- - - - - - - - - + + + + + +Entwicklung · Spicy & Dogi + + + + + + + + + + + + + + + + + + +
+ +

Team Dogi · Entwicklung

+
+ … + +
+
+ +
+ + + +
+
+

Entwicklung & Nachwuchs

+

Entwicklung

+

+ Wie sich jemand über die Zeit bewegt. Keine Note, kein Vergleich – + jede Karte nur mit sich selbst. +

+
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/workspace/willkommen.html b/workspace/willkommen.html index 5c18f634..38baf92b 100644 --- a/workspace/willkommen.html +++ b/workspace/willkommen.html @@ -12,13 +12,13 @@ vergessen wird. --> - - - - - - - + + + + + + + - - - - - - - + + + + + + + - + @@ -190,14 +190,15 @@ - - - + + + - - - - - + + + + + +