Filipe (screen, Punkt 5): "du hast die bei der kategorie content-ideen
vergessen. und ich will dass du dich wirklich seeeehr krass informierst
ueber all diese kategorien in den 4 kategorien ... hol das beste vom
besten ... und dan perfektionnierst du diese kategorien bei anfaenger,
fortgeschrittene, profi und meister."
DER BEFUND, NACHGEZAEHLT
live 33 Punkte, 33 mit Stufe
community 23 Punkte, 23 mit Stufe
technik 19 Punkte, 19 mit Stufe <- sein Screenshot, 6/6/4/3
content 13 Punkte, 0 mit Stufe <- die Luecke
Die Stufenleiste erscheint nur, wenn mindestens ein Punkt eine Stufe
traegt. Bei den Content-Ideen trug keiner eine -- deshalb fehlte sie
dort, und nur dort. Nicht falsch, sondern FEHLEND: Die Seite sah
ueberall richtig aus, und aufgefallen ist es erst, als jemand alle vier
nebeneinander gesehen hat.
WAS JETZT DASTEHT
live 40 Punkte · 12 / 13 / 10 / 5
community 28 Punkte · 8 / 10 / 6 / 4
technik 26 Punkte · 7 / 9 / 6 / 4
content 28 Punkte · 10 / 9 / 6 / 3
zusammen 122 statt 88
Alle 13 vorhandenen Content-Ideen haben eine Stufe bekommen; 34 Punkte
sind neu. Kein bestehender Schluessel wurde geaendert -- an ihnen
haengen gespeicherte Bewertungen, und ein umbenannter Schluessel waere
eine stillschweigend geloeschte Beurteilung.
DIE RECHERCHE, UND WAS DAVON UEBRIG BLIEB
Zuerst die eigene Notiz im Vault (TikTok-LIVE-Algorithmus, Juli 2026),
dann fuenf gezielte Recherchen nach aussen. Aufgenommen wurde nur, was
NACHPRUEFBAR ist und was man am naechsten Abend anders machen kann:
- Ueber 70 Prozent entscheiden in den ersten zwei bis drei Sekunden.
Plattformen messen die "Intro-Retention" inzwischen ausdruecklich.
-> content: "Die erste Sekunde entscheidet" (profi)
- Ankuendigungsvideo 30 bis 60 Minuten vor dem LIVE buendelt den
Start; ein voller Start zieht neue nach.
-> live: "Ankuendigung kurz vorher" (fort)
-> content: "30 Minuten vorher" (anfaenger)
- Durchschnittliche Verweildauer ueber 15 Minuten gilt als Zeichen,
dass die Stimmung traegt. -> live: "Verweildauer abgelesen" (profi)
- Wiederkehr schlaegt Spitzenwert -- die Zahl, die man nicht faelschen
kann. -> live: "Wiederkehrer ueber vier Wochen" (meister)
- Ton: minus 20 bis minus 24 LUFS, Begrenzer bei minus 3, Tonspur
160 kbit/s, Mikrofon fuenf bis zehn Zentimeter leicht seitlich.
-> technik: vier neue Punkte, davon einer auf Profi
- Verworfene Bilder (Netz) und ausgelassene (Encoder) haben
verschiedene Ursachen. -> technik: "Netz oder Rechner unterschieden"
- Moderation: eine Ausnahmeliste erlaubter Woerter verhindert, dass
der Filter die Stammleute mitfaengt; Absprachen des Mod-Teams
gehoeren nicht in den oeffentlichen Chat.
-> community: zwei neue Punkte
- Beste Kurzformate 2026: Haken-zuerst, nummerierte Liste,
Vorher/Nachher, Selbstversuch, Vergleich.
-> content: fuenf neue Vorlagen mit ausformuliertem Aufhaenger
ZWEI WACHEN, DAMIT DIESE LUECKE NICHT WIEDERKOMMT
1. In den Daten: Jeder Punkt jedes Bereichs MUSS eine Stufe haben,
und alle vier Stufen muessen vorkommen. Mit zwei Gegenproben --
ein Punkt ohne Stufe und eine Liste mit nur einer Stufe muessen
beide auffallen.
2. Auf der Seite: Die Stufenleiste muss auf allen vier Seiten mit
fuenf Knoepfen dastehen ("Alle" plus vier Stufen). Die Zahl steht
jetzt in der Meldezeile, damit man sie nachlesen kann.
Die zweite braucht es zusaetzlich: "jeder Punkt hat eine Stufe" ist
nicht dasselbe wie "die Leiste ist zu sehen".
EIN EIGENER FEHLSCHLAG, FESTGEHALTEN
Zwischendurch habe ich die Content-Ideen ein zweites Mal zeichnen
lassen -- 6 Gruppen statt 3. Ich hatte nach `vorlagenBlock` gesucht,
nichts gefunden und daraus geschlossen, die Ideen wuerden nirgends
angezeigt. Tatsaechlich ruft content.js sie seit jeher auf (Zeile 427).
Eine plausible Herleitung statt einer Messung, genau die Sorte Fehler,
gegen die die Hausregel geschrieben ist. Zurueckgenommen; die Daten
allein waren die richtige Antwort.
Geprueft: pruef-checkliste (inkl. der neuen Wachen und Gegenproben),
pruef-content, pruef-css-klassen, pruef-buehne -- alle gruen.
Co-Authored-By: Claude Opus 5 <[email protected]>
526 lines
43 KiB
JavaScript
526 lines
43 KiB
JavaScript
/* =====================================================================
|
||
workspace-vorlagen.js — fertige Inhalte, die man übernehmen kann.
|
||
|
||
Der Wunsch vom 01.09.2026, an fünf Stellen gleichlautend: "ich will
|
||
dass da schon fertige Sachen stehen". Eine leere Seite mit einem
|
||
Knopf "Neuer Eintrag" verlangt vom Creator genau das, was er noch
|
||
nicht kann — zu wissen, was überhaupt hineingehört.
|
||
|
||
WARUM VORLAGEN UND KEINE VORAUSGEFÜLLTEN DATEN.
|
||
Man könnte beim Anlegen eines Creators dreißig Einträge in seine
|
||
Datenbank schreiben. Das wäre falsch:
|
||
* Sie wären ab dem ersten Tag "seine" Einträge -- und damit
|
||
Altlast, sobald sich etwas ändert.
|
||
* Ändert Filipe später eine Formulierung, gilt sie nur für neue
|
||
Creator. Die alten behalten die alte für immer.
|
||
* Und die Liste sähe voll aus, obwohl noch nichts geschehen ist --
|
||
genau das Gegenteil einer ehrlichen Übersicht.
|
||
|
||
Vorlagen bleiben deshalb VORSCHLÄGE, bis jemand sie übernimmt. Sie
|
||
stehen im Code, gelten für alle sofort, und werden erst dann zu Daten,
|
||
wenn sie tatsächlich gebraucht werden. Wer sie übernimmt, bekommt
|
||
einen ganz normalen Eintrag, den er ändern und löschen kann.
|
||
|
||
FACHLICHE GRUNDLAGE der Inhalte:
|
||
* Die ersten ein bis drei Sekunden eines Kurzvideos entscheiden über
|
||
die Verbreitung -- deshalb hat jede Content-Vorlage einen Hook,
|
||
und zwar als eigenes Feld.
|
||
* Ein LIVE steht und fällt mit dem, was VOR der Sendung passiert.
|
||
Deshalb sind die Vorbereitungspunkte die längste Liste.
|
||
* Was während der Sendung auffällt, ist am nächsten Tag vergessen.
|
||
Deshalb gibt es Punkte für "während LIVE", die man in Sekunden
|
||
anklicken kann, statt sie zu tippen.
|
||
* 70/20/10: etwa 70 % Inhalte mit Wert, 20 % Community, 10 %
|
||
Eigenwerbung. Die Content-Vorlagen sind danach verteilt.
|
||
===================================================================== */
|
||
|
||
import express from "express";
|
||
import {
|
||
db, sitzungLesen, istLeitung, darfCreator, protokolliere, echteIp,
|
||
} from "./workspace.js";
|
||
|
||
export const vorlagenRouter = express.Router();
|
||
|
||
const jetzt = () => new Date().toISOString();
|
||
|
||
/* Welche Bereiche haben Punktelisten? Eine Zuordnung statt drei
|
||
Sonderfaellen im Code. */
|
||
const BEREICH_PUNKTE = {};
|
||
|
||
/* =====================================================================
|
||
CONTENT-IDEEN
|
||
|
||
Jede Vorlage bringt mit, was ein Video braucht, bevor man es dreht:
|
||
einen Aufhänger, ein Format und die Säule, zu der es gehört. Der
|
||
Aufhänger ist ausformuliert, nicht beschrieben -- "mach was
|
||
Persönliches" hilft niemandem, "Das hätte ich am Anfang gern gewusst"
|
||
kann man sagen.
|
||
===================================================================== */
|
||
|
||
export const CONTENT_IDEEN = [
|
||
/* ---- Wert (70 %) ---------------------------------------------------- */
|
||
{ schluessel: "das-haette-ich-am-anfang-gern-gewusst", titel: "Das hätte ich am Anfang gern gewusst",
|
||
hook: "„Ich hab drei Monate gebraucht, um das zu kapieren – du brauchst 30 Sekunden.\"",
|
||
format: "Talking Head", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Ein Fehler, den du selbst gemacht hast, und was du heute anders machst. "
|
||
+ "Konkret bleiben: ein Fehler, eine Lösung. Wer drei Dinge sagt, sagt nichts." },
|
||
{ schluessel: "mein-setup-fuer-unter-100", titel: "Mein Setup für unter 100 €",
|
||
hook: "„Alle sagen, du brauchst teure Technik. Hier ist meins für 87 Euro.\"",
|
||
format: "Zeigen & Erklären", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Was du wirklich benutzt, mit Preisen. Ehrlich sein, wo es hakt – "
|
||
+ "das ist der Teil, den niemand sonst zeigt." },
|
||
{ schluessel: "drei-einstellungen-die-sofort-was-bringe", titel: "Drei Einstellungen, die sofort was bringen",
|
||
hook: "„Wenn dein Stream unscharf aussieht, liegt es an einer davon.\"",
|
||
format: "Bildschirmaufnahme", saeule: "Wert", stufe: "fort",
|
||
text: "Nicht mehr als drei. Jede in unter 15 Sekunden erklärt, mit Vorher/Nachher." },
|
||
{ schluessel: "was-ich-in-einer-woche-gelernt-habe", titel: "Was ich in einer Woche gelernt habe",
|
||
hook: "„Sieben Tage, eine Erkenntnis – die hier hat alles verändert.\"",
|
||
format: "Talking Head", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Rückblick auf eine echte Woche. Funktioniert nur mit einer konkreten Zahl "
|
||
+ "oder einem konkreten Moment." },
|
||
{ schluessel: "antwort-auf-die-frage-die-immer-kommt", titel: "Antwort auf die Frage, die immer kommt",
|
||
hook: "„Das werde ich jeden Tag gefragt – hier einmal in Ruhe.\"",
|
||
format: "Talking Head", saeule: "Wert", stufe: "fort",
|
||
text: "Aus dem Chat sammeln, welche Frage sich wiederholt. Die Antwort einmal "
|
||
+ "gut aufnehmen und immer wieder verwenden." },
|
||
{ schluessel: "so-bereite-ich-einen-stream-vor", titel: "So bereite ich einen Stream vor",
|
||
hook: "„Zwei Stunden vor LIVE mache ich immer dasselbe.\"",
|
||
format: "Vlog", saeule: "Wert", stufe: "fort",
|
||
text: "Der Ablauf hinter der Sendung. Zeigt Verlässlichkeit und gibt Anfängern "
|
||
+ "eine Vorlage." },
|
||
{ schluessel: "fehler-die-ich-bei-anderen-sehe", titel: "Fehler, die ich bei anderen sehe",
|
||
hook: "„Bitte mach das nicht – ich sehe es jeden Tag.\"",
|
||
format: "Talking Head", saeule: "Wert", stufe: "profi",
|
||
text: "Niemanden bloßstellen. Das Verhalten beschreiben, nicht die Person." },
|
||
|
||
/* ---- Community (20 %) ------------------------------------------------ */
|
||
{ schluessel: "der-beste-moment-aus-dem-letzten-live", titel: "Der beste Moment aus dem letzten LIVE",
|
||
hook: "„Das ist gestern passiert, und ich rede immer noch davon.\"",
|
||
format: "Zusammenschnitt", saeule: "Community", stufe: "anfaenger",
|
||
text: "Ein Ausschnitt, keine Zusammenfassung. Wer alles zeigt, zeigt nichts." },
|
||
{ schluessel: "ich-beantworte-eure-kommentare", titel: "Ich beantworte eure Kommentare",
|
||
hook: "„Ihr habt gefragt – jetzt rede ich.\"",
|
||
format: "Talking Head", saeule: "Community", stufe: "anfaenger",
|
||
text: "Drei bis fünf echte Kommentare, sichtbar eingeblendet. Auch die kritischen." },
|
||
{ schluessel: "danke-an-die-die-immer-da-sind", titel: "Danke an die, die immer da sind",
|
||
hook: "„Ihr seid seit dem ersten Stream dabei. Das hier ist für euch.\"",
|
||
format: "Talking Head", saeule: "Community", stufe: "fort",
|
||
text: "Namen nennen, wenn die Leute einverstanden sind. Sonst allgemein bleiben – "
|
||
+ "aber ehrlich." },
|
||
{ schluessel: "eine-entscheidung-bei-der-ihr-mitredet", titel: "Eine Entscheidung, bei der ihr mitredet",
|
||
hook: "„Ich kann mich nicht entscheiden. Ihr habt 24 Stunden.\"",
|
||
format: "Umfrage", saeule: "Community", stufe: "fort",
|
||
text: "Echte Wahl, keine Scheinfrage. Das Ergebnis danach auch wirklich umsetzen." },
|
||
|
||
/* ---- Eigenwerbung (10 %) --------------------------------------------- */
|
||
{ schluessel: "wann-und-wo-ich-streame", titel: "Wann und wo ich streame",
|
||
hook: "„Immer dienstags und donnerstags – und ich fange pünktlich an.\"",
|
||
format: "Kurzclip", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Fester Sendeplan als eigener Clip. Wiederholbar, sobald sich etwas ändert." },
|
||
{ schluessel: "was-diese-woche-ansteht", titel: "Was diese Woche ansteht",
|
||
hook: "„Drei Sachen, und eine davon habe ich noch nie gemacht.\"",
|
||
format: "Kurzclip", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Vorschau auf die Woche. Kurz halten, sonst wird es eine Ankündigung "
|
||
+ "statt einer Einladung." },
|
||
/* ---- Aus der Recherche vom 09.09.2026 -------------------------------
|
||
Filipe: "informier dich wirklich seeeehr krass ... hol das beste vom
|
||
besten." Diese fuenfzehn Vorlagen sind der Ertrag daraus. Was sie von
|
||
den ersten dreizehn unterscheidet: Sie haengen an einer NACHPRUEFBAREN
|
||
Beobachtung, nicht an einer Meinung.
|
||
|
||
Die wichtigsten Belege, die dahinterstehen:
|
||
- Ueber 70 Prozent der Zuschauer entscheiden in den ersten zwei bis
|
||
drei Sekunden, ob sie bleiben. Plattformen messen inzwischen
|
||
ausdruecklich die "Intro-Retention".
|
||
- Ein Ankuendigungsvideo 30 bis 60 Minuten vor dem LIVE buendelt den
|
||
Start -- und ein voller Start zieht neue Zuschauer nach.
|
||
- Die besten Kurzformate 2026 sind: Haken-zuerst-Erklaerung,
|
||
nummerierte Liste, Vorher/Nachher, POV-Geschichte, Vergleich.
|
||
- Wiederkehr schlaegt Spitzenwert: Eine Zahl, die man nicht
|
||
faelschen kann.
|
||
-------------------------------------------------------------------- */
|
||
|
||
/* ---- Wert (70 %) ---- */
|
||
{ schluessel: "vorher-nachher-an-meinem-kanal", titel: "Vorher / Nachher an meinem Kanal",
|
||
hook: "„So sah mein Stream vor drei Monaten aus. Und so heute.\"",
|
||
format: "Vorher / Nachher", saeule: "Wert", stufe: "anfaenger",
|
||
text: "Zwei Ausschnitte nebeneinander, dazwischen die eine Sache, die du geändert hast. "
|
||
+ "Das Format funktioniert, weil der Zuschauer den Unterschied SIEHT und nicht glauben muss." },
|
||
{ schluessel: "drei-sachen-die-dir-keiner-sagt", titel: "Drei Sachen, die dir keiner sagt",
|
||
hook: "„Drei Sachen über Streaming, die dir keiner sagt – die dritte hat mich am meisten gekostet.\"",
|
||
format: "Nummerierte Liste", saeule: "Wert", stufe: "fort",
|
||
text: "Eine Zahl im Aufhänger verspricht ein Ende – deshalb bleiben Leute dran. "
|
||
+ "Die stärkste Nummer kommt zuletzt, und sie wird im Aufhänger angekündigt." },
|
||
{ schluessel: "ich-teste-was-alle-empfehlen", titel: "Ich teste, was alle empfehlen",
|
||
hook: "„Jeder empfiehlt das. Ich habe es zwei Wochen gemacht – hier ist das Ergebnis.\"",
|
||
format: "Selbstversuch", saeule: "Wert", stufe: "fort",
|
||
text: "Ein verbreiteter Ratschlag, von dir selbst überprüft, mit Zahlen davor und danach. "
|
||
+ "Widerspruch zieht Aufmerksamkeit – aber nur, wenn du wirklich getestet hast." },
|
||
{ schluessel: "so-lese-ich-meine-zahlen", titel: "So lese ich meine Zahlen",
|
||
hook: "„Diese eine Zahl sagt mir mehr als die Zuschauerzahl.\"",
|
||
format: "Bildschirm & Erklären", saeule: "Wert", stufe: "profi",
|
||
text: "Zeig deine eigene Auswertung: durchschnittliche Verweildauer, Anteil neuer Zuschauer, "
|
||
+ "Wiederkehrer. Erklär, was du daraufhin geändert hast. Wenige machen das – deshalb wirkt es." },
|
||
{ schluessel: "die-erste-sekunde-entscheidet", titel: "Die erste Sekunde entscheidet",
|
||
hook: "„Sag das in Sekunde eins – oder der Zuschauer ist weg.\"",
|
||
format: "Zerlegung", saeule: "Wert", stufe: "profi",
|
||
text: "Nimm ein eigenes Video auseinander: Was hast du in Sekunde eins gesagt, was würdest du "
|
||
+ "heute sagen? Über 70 Prozent entscheiden in den ersten drei Sekunden. Zeig beides." },
|
||
{ schluessel: "mein-ablauf-als-vorlage", titel: "Mein Ablauf als Vorlage zum Mitnehmen",
|
||
hook: "„Hier ist der Ablauf, nach dem ich jeden Stream fahre. Nimm ihn.\"",
|
||
format: "Zeigen & Weitergeben", saeule: "Wert", stufe: "meister",
|
||
text: "Etwas herzugeben, das bei dir funktioniert, kostet nichts und bringt Vertrauen. "
|
||
+ "Meisterschaft zeigt sich daran, dass es auch ohne dich funktioniert." },
|
||
{ schluessel: "was-hundert-streams-mir-beigebracht-h", titel: "Was hundert Streams mir beigebracht haben",
|
||
hook: "„Hundert Streams. Drei Sachen sind übrig geblieben.\"",
|
||
format: "Rückblick", saeule: "Wert", stufe: "meister",
|
||
text: "Kein Best-of, sondern das, was du heute anders machst als am Anfang. "
|
||
+ "Wer lange dabei ist, hat den einen Vorteil, den niemand abkürzen kann." },
|
||
|
||
/* ---- Community (20 %) ---- */
|
||
{ schluessel: "ein-insider-den-nur-ihr-versteht", titel: "Ein Insider, den nur ihr versteht",
|
||
hook: "„Wenn du weißt, was das bedeutet, bist du schon länger dabei.\"",
|
||
format: "Kurzclip", saeule: "Community", stufe: "anfaenger",
|
||
text: "Ein Spruch, ein Emote, ein Moment aus dem Stream. Wer ihn versteht, fühlt sich zugehörig – "
|
||
+ "und wer nicht, will dazugehören. Beides hilft." },
|
||
{ schluessel: "eure-clips-mein-kommentar", titel: "Eure Clips, mein Kommentar",
|
||
hook: "„Ihr habt das aufgenommen. Ich sag euch, was da wirklich los war.\"",
|
||
format: "Reaction", saeule: "Community", stufe: "fort",
|
||
text: "Clips, die Zuschauer selbst geschnitten haben, mit deinem Kommentar. "
|
||
+ "Das belohnt die, die mitmachen – und wer belohnt wird, macht weiter." },
|
||
{ schluessel: "die-regel-die-ihr-euch-gewuenscht-hab", titel: "Die Regel, die ihr euch gewünscht habt",
|
||
hook: "„Ihr habt gefragt, ich habe es geändert. Ab heute gilt:\"",
|
||
format: "Talking Head", saeule: "Community", stufe: "profi",
|
||
text: "Eine Änderung, die aus der Community kam, mit Nennung derer, die sie angestoßen haben. "
|
||
+ "Mitreden zu dürfen ist der stärkste Grund zu bleiben." },
|
||
{ schluessel: "wir-machen-das-zusammen", titel: "Wir machen das zusammen",
|
||
hook: "„Wenn wir das diese Woche schaffen, mache ich Folgendes:\"",
|
||
format: "Gemeinsames Ziel", saeule: "Community", stufe: "profi",
|
||
text: "Ein Ziel mit Frist und einer Belohnung, die du wirklich einlöst. "
|
||
+ "Ein Versprechen, das nicht gehalten wird, kostet mehr als es gebracht hat." },
|
||
{ schluessel: "mein-moderator-stellt-sich-vor", titel: "Mein Moderator stellt sich vor",
|
||
hook: "„Ihr kennt den Namen. Hier ist der Mensch dahinter.\"",
|
||
format: "Interview", saeule: "Community", stufe: "meister",
|
||
text: "Wer im Chat für Ordnung sorgt, bekommt ein Gesicht. Das schützt ihn – "
|
||
+ "gegen einen Namen schimpft man leichter als gegen einen Menschen." },
|
||
|
||
/* ---- Eigenwerbung (10 %) ---- */
|
||
{ schluessel: "dreissig-minuten-vorher", titel: "30 Minuten vorher",
|
||
hook: "„In einer halben Stunde geht es los – und heute passiert Folgendes:\"",
|
||
format: "Ankündigung", saeule: "Eigenwerbung", stufe: "anfaenger",
|
||
text: "Ein kurzes Video 30 bis 60 Minuten vor dem Start. Es bündelt die, die ohnehin kommen "
|
||
+ "wollten – und ein voller Start zieht neue Zuschauer nach. Eine Sache nennen, nicht drei." },
|
||
{ schluessel: "warum-ich-heute-live-gehe", titel: "Warum ich heute live gehe",
|
||
hook: "„Heute ist ein Grund da, und der ist nicht ‚weil Dienstag ist‘.\"",
|
||
format: "Talking Head", saeule: "Eigenwerbung", stufe: "fort",
|
||
text: "Ein Anlass macht aus einem Termin ein Ereignis. Auch ein kleiner reicht: "
|
||
+ "ein neues Spiel, ein Gast, eine offene Frage von letzter Woche." },
|
||
{ schluessel: "mein-kanal-in-fuenfzehn-sekunden", titel: "Mein Kanal in fünfzehn Sekunden",
|
||
hook: "„Fünfzehn Sekunden, dann weißt du, ob das hier für dich ist.\"",
|
||
format: "Kurzvorstellung", saeule: "Eigenwerbung", stufe: "profi",
|
||
text: "Für wen, worum, wann. Fest angeheftet, damit neue Zuschauer nicht raten müssen. "
|
||
+ "Alle paar Monate neu drehen – ein Kanal von vor einem Jahr bist du nicht mehr." },
|
||
|
||
];
|
||
|
||
/* =====================================================================
|
||
LIVE-PUNKTE
|
||
|
||
Drei Listen entlang der Sendung. Die mittlere ist die wichtigste und
|
||
zugleich die, die es sonst nirgends gibt: Was während des Streams
|
||
auffällt, ist am nächsten Tag weg. Deshalb sind diese Punkte so
|
||
formuliert, dass man sie in einem Moment anklicken kann, in dem man
|
||
eigentlich keine Zeit hat.
|
||
|
||
===================================================================== */
|
||
|
||
export const LIVE_PUNKTE = {
|
||
vorbereitung: [
|
||
{ schluessel: "ton-geprueft", titel: "Ton geprüft", text: "Eine Minute aufnehmen und anhören. Ton ist der Grund Nummer eins, warum Leute wieder gehen.", stufe: "anfaenger" },
|
||
{ schluessel: "licht-sitzt", titel: "Licht sitzt", text: "Gesicht heller als der Hintergrund. Kein Fenster im Rücken.", stufe: "anfaenger" },
|
||
{ schluessel: "verbindung-getestet", titel: "Verbindung getestet", text: "Upload-Geschwindigkeit geprüft, Kabel statt WLAN wenn möglich.", stufe: "anfaenger" },
|
||
{ schluessel: "titel-und-thema-stehen", titel: "Titel und Thema stehen", text: "Wer den Titel liest, weiß, was ihn erwartet – und ob es für ihn ist.", stufe: "anfaenger" },
|
||
{ schluessel: "ablauf-grob-im-kopf", titel: "Ablauf grob im Kopf", text: "Drei Blöcke reichen. Ein Stream ohne roten Faden fühlt sich für Zuschauer wie Warten an.", stufe: "fort" },
|
||
{ schluessel: "angekuendigt", titel: "Angekündigt", text: "Mindestens einmal vorher gesagt, dass es losgeht – Story, Post oder Nachricht.", stufe: "fort" },
|
||
{ schluessel: "moderation-geklaert", titel: "Moderation geklärt", text: "Weiß jemand Bescheid, der eingreifen kann, wenn es im Chat kippt?", stufe: "fort" },
|
||
{ schluessel: "technik-ersatz-bereit", titel: "Technik-Ersatz bereit", text: "Was passiert, wenn der Stream abbricht? Handy als Notlösung bereitlegen.", stufe: "fort" },
|
||
{ schluessel: "upload-gemessen-bitrate-darunter", titel: "Upload gemessen, Bitrate darunter", text: "Vor der Sendung messen, nicht schaetzen. Video und Ton zusammen sollen hoechstens 70 bis 80 Prozent des gemessenen Uploads belegen -- der Rest ist der Puffer, der verworfene Bilder verhindert.", stufe: "profi" },
|
||
{ schluessel: "keyframe-alle-zwei-sekunden", titel: "Keyframe alle zwei Sekunden", text: "Der Abstand, in dem ein volles Bild geschickt wird. Zwei Sekunden ist keine Geschmacksfrage: Alles andere kann bei Zuschauern zu Puffern oder gar nicht erst zum Abspielen fuehren.", stufe: "profi" },
|
||
{ schluessel: "probelauf-privat-gestreamt", titel: "Probelauf privat gestreamt", text: "Nicht die Vorschau im Programm, sondern ein echter privater Stream. Erst der zeigt, was beim Zuschauer ankommt -- Ton, Bild, Verzoegerung, Verbindung.", stufe: "profi" },
|
||
{ schluessel: "die-ersten-dreissig-sekunden-stehen", titel: "Die ersten dreissig Sekunden stehen", text: "Wortwoertlich vorbereitet. In dieser halben Minute entscheidet sich, ob jemand bleibt, und genau dort improvisiert man am schlechtesten.", stufe: "profi" },
|
||
{ schluessel: "ausweichweg-laeuft-mit", titel: "Ausweichweg laeuft mit", text: "Zweites Geraet bereit und angemeldet, nicht nur daneben. Ein Ersatz, den man erst einrichten muss, ist im Moment des Ausfalls keiner.", stufe: "meister" },
|
||
{ schluessel: "ablauf-als-vorlage-nicht-als-zettel", titel: "Ablauf als Vorlage, nicht als Zettel", text: "Derselbe Aufbau jedes Mal, als Vorlage gespeichert. Was jedes Mal neu erfunden wird, wird jedes Mal anders gut.", stufe: "meister" },
|
||
{ schluessel: "ein-ziel-in-einer-zahl", titel: "Ein Ziel in einer Zahl", text: "Vorher festlegen, woran diese Sendung gemessen wird -- Verweildauer, Wiederkehrer, Kommentare. Ohne Zahl vorher ist die Auswertung danach eine Meinung.", stufe: "meister" }, /* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "ankuendigung-kurz-vorher", titel: "Ankündigung kurz vorher", text: "Ein kurzes Video 30 bis 60 Minuten vor dem Start. Es bündelt die, die ohnehin kommen wollten – und ein voller Start zieht neue nach.", stufe: "fort" },
|
||
{ schluessel: "sendeplan-steht-fest", titel: "Sendeplan steht fest", text: "Zwei feste Tage schlagen fünf zufällige. Wer weiß, wann du sendest, kommt wieder – und Wiederkehr ist das Signal, das man nicht fälschen kann.", stufe: "fort" },
|
||
|
||
],
|
||
mitschrift: [
|
||
{ schluessel: "guter-moment-aufheben", titel: "Guter Moment – aufheben", text: "Etwas ist gut gelaufen. Kurz notieren, woran es lag – daraus wird später ein Clip.", stufe: "anfaenger" },
|
||
{ schluessel: "hier-sind-leute-gegangen", titel: "Hier sind Leute gegangen", text: "Zeitpunkt merken. Später nachsehen, was in dem Moment passiert ist.", stufe: "fort" },
|
||
{ schluessel: "frage-aus-dem-chat-die-wiederkommt", titel: "Frage aus dem Chat, die wiederkommt", text: "Wird oft gefragt? Dann gehört sie in ein eigenes Video.", stufe: "fort" },
|
||
{ schluessel: "technik-hat-gehakt", titel: "Technik hat gehakt", text: "Ton weg, Bild eingefroren, Verzögerung – aufschreiben, solange man es noch weiß.", stufe: "anfaenger" },
|
||
{ schluessel: "unangenehme-situation-im-chat", titel: "Unangenehme Situation im Chat", text: "Was war es, wie ist es ausgegangen? Auch wenn es gut lief.", stufe: "fort" },
|
||
{ schluessel: "neue-zuschauer-aufgetaucht", titel: "Neue Zuschauer aufgetaucht", text: "Woher kamen sie? Wurde jemand begrüßt oder ging es unter?", stufe: "fort" },
|
||
{ schluessel: "ich-wusste-nicht-weiter", titel: "Ich wusste nicht weiter", text: "Stelle merken, an der es gestockt hat. Dafür gibt es Hilfe.", stufe: "anfaenger" },
|
||
{ schluessel: "zeitstempel-statt-gefuehl", titel: "Zeitstempel statt Gefuehl", text: "Die Minute notieren, nicht 'irgendwann in der Mitte'. Nur mit der Minute findet man die Stelle in der Aufzeichnung wieder.", stufe: "profi" },
|
||
{ schluessel: "chatverlauf-gesichert", titel: "Chatverlauf gesichert", text: "Vor dem Schliessen speichern. Er ist die einzige Quelle dafuer, was wirklich gesagt wurde -- und bei einem Vorfall die einzige, die zaehlt.", stufe: "profi" }, { schluessel: "namen-vorgelesen", titel: "Namen vorgelesen", text: "Neue in den ersten Minuten begrüßen, nicht erst wenn Zeit ist. Wer beim Namen genannt wird, bleibt spürbar länger.", stufe: "anfaenger" },
|
||
{ schluessel: "interaktion-eingefordert", titel: "Interaktion eingefordert", text: "Frage, Umfrage, Abstimmung. Ein Kommentar zählt mehr als stilles Zuschauen – und zieht den Stream zu neuen Leuten.", stufe: "fort" },
|
||
|
||
],
|
||
auswertung: [
|
||
{ schluessel: "was-hat-diesmal-getragen", titel: "Was hat diesmal getragen?", text: "Ein Ding. Nicht drei. Das eine, das man wiederholen will.", stufe: "anfaenger" },
|
||
{ schluessel: "was-war-zaeh", titel: "Was war zäh?", text: "Ehrlich sein. Die zähen Stellen sind die, an denen man wächst.", stufe: "anfaenger" },
|
||
{ schluessel: "zahlen-im-vergleich", titel: "Zahlen im Vergleich", text: "Zuschauer, Verweildauer, Kommentare – gegen das letzte Mal, nicht gegen andere.", stufe: "fort" },
|
||
{ schluessel: "clips-gesichert", titel: "Clips gesichert", text: "Die guten Momente rausgeschnitten und abgelegt, solange man sie noch findet.", stufe: "fort" },
|
||
{ schluessel: "eine-sache-fuer-naechstes-mal", titel: "Eine Sache für nächstes Mal", text: "Genau eine. Wer sich fünf Dinge vornimmt, macht keins davon.", stufe: "anfaenger" },
|
||
{ schluessel: "braucht-besprechung", titel: "Braucht Besprechung", text: "Etwas, das man nicht allein lösen kann – geht an die Betreuung.", stufe: "anfaenger" },
|
||
{ schluessel: "verweildauer-gegen-die-letzten-fuenf", titel: "Verweildauer gegen die letzten fuenf", text: "Nicht gegen das letzte Mal -- ein einzelner Vergleich ist Zufall. Fuenf Sendungen zeigen eine Richtung.", stufe: "profi" },
|
||
{ schluessel: "ein-versuch-eine-aenderung", titel: "Ein Versuch, eine Aenderung", text: "Wer Titel, Uhrzeit und Aufbau zugleich aendert, weiss hinterher nicht, was gewirkt hat. Eine Sache je Sendung.", stufe: "profi" },
|
||
{ schluessel: "erkenntnis-zurueck-in-die-vorlage", titel: "Erkenntnis zurueck in die Vorlage", text: "Was sich bewaehrt hat, wird Teil des Ablaufs -- sonst muss man es sich jedes Mal neu merken.", stufe: "meister" }, { schluessel: "verweildauer-abgelesen", titel: "Verweildauer abgelesen", text: "Über 15 Minuten im Schnitt heißt: Die Stimmung trägt. Darunter liegt es fast nie am Thema, sondern am Anfang.", stufe: "profi" },
|
||
{ schluessel: "anteil-neuer-zuschauer", titel: "Anteil neuer Zuschauer", text: "Wie viele waren noch nie da? Ohne neue wächst nichts, ohne alte trägt nichts. Beide Zahlen gehören nebeneinander.", stufe: "profi" },
|
||
{ schluessel: "wiederkehrer-ueber-vier-wochen", titel: "Wiederkehrer über vier Wochen", text: "Wie viele kommen ein zweites Mal? Diese eine Zahl sagt mehr über den Kanal als jeder Spitzenwert.", stufe: "meister" },
|
||
|
||
],
|
||
};
|
||
|
||
/* =====================================================================
|
||
CALL-LEITFÄDEN
|
||
|
||
Jeder Call endet mit To-dos -- das steht schon auf der Seite. Was
|
||
fehlte, ist der Weg dorthin. Diese Leitfäden sind bewusst kurz: Ein
|
||
Gespräch nach Fragebogen ist ein Verhör, kein Gespräch.
|
||
===================================================================== */
|
||
|
||
/* =====================================================================
|
||
COMMUNITY-PUNKTE
|
||
|
||
Moderation ist die Arbeit, die niemand sieht, solange sie
|
||
funktioniert. Die Punkte hier sind so gewaehlt, dass sie VOR dem
|
||
Ernstfall abgehakt werden koennen -- danach ist es zu spaet.
|
||
===================================================================== */
|
||
|
||
export const COMMUNITY_PUNKTE = {
|
||
moderation: [
|
||
{ schluessel: "regeln-stehen-sichtbar", titel: "Regeln stehen sichtbar", text: "Kurz, verstaendlich, an einer Stelle, die man findet. Drei Saetze reichen.", stufe: "anfaenger" },
|
||
{ schluessel: "jemand-kann-eingreifen", titel: "Jemand kann eingreifen", text: "Waehrend des Streams ist eine zweite Person mit Rechten da -- oder es ist klar, dass keine da ist.", stufe: "anfaenger" },
|
||
{ schluessel: "wortfilter-eingerichtet", titel: "Wortfilter eingerichtet", text: "Die offensichtlichen Sachen automatisch weg, damit man sich um den Rest kuemmern kann.", stufe: "fort" },
|
||
{ schluessel: "was-passiert-bei-einem-verstoss", titel: "Was passiert bei einem Verstoss?", text: "Verwarnen, stummschalten, sperren -- vorher entscheiden, nicht im Moment.", stufe: "fort" },
|
||
{ schluessel: "umgang-mit-minderjaehrigen", titel: "Umgang mit Minderjaehrigen", text: "Wie erkennt man sie, und was gilt dann? Das ist keine Ermessensfrage.", stufe: "anfaenger" },
|
||
{ schluessel: "eskalationsleiter-steht-schriftlich", titel: "Eskalationsleiter steht schriftlich", text: "Vier Stufen, in dieser Reihenfolge: ansprechen, Nachricht loeschen, kurze Auszeit, Sperre. Wer sie erst im Moment festlegt, entscheidet ungleich -- und Ungleichbehandlung ist das, was Communitys spaltet.", stufe: "profi" },
|
||
{ schluessel: "automatikfilter-stufe-begruendet", titel: "Automatikfilter: Stufe gewaehlt und begruendet", text: "Die Stufe des automatischen Filters ist eine Abwaegung, keine Voreinstellung: zu scharf loescht Harmloses, zu lasch laesst durch. Die Wahl gehoert aufgeschrieben.", stufe: "profi" },
|
||
{ schluessel: "wer-eskaliert-an-wen", titel: "Wer eskaliert an wen", text: "Ab wann entscheidet die Moderation nicht mehr selbst? Bei Bedrohung, Rechtsverstoss oder Unsicherheit geht es weiter -- und es muss klar sein, an wen.", stufe: "profi" },
|
||
{ schluessel: "moderatoren-eingewiesen-nicht-nur-ernannt", titel: "Moderatoren eingewiesen, nicht nur ernannt", text: "Rechte vergeben ist der kleinere Teil. Dazu gehoeren: die Regeln schriftlich, die Eskalationsleiter, die Werkzeuge einmal gezeigt.", stufe: "meister" },
|
||
{ schluessel: "ernstfall-einmal-geprobt", titel: "Ernstfall einmal geprobt", text: "Einmal durchspielen, wer was tut, wenn es kippt. Im Ernstfall zum ersten Mal darueber nachzudenken ist zu spaet.", stufe: "meister" }, /* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "erlaubte-woerter-gepflegt", titel: "Erlaubte Wörter gepflegt", text: "Der Filter fängt auch Wörter, die bei euch harmlos sind. Eine kurze Ausnahmeliste verhindert, dass die Stammleute verstummen.", stufe: "fort" },
|
||
{ schluessel: "eigener-kanal-fuers-mod-team", titel: "Eigener Kanal fürs Mod-Team", text: "Absprachen gehören nicht in den öffentlichen Chat. Ein eigener Raum, in dem gefragt werden darf, ohne dass alle mitlesen.", stufe: "profi" },
|
||
|
||
],
|
||
aktion: [
|
||
{ schluessel: "neue-begruessen", titel: "Neue begruessen", text: "Wer zum ersten Mal da ist, wird angesprochen. Kostet zwei Sekunden und entscheidet, ob jemand bleibt.", stufe: "anfaenger" },
|
||
{ schluessel: "stammleute-erkennen", titel: "Stammleute erkennen", text: "Namen merken oder notieren. Wiedererkannt zu werden ist der halbe Grund wiederzukommen.", stufe: "fort" },
|
||
{ schluessel: "etwas-geben-das-nur-hier-gibt", titel: "Etwas geben, das nur hier gibt", text: "Ein Insider, ein Ritual, ein Spitzname. Community entsteht aus Gemeinsamem.", stufe: "fort" },
|
||
{ schluessel: "ausserhalb-des-streams-antworten", titel: "Ausserhalb des Streams antworten", text: "Kommentare und Nachrichten -- die Community lebt auch zwischen den Sendungen.", stufe: "fort" },
|
||
{ schluessel: "wiederkehrende-rubrik-mit-festem-termin", titel: "Wiederkehrende Rubrik mit festem Termin", text: "Etwas, das immer am selben Tag stattfindet. Ein Termin, auf den man sich freuen kann, bindet staerker als guter Einzelinhalt.", stufe: "profi" },
|
||
{ schluessel: "uebergabe-an-einen-zweiten-geregelt", titel: "Uebergabe an einen Zweiten geregelt", text: "Was passiert mit der Community, wenn man zwei Wochen ausfaellt? Wer nicht ersetzbar ist, kann nicht krank werden.", stufe: "meister" }, { schluessel: "begruessung-in-den-ersten-minuten", titel: "Begrüßung in den ersten Minuten", text: "Nicht wenn Zeit ist, sondern sofort. Wer in der ersten Minute angesprochen wird, bleibt deutlich länger.", stufe: "anfaenger" },
|
||
{ schluessel: "ein-ritual-das-jeder-kennt", titel: "Ein Ritual, das jeder kennt", text: "Derselbe Einstieg, dieselbe Verabschiedung. Wiedererkennung ist der halbe Grund wiederzukommen.", stufe: "fort" },
|
||
|
||
],
|
||
konflikt: [
|
||
{ schluessel: "ruhig-bleiben-und-nicht-oeffentlich-stre", titel: "Ruhig bleiben und nicht oeffentlich streiten", text: "Im Chat gewinnt niemand. Kurz ansagen, dann privat klaeren.", stufe: "anfaenger" },
|
||
{ schluessel: "was-ist-genau-passiert", titel: "Was ist genau passiert?", text: "Zeitpunkt, Beteiligte, Wortlaut. Ohne das ist jede Entscheidung angreifbar.", stufe: "anfaenger" },
|
||
{ schluessel: "beweise-sichern", titel: "Beweise sichern", text: "Bildschirmfoto oder Ausschnitt, solange es noch da ist. Chats verschwinden.", stufe: "fort" },
|
||
{ schluessel: "betreuung-einbeziehen", titel: "Betreuung einbeziehen", text: "Bei allem, was groesser ist als ein blöder Kommentar. Dafuer ist sie da.", stufe: "anfaenger" },
|
||
{ schluessel: "danach-was-hat-gefehlt", titel: "Danach: was hat gefehlt?", text: "Regel unklar, niemand zum Eingreifen da, zu spaet gemerkt -- daraus wird der naechste Punkt oben.", stufe: "fort" },
|
||
{ schluessel: "entscheidung-dokumentiert", titel: "Entscheidung dokumentiert, nicht nur getroffen", text: "Wer, wann, warum, welche Stufe. Beim zweiten Mal mit derselben Person ist das der Unterschied zwischen 'wir haben da was' und 'ich glaube'.", stufe: "profi" },
|
||
{ schluessel: "regel-nachgezogen", titel: "Regel nachgezogen, damit es nicht wiederkommt", text: "Ein Vorfall, der von keiner Regel gedeckt war, ist eine Luecke -- kein Einzelfall. Die Regel wird ergaenzt, nicht der Fall vergessen.", stufe: "meister" }, { schluessel: "gleich-behandelt-nicht-nach-sympathie", titel: "Gleich behandelt, nicht nach Sympathie", text: "Dieselbe Regel für Stammgast und Fremden. Eine Ausnahme kostet mehr Vertrauen als zehn Sperren.", stufe: "fort" },
|
||
|
||
],
|
||
};
|
||
|
||
/* =====================================================================
|
||
TECHNIK-PUNKTE
|
||
|
||
Technik faellt immer im ungeeignetsten Moment aus. Die Punkte sind
|
||
deshalb danach sortiert, was am haeufigsten schiefgeht -- und Ton
|
||
steht vorn, weil schlechter Ton der Grund Nummer eins ist, warum
|
||
Leute einen Stream verlassen.
|
||
===================================================================== */
|
||
|
||
export const TECHNIK_PUNKTE = {
|
||
setup: [
|
||
{ schluessel: "mikrofon-richtig-eingestellt", titel: "Mikrofon richtig eingestellt", text: "Nicht uebersteuert, nicht zu leise, kein Rauschen. Einmal aufnehmen und anhoeren.", stufe: "anfaenger" },
|
||
{ schluessel: "kamera-scharf-und-gut-belichtet", titel: "Kamera scharf und gut belichtet", text: "Gesicht heller als der Hintergrund. Automatik oft abschalten -- sie pumpt.", stufe: "anfaenger" },
|
||
{ schluessel: "szenen-im-streaming-programm-angelegt", titel: "Szenen im Streaming-Programm angelegt", text: "Start, Vollbild, Pause, Ende. Wer waehrend der Sendung baut, sendet Chaos.", stufe: "fort" },
|
||
{ schluessel: "bitrate-zur-leitung-passend", titel: "Bitrate zur Leitung passend", text: "Lieber stabil und etwas weicher als scharf mit Aussetzern.", stufe: "fort" },
|
||
{ schluessel: "alles-einmal-komplett-getestet", titel: "Alles einmal komplett getestet", text: "Eine Probesendung von fuenf Minuten, aufgezeichnet und angesehen.", stufe: "anfaenger" },
|
||
{ schluessel: "tonfilter-in-der-richtigen-reihenfolge", titel: "Tonfilter in der richtigen Reihenfolge", text: "Erst Rauschunterdrueckung, dann Kompressor, dann Rauschsperre. Die Reihenfolge ist nicht beliebig: Ein Kompressor vor der Rauschunterdrueckung hebt das Rauschen mit an.", stufe: "profi" },
|
||
{ schluessel: "hardware-encoder-statt-prozessor", titel: "Hardware-Encoder statt Prozessor", text: "Wenn die Grafikkarte einen eigenen Encoder hat, uebernimmt der das Kodieren -- der Prozessor bleibt frei fuer alles andere. Das ist der groesste Einzelgewinn an Stabilitaet.", stufe: "profi" },
|
||
{ schluessel: "szenen-und-filter-gesichert", titel: "Szenen und Filter gesichert", text: "Die ganze Einrichtung als Sammlung exportiert und abgelegt. Nach einem Rechnerwechsel ist das der Unterschied zwischen zehn Minuten und einem Abend.", stufe: "meister" }, /* --- Aus der Recherche vom 09.09.2026 --- */
|
||
{ schluessel: "mikrofon-abstand-und-winkel", titel: "Abstand und Winkel des Mikrofons", text: "Fünf bis zehn Zentimeter, leicht seitlich gesprochen. Näher dran und leiser aufgedreht ist die beste Verbesserung, die nichts kostet.", stufe: "anfaenger" },
|
||
{ schluessel: "tonspur-mit-160-kbit", titel: "Tonspur mit 160 kbit/s", text: "Darunter klingt Sprache dumpf, darüber nimmt es dem Bild die Bandbreite. 160 ist der übliche Wert für Stimme.", stufe: "fort" },
|
||
{ schluessel: "bildrate-im-spiel-begrenzt", titel: "Bildrate im Spiel begrenzt", text: "Ein ungebremstes Spiel nimmt dem Encoder die Luft. Ein Deckel bei 60 oder 120 behebt die meisten Ruckler.", stufe: "fort" },
|
||
{ schluessel: "lautheit-gemessen", titel: "Lautheit gemessen, nicht geschätzt", text: "Zielbereich minus 20 bis minus 24 LUFS, Begrenzer bei minus 3. Wer nach Gefühl aussteuert, ist entweder leiser als alle anderen oder übersteuert.", stufe: "profi" },
|
||
|
||
],
|
||
problem: [
|
||
{ schluessel: "ton-weg-oder-verzerrt", titel: "Ton weg oder verzerrt", text: "Wann genau, welches Geraet, was lief gleichzeitig? Ohne das findet es niemand.", stufe: "anfaenger" },
|
||
{ schluessel: "bild-ruckelt-oder-friert-ein", titel: "Bild ruckelt oder friert ein", text: "Auslastung, Leitung, Aufloesung -- eins nach dem anderen ausschliessen.", stufe: "anfaenger" },
|
||
{ schluessel: "stream-bricht-ab", titel: "Stream bricht ab", text: "Zeitpunkt notieren und im Protokoll des Programms nachsehen.", stufe: "fort" },
|
||
{ schluessel: "ton-und-bild-laufen-auseinander", titel: "Ton und Bild laufen auseinander", text: "Meist ein Puffer. Wann faellt es auf, sofort oder erst spaeter?", stufe: "fort" },
|
||
{ schluessel: "verworfene-bilder-abgelesen", titel: "Verworfene Bilder abgelesen, nicht geraten", text: "Das Programm zeigt, ob Bilder wegen der Leitung oder wegen des Kodierens verloren gehen. Das sind zwei verschiedene Fehler mit zwei verschiedenen Loesungen.", stufe: "profi" },
|
||
{ schluessel: "ausfall-mit-datum-festgehalten", titel: "Ausfall mit Datum festgehalten", text: "Jeder Ausfall bekommt einen Eintrag. Erst die Liste zeigt, ob es dasselbe Problem ist oder drei verschiedene.", stufe: "meister" }, { schluessel: "statistikfenster-offen-gehabt", titel: "Statistikfenster offen gehabt", text: "Verworfene Bilder und Renderverzögerung stehen dort in Echtzeit. Hinterher raten kostet mehr Zeit als vorher hinsehen.", stufe: "fort" },
|
||
{ schluessel: "netz-oder-rechner-unterschieden", titel: "Netz oder Rechner unterschieden", text: "Verworfene Bilder kommen vom Netz, ausgelassene vom Encoder. Verschiedene Ursachen, verschiedene Lösungen – erst trennen, dann handeln.", stufe: "profi" },
|
||
|
||
],
|
||
loesung: [
|
||
{ schluessel: "was-hat-es-behoben", titel: "Was hat es behoben?", text: "Genau die eine Aenderung aufschreiben, nicht alles was probiert wurde.", stufe: "anfaenger" },
|
||
{ schluessel: "kommt-es-wieder", titel: "Kommt es wieder?", text: "Beim naechsten Mal nachsehen. Einmal weg ist nicht geloest.", stufe: "fort" },
|
||
{ schluessel: "einstellung-gesichert", titel: "Einstellung gesichert", text: "Damit sie nach einem Update nicht wieder weg ist.", stufe: "fort" },
|
||
{ schluessel: "genau-eine-aenderung-je-versuch", titel: "Genau eine Aenderung je Versuch", text: "Wer drei Dinge gleichzeitig aendert und es geht wieder, weiss nicht warum -- und beim naechsten Mal steht man wieder am Anfang.", stufe: "profi" },
|
||
{ schluessel: "loesung-als-anleitung-abgelegt", titel: "Loesung als Anleitung abgelegt", text: "So aufgeschrieben, dass jemand anderes sie nachvollziehen kann. Eine Loesung im Kopf einer Person ist keine Loesung des Teams.", stufe: "meister" }, { schluessel: "profile-ausserhalb-gesichert", titel: "Profile außerhalb des Rechners gesichert", text: "Szenen, Filter und Profile auf einen zweiten Datenträger. Ein Rechnerschaden kostet sonst zwei Abende Wiederaufbau.", stufe: "meister" },
|
||
|
||
],
|
||
};
|
||
export const CALL_LEITFAEDEN = [
|
||
{ schluessel: "erstgespraech", titel: "Erstgespräch",
|
||
text: "Wer bist du, was machst du, was willst du erreichen? · Was läuft schon gut? · "
|
||
+ "Was nervt dich gerade am meisten? · Wie viel Zeit hast du wirklich? · "
|
||
+ "Was erwartest du von uns – und was erwarten wir von dir?" },
|
||
{ schluessel: "wochen-call", titel: "Wochen-Call",
|
||
text: "Was ist seit dem letzten Mal passiert? · Was ist liegen geblieben und warum? · "
|
||
+ "Zahlen kurz ansehen – eine Auffälligkeit reicht · Was steht diese Woche an? · "
|
||
+ "Brauchst du irgendwo Hilfe?" },
|
||
{ schluessel: "wenn-es-gerade-nicht-laeuft", titel: "Wenn es gerade nicht läuft",
|
||
text: "Zuerst zuhören, nicht lösen · Seit wann geht es so? · Was hat sich geändert? · "
|
||
+ "Was war das letzte Mal, als es gut war? · Eine kleine Sache vereinbaren, "
|
||
+ "nicht fünf große" },
|
||
{ schluessel: "monats-review", titel: "Monats-Review",
|
||
text: "Die drei Ziele vom letzten Mal durchgehen · Was ist erreicht, was nicht? · "
|
||
+ "Woran lag es – Zeit, Können oder Motivation? · Drei neue Ziele, verbindlich · "
|
||
+ "Termin für das nächste Review festhalten" },
|
||
];
|
||
|
||
/* Erst hier gefuellt -- die Listen stehen weiter oben und muessen
|
||
definiert sein, bevor sie eingetragen werden. */
|
||
BEREICH_PUNKTE.live = LIVE_PUNKTE;
|
||
BEREICH_PUNKTE.community = COMMUNITY_PUNKTE;
|
||
BEREICH_PUNKTE.technik = TECHNIK_PUNKTE;
|
||
|
||
/* ---------- Schnittstelle ------------------------------------------------ */
|
||
|
||
function angemeldet(req, res, next) {
|
||
const person = sitzungLesen(req);
|
||
if (!person) return res.status(401).json({ fehler: "nicht_angemeldet" });
|
||
req.person = person;
|
||
next();
|
||
}
|
||
vorlagenRouter.use("/workspace/api/vorlagen", angemeldet);
|
||
|
||
vorlagenRouter.get("/workspace/api/vorlagen", (req, res) => {
|
||
res.json({
|
||
content: CONTENT_IDEEN,
|
||
live: LIVE_PUNKTE,
|
||
community: COMMUNITY_PUNKTE,
|
||
technik: TECHNIK_PUNKTE,
|
||
calls: CALL_LEITFAEDEN,
|
||
});
|
||
});
|
||
|
||
/* ---------- Übernehmen ---------------------------------------------------
|
||
|
||
Aus einer Vorlage wird ein ganz normaler Eintrag: änderbar, löschbar,
|
||
und ab dann unabhängig von der Vorlage. Wer die Vorlage später
|
||
ändert, ändert damit NICHT, was schon übernommen wurde -- das wäre
|
||
eine böse Überraschung.
|
||
|
||
Creator dürfen ausdrücklich selbst übernehmen. Es ist ihre Arbeit;
|
||
sie sollen nicht darauf warten müssen, dass ein Betreuer für sie eine
|
||
Idee anlegt. */
|
||
|
||
function gleicheHerkunft(req, res, next) {
|
||
const herkunft = req.get("origin");
|
||
if (!herkunft) return next();
|
||
let erlaubt;
|
||
try { erlaubt = new URL(herkunft).host === req.get("host"); } catch { erlaubt = false; }
|
||
if (!erlaubt) return res.status(403).json({ fehler: "fremde_herkunft" });
|
||
next();
|
||
}
|
||
|
||
vorlagenRouter.post("/workspace/api/vorlagen/uebernehmen", gleicheHerkunft,
|
||
express.json({ limit: "16kb" }), (req, res) => {
|
||
try {
|
||
const art = String(req.body.art || "");
|
||
const nr = Number(req.body.nr);
|
||
/* Für wen? Ein Creator immer für sich; Betreuer für den Creator,
|
||
den sie gerade ansehen. */
|
||
let creatorId = req.person.rolle === "creator"
|
||
? req.person.id
|
||
: Number(req.body.creator_id) || null;
|
||
|
||
if (req.person.rolle !== "creator" && creatorId && !darfCreator(req.person, creatorId)) {
|
||
return res.status(404).json({ fehler: "nicht_gefunden" });
|
||
}
|
||
|
||
const angelegt = [];
|
||
const einfuegen = (bereich, unterart, titel, text, zusatz = {}) => {
|
||
db().prepare(`INSERT INTO eintraege
|
||
(bereich, art, titel, text, datum, status, creator_id, hook, format,
|
||
erstellt, erstellt_von)
|
||
VALUES (?,?,?,?,?,?,?,?,?,?,?)`)
|
||
.run(bereich, unterart, titel, text, jetzt().slice(0, 10), "offen",
|
||
creatorId, zusatz.hook || null, zusatz.format || null,
|
||
jetzt(), req.person.id);
|
||
angelegt.push(titel);
|
||
};
|
||
|
||
if (art === "content") {
|
||
const v = CONTENT_IDEEN[nr];
|
||
if (!v) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
einfuegen("content", "idee", v.titel, v.text, { hook: v.hook, format: v.format });
|
||
|
||
} else if (art === "content_alle") {
|
||
for (const v of CONTENT_IDEEN) {
|
||
einfuegen("content", "idee", v.titel, v.text, { hook: v.hook, format: v.format });
|
||
}
|
||
|
||
} else if (BEREICH_PUNKTE[art]) {
|
||
/* live, community, technik -- alle drei funktionieren gleich.
|
||
Drei fast gleiche Bloecke waeren der sichere Weg dazu, dass
|
||
der dritte irgendwann anders reagiert als die ersten beiden. */
|
||
const unterart = String(req.body.unterart || "");
|
||
const liste = BEREICH_PUNKTE[art][unterart];
|
||
if (!liste) return res.status(400).json({ fehler: "Unbekannter Abschnitt." });
|
||
const v = liste[nr];
|
||
if (!v) return res.status(400).json({ fehler: "Unbekannte Vorlage." });
|
||
einfuegen(art, unterart, v.titel, v.text);
|
||
|
||
} else if (BEREICH_PUNKTE[art.replace(/_alle$/, "")] && art.endsWith("_alle")) {
|
||
const bereich = art.replace(/_alle$/, "");
|
||
const unterart = String(req.body.unterart || "");
|
||
const liste = BEREICH_PUNKTE[bereich][unterart];
|
||
if (!liste) return res.status(400).json({ fehler: "Unbekannter Abschnitt." });
|
||
for (const v of liste) einfuegen(bereich, unterart, v.titel, v.text);
|
||
|
||
} else {
|
||
return res.status(400).json({ fehler: "Unbekannte Art." });
|
||
}
|
||
|
||
protokolliere("vorlage_uebernommen", req.person, echteIp(req),
|
||
`${art}: ${angelegt.length} Eintrag/Einträge`);
|
||
res.json({ angelegt: angelegt.length, titel: angelegt });
|
||
} catch (fehler) {
|
||
console.error("[workspace] Vorlage übernehmen:", fehler?.message);
|
||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||
}
|
||
});
|
||
|
||
/* Die frühere Route /vorlagen/hilfe ist am 01.09.2026 entfallen.
|
||
Sie machte aus einer Bitte eine Aufgabe. Das war gut gemeint, aber
|
||
es gab damit zwei Wege, dasselbe zu sagen -- und Antworten landeten
|
||
mal als Aufgabe, mal als Nachricht. Geblieben ist die Rückmeldung an
|
||
jedem Punkt (workspace-checkliste.js).
|
||
|
||
Entfernt statt auskommentiert: Eine Route, die niemand mehr aufruft,
|
||
wird beim nächsten Mal für lebenden Code gehalten und mitgepflegt. */
|