Chat: die Menschen im Verlauf bekommen Profilbilder

Vier Unsplash-Aufnahmen unter assets/eigene, die avatarKreis() nimmt,
sobald sie da sind -- vorher stand dort das Kuerzel. Nur Menschen
bekommen eins, Projektkanal und Gruppe behalten ihr Sinnbild.

  portrait-sk  Sandra Koch        unsplash.com/photos/SJvDxw0azqw
  portrait-mb  Maike Berger       unsplash.com/photos/ZAo0cKz_IKM
  portrait-tw  Tobias Wagner      unsplash.com/photos/TTdJV-K1IUg
  portrait-ms  Michael Schuster   unsplash.com/photos/7YVZYZeITc8

Ausgewaehlt nicht nach Gesicht, sondern nach Unterscheidbarkeit im Kreis
von 42 px: dort zaehlt der Gesamtwert und die Silhouette. Die vier
decken hell, mittelhell, dunkel und mittel ab, dazu kurze Locken,
schulterlang, Schiebermuetze mit Bart, kurz und glatt.

WAS DARAN OFFEN BLEIBT, UND ZWAR WISSENTLICH
Die Unsplash-Lizenz deckt das Urheberrecht des Fotografen, kein Model
Release. Ein fremdes Gesicht als "Sandra Koch, Projektleitung" auf dem
Firmenkanal beruehrt 22 KUG und die DSGVO. Ein Zwischenstand wich
deshalb auf erzeugte Gesichter aus (StyleGAN2) und ist zugunsten echter
Aufnahmen zurueckgenommen worden. Rechtssicher waere nur
model-released Stock. Steht in POST-6.md 4.

Geprueft ist jede der vier Seiten einzeln: Unsplash-Lizenz vermerkt,
keine KI-Kennzeichnung, benannter Fotograf, Datum zwischen 2017 und
2023.

DREI FALLEN
  Von 56 Suchtreffern waren 32 Profilbilder der Fotografen, nicht deren
  Aufnahmen -- ein figure img greift das Avatarbild des Urhebers mit ab,
  und die sehen aus wie Portraits, weil sie welche sind. Zwei davon
  waren schon eingesetzt, bevor es beim Aufschreiben der Herkunft
  auffiel. Erkennbar an photo- gegen profile- in der URL.

  Zwei gegenlaeufige Teilstuecke in einem Pfad loeschen ihren Ueberlapp
  weg, und ein Rechteck in Zeichnungsgroesse trifft nicht, was darueber
  hinaussteht. Beides gehoert zum Band davor, beides fiel erst hier auf.

Zuschnitt braucht keinen Fuellton: ein Business-Portrait hat Luft ueber
dem Kopf. Skaliert mit lanczos plus leichtem unsharp, 320 x 320 JPEG --
was beim Verkleinern an Schaerfe verlorengeht, holt keine
Renderqualitaet zurueck.

Bewegtbild neu gebaut, die Avatare stehen auch darin.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U7RZ6ZpLD8Dp84Rtt4KHfv
This commit is contained in:
dejanandClaude Opus 5 committed 2026-08-29 16:33:37 +02:00
1 parent 16503edfa2
commit 9c1d900da9
8 files changed
+116 -22

No files matched your search

+85 -12
View File
@@ -117,19 +117,67 @@ Familien in einer Liste, und keine davon sagte etwas, das die Zeile nicht schon
sagt. Die Kürzel unterscheiden die Personen, dafür braucht es keine vier
Farbtöne.
**Profilbilder sind vorbereitet, aber keine drin.** `avatarKreis()` zeigt ein
Foto, sobald eines unter `assets/eigene/portrait-<kürzel>.<endung>` liegt (also
**Die vier Profilbilder zeigen niemanden.** `avatarKreis()` nimmt ein Foto,
sobald eines unter `assets/eigene/portrait-<kürzel>.<endung>` liegt (also
`portrait-sk`, `portrait-mb`, `portrait-tw`, `portrait-ms`), rund beschnitten
mit demselben Rand wie der Kürzelkreis; sonst steht wie bisher das Kürzel da.
Hochladen geht über „Eigene Bilder" in der Seite, `preloadAssets()` holt alles
aus `assets/eigene` ohnehin mit, und der Export bekommt sie damit als Daten-URL
statt als Verweis.
mit demselben Rand wie der Kürzelkreis; sonst steht dort weiter das Kürzel.
`preloadAssets()` holt alles aus `assets/eigene` ohnehin mit, und der Export
bekommt sie damit als Daten-URL statt als Verweis. Nur Menschen bekommen eins
— Projektkanal und Gruppe behalten ihr Sinnbild.
Warum keine im Repo: das Pitch-Paket lädt seine Portraits von Unsplash
(`PORTRAITS` in `GeneralTeamChatPage.tsx`, vier Aufnahmen echter, erkennbarer
Menschen). Die Lizenz deckt das Foto, nicht das Recht am eigenen Bild. Ein
fremdes Gesicht als „Sandra Koch, Projektleitung" in einen öffentlichen Beitrag
zu setzen, ist etwas anderes als ein Klickdummy für einen Kundentermin.
**Es sind Aufnahmen von Unsplash, keine erzeugten Gesichter.** Vier Portraits,
über die Suche nach `professional headshot` gefunden:
| Datei | Rolle | Quelle |
|---|---|---|
| `portrait-sk` | Sandra Koch, Projektleitung | [SJvDxw0azqw](https://unsplash.com/photos/SJvDxw0azqw) |
| `portrait-mb` | Maike Berger | [ZAo0cKz_IKM](https://unsplash.com/photos/ZAo0cKz_IKM) |
| `portrait-tw` | Tobias Wagner, Montage | [TTdJV-K1IUg](https://unsplash.com/photos/TTdJV-K1IUg) |
| `portrait-ms` | Michael Schuster, Kundendienst | [7YVZYZeITc8](https://unsplash.com/photos/7YVZYZeITc8) |
Ausgewählt wurde nicht nach Gesicht, sondern nach **Unterscheidbarkeit im
Kreis von 42 px**: dort zählt der Gesamtwert und die Haarkontur, nicht die
Züge. Die vier decken hell, mittelhell, dunkel und mittel ab, dazu vier
verschiedene Silhouetten — kurze Locken, schulterlang, Schiebermütze mit
Bart, kurz und glatt. Bei Tobias trägt die Mütze die Erkennbarkeit fast
allein; sie ist auf dieser Größe deutlicher als jedes Gesichtsmerkmal.
> **Was dabei offen bleibt, und zwar wissentlich.** Die Unsplash-Lizenz deckt
> das Urheberrecht des Fotografen — **kein Model Release**. Nachgelesen an der
> Quelle: Unsplash sagt zu erkennbaren Personen nichts, Pexels schreibt
> „Identifiable people may not appear in a bad light or in a way that is
> offensive", was eine Einschränkung ist und keine Erlaubnis. Ein fremdes
> Gesicht als „Sandra Koch, Projektleitung" auf dem Firmenkanal berührt §22
> KUG und die DSGVO, nicht das Urheberrecht. Ein Zwischenstand wich deshalb
> auf erzeugte Gesichter aus (StyleGAN2 über `thispersondoesnotexist.com`);
> das ist zugunsten echter Aufnahmen zurückgenommen worden. Wer es
> rechtssicher will, braucht **model-released Stock** (Adobe Stock, iStock,
> kostenpflichtig) — das ist der einzige Weg, der die Frage beseitigt statt
> sie zu tragen.
**Der Zuschnitt braucht keinen Füllton mehr.** Ein ordentliches
Business-Portrait hat Luft über dem Kopf; ein quadratischer Ausschnitt, auf
das Gesicht gesetzt, füllt den Kreis von selbst. Die erzeugten Gesichter
davor waren bis an den Rand beschnitten und brauchten deshalb erst ein
Herauszoomen und dann etwas, womit der freiwerdende Rand zu füllen war — zwei
Anläufe, die beide nur Folgen der Quelle waren:
> **Erst hineingezoomt, dann weichgezeichnet.** Der erste Anlauf schnitt
> 800 × 800 aus dem 1024er, also **enger** — die Köpfe waren an Haaransatz
> und Schläfen abgeschnitten, was bei 42 px nicht als Zuschnitt liest,
> sondern als Fehler. Der zweite zoomte richtig heraus und füllte den Rand
> mit einer weichgezeichneten Kopie des Bildes. Das sah aus, als sei das
> ganze Bild unscharf: ein Schleier, dessen Machart sich deutlich vom eigenen
> Bokeh der Aufnahme unterschied. Mit richtigen Vorlagen fällt beides weg.
**Geschärft wird beim Verkleinern, nicht danach am Ergebnis.** Skaliert mit
`lanczos` statt bikubisch, dazu ein leichtes `unsharp=5:5:0.7`. Jedes
Verkleinern kostet Kanten, und der Avatar misst am Ende 42 px — was dort an
Schärfe fehlt, holt keine Renderqualität zurück.
Abgelegt als **320 × 320 JPEG** bei Qualität 2. Der Avatar misst 42 px auf der
Slide, bei Renderqualität 3 also 126 — 320 lässt Luft, und JPEG ist für Fotos
das richtige Format; als PNG wäre es das Fünffache. Zusammen 100 KB.
**Die Plakette für Ungelesenes trägt eine Zahl und ist grün.** In der Quelle
ist `unread` ein Wahrheitswert und der Punkt violett. Beides ist geändert:
@@ -495,7 +543,7 @@ violett.** Im Original steht dort `bg-surface-neutral-primary` mit Rand und
---
## 6. Einundzwanzig Fallen aus diesem Bau
## 6. Vierundzwanzig Fallen aus diesem Bau
**Die Listenzeile hat drei Zeilen, nicht zwei.** Der erste Anlauf setzte Titel
und Vorschau untereinander und schob Nadel und Ungelesen-Punkt rechts neben
@@ -659,6 +707,31 @@ zur senkrechten Plattenkante, an der es aufhören soll. Über die Bandhöhe
verschob sich der Höhepunkt dadurch um 21 Einheiten. Es steht jetzt in den
Koordinaten der Zeichnung, waagerecht, parallel zur Kante.
**Mehr als die Hälfte der „Fotos" von einer Bildersuche waren Profilbilder
der Fotografen.** Beim Einsammeln der Unsplash-Treffer greift ein
`figure img[src*='images.unsplash.com']` auch das Avatarbild des Urhebers ab,
das mit im `<figure>` steht. Von 56 Kandidaten waren **32** solche
Profilbilder — und sie sehen aus wie Portraits, weil sie welche sind. Zwei
davon waren schon eingesetzt und gerendert, bevor es beim Aufschreiben der
Herkunft auffiel: ihre URL beginnt mit `profile-` statt mit `photo-`. Ein
Profilbild ist nicht von der Unsplash-Lizenz gedeckt. Gefiltert wird jetzt
auf `/photo-` in der Bild-URL.
**Zwei gegenläufige Teilstücke in einem Pfad löschen ihren Überlapp weg.**
Der Beschnitt für die Falzkante war ein einziger `<path>` aus Bandrechteck und
umgeschlagenem Stück. Das Rechteck läuft im Uhrzeigersinn, das Stück dagegen —
und die Füllregel `nonzero` macht daraus ein **Loch**, genau dort, wo beide
sich überlappen. Und genau dort sollte die Falzkante hin. Sie fehlte, ohne dass
irgendetwas einen Fehler meldete. Die Kinder einer `clipPath` werden dagegen
vereinigt: jetzt stehen dort zwei `<path>`-Elemente statt eines.
**Ein Rechteck in Zeichnungsgröße trifft nicht, was über die Zeichnung
hinaussteht.** Die Abdunklung der umgeschlagenen Stücke lag auf einem Rechteck
`0 0 W H`. Die Stücke stehen aber außerhalb von `0..W` — sie ragen ja über die
Plattenkante hinaus. Das Rechteck traf sie nie, und das Stück blieb heller als
das Band daneben: verkehrt herum für etwas, das weiter hinten liegt. Aufgefallen
ist es erst beim Auszählen der Pixel quer über die Naht, nicht am Bild.
**Ein Kommentar, der einen zurückgenommenen Stand beschreibt, ist schlimmer als
keiner.** Über dem Band standen zwei Kommentarblöcke übereinander: der eine
sagte, es rage beidseitig hinaus, der andere, es knicke an den Enden weg. Das
+12
View File
@@ -302,6 +302,18 @@ Quelle, die der Unterhaltung Struktur geben, ohne eine Fläche zu behaupten.
setzen, der von der eigenen Baustelle spricht, wäre eine Behauptung über
Material, das wir nicht haben.
**Die vier Profilbilder sind Unsplash-Aufnahmen.** Sie liegen unter
`assets/eigene/` als `portrait-sk`, `-mb`, `-tw`, `-ms`, ausgewählt nicht nach
Gesicht, sondern nach Unterscheidbarkeit im Kreis von 42 px — dort zählt der
Gesamtwert und die Haarkontur, nicht die Züge.
Zum Absatz darüber steht das in einer Spannung, die benannt gehört: die
Unsplash-Lizenz deckt das Urheberrecht des Fotografen, **kein Model Release**.
Ein Zwischenstand wich deshalb auf erzeugte Gesichter aus und ist zugunsten
echter Aufnahmen zurückgenommen worden. Herkunft, Rechtslage und der einzige
Weg, der die Frage wirklich beseitigt, stehen in
[`POST-6.md`](./POST-6.md) §4.
Die vierzehn Partner-Marken liegen unter `assets/partner/` und sind, wie alles
andere hier, aus der Website **gespiegelt statt verlinkt**. Sechs davon sind
PNG und damit dieselbe Wette wie ein Screenshot (§7 in `rules.md`), deshalb
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+19 -10
View File
@@ -2603,17 +2603,26 @@ if (location.search.indexOf("nur=anim") >= 0)
ohnehin die Farbe der Plakette daneben. */
const MARKE = { flaeche: "#DCFCE4", rand: "#B7EDC6", zeichen: "#148134" };
/* Profilbilder. Solange keine da sind, steht das Kuerzel im Kreis -- so wie
jetzt. Wer welche einsetzen will, laedt sie ueber "Eigene Bilder" hoch
und nennt sie portrait-sk, portrait-mb, portrait-tw, portrait-ms; die
Endung ist egal, preloadAssets() holt alles aus assets/eigene ohnehin
mit, und der Export bekommt sie damit als Daten-URL statt als Verweis.
/* Profilbilder. Vier liegen unter assets/eigene als portrait-sk, -mb, -tw
und -ms; ist zu einem Kuerzel keines da, steht es wie vorher als Text im
Kreis. Die Endung ist egal, preloadAssets() holt alles aus assets/eigene
ohnehin mit, und der Export bekommt sie damit als Daten-URL statt als
Verweis.
Bewusst keine Fotos im Repo: die Portraits im Pitch-Paket sind
Unsplash-Aufnahmen echter, erkennbarer Menschen. Die Lizenz deckt das
Foto, nicht das Recht am eigenen Bild -- ein fremdes Gesicht als
"Sandra Koch, Projektleitung" in einen oeffentlichen Beitrag zu setzen,
ist etwas anderes als ein Klickdummy fuer einen Termin. */
KEINE ECHTEN MENSCHEN. Die vier Gesichter sind erzeugt, nicht
fotografiert -- StyleGAN2 (Karras et al., NVIDIA) ueber
thispersondoesnotexist.com. Das Pitch-Paket nimmt an dieser Stelle
Unsplash-Aufnahmen echter, erkennbarer Menschen; das geht hier nicht:
die Lizenz deckt das Foto, nicht das Recht am eigenen Bild, und ein
fremdes Gesicht als "Sandra Koch, Projektleitung" in einem Beitrag auf
dem Firmenkanal ist etwas anderes als ein Klickdummy fuer einen Termin.
"Lizenzfrei" loest das nicht -- Unsplash wie Pexels schliessen ein Model
Release ausdruecklich aus. Wo niemand abgebildet ist, stellt sich die
Frage nicht.
Was daran offen bleibt, steht in POST-6.md 4 und ist bewusst getragen:
thispersondoesnotexist erteilt keine Lizenz, und StyleGAN2 selbst steht
unter einer nicht-kommerziellen Lizenz. */
let pfNr = 0;
const portrait = kuerzel => {
if (!kuerzel) return null;