Die YouTube-Kanal-Fabrik Stand 2026-07-28 19:22 UTC

DNA

Wie sie entsteht, und was in ihr steht

Der Kloner beantwortet eine Frage: was genau macht aus einem fremden Video unsere DNA?

Er sieht sich einen bewiesenen Kanal an und schreibt auf, was ihn ausmacht: welche Hooks, welcher Skript-Bogen, welche Titel, welche Bildarten, welcher Schnitt. Das Ergebnis ist eine JSON-Datei, keine Beschreibung. Alles läuft über den eigenen Plan, also kostenlos.

#SchrittStandSkripte
K1Kanal messen
Median-Views der letzten 10 chronologischen Uploads, Verhältnis zu den Abos, Frische. Ein Bestwert aus einer Suchliste ist eine Hypothese, der Median ist ein Beleg
läuft niche_probe.py
1 Skripte
niche_probe.py
HZ-491: Nischen-Sonde – holt harte YouTube-Zahlen zu einer Nischen-Hypothese und schreibt
K2Die besten Videos ziehen
Top-Videos mit View-Zahlen plus die letzten Uploads als Friedhofstest. Dieselben Videos liefern später die Referenz-Frames zum Messen
läuft channel_dossier.py, fetch_channel_videos.py
2 Skripte
channel_dossier.py
HZ-509: Kanal-Dossier – EIN Datensatz je Kanal, zwei Auswertungstiefen.
fetch_channel_videos.py
HZ-216: Read a FOREIGN YouTube channel's public video list via the YouTube Data API,
K3Zuhören: Transkripte
Was gesagt wird, Wort für Wort. Daraus kommen Hooks, Skript-Bogen und Sprechtempo
läuft yt_subs.py, algrow_rest.py
2 Skripte
yt_subs.py
HZ-491 · Untertitel fremder YouTube-Videos holen – lokal, $0.
algrow_rest.py
HZ-239/HZ-846 · Serverseitige Algrow-REST-Bruecke – OHNE Claude-MCP-Session.
K4Hinsehen: echte Frames
Frames über die ganze Laufzeit als Kontaktbogen. Ohne diesen Schritt ist eine DNA optikblind und kann Schnitt-Tempo und Look nur raten
läuft frame_vision.py
1 Skripte
frame_vision.py
HZ-297 · Eigene Video-Vision ($0, Algrow-unabhaengig).
K5Formel schreiben
Aus Transkripten, Titeln und Frames wird ein festes JSON-Schema: Hooks, Titel-Formeln, Retention, Format, Bildstil, Thumbnail. Jedes Feld mit open_gaps, wo etwas unklar blieb
läuft extract_dna.py
1 Skripte
extract_dna.py
Channel-Clone · Phase 0 – Kanal-DNA-Extraktor (HZ-205, Vorstufe zu HZ-203).
K6Maßstab messen
Seit 28.07.: aus denselben Videos gemessene Zielwerte statt Prosa. Materialmix, Kartengröße, Licht
läuft dna_massstab.py, material_mix.py
2 Skripte
dna_massstab.py
HZ-519 · Den MASSSTAB in die DNA schreiben – messbare Zielwerte statt Prosa ($0).
material_mix.py
HZ-519 · Materialmix eines Kanals messen – woraus die Bilder BESTEHEN ($0).
K7In einen Kanal gießen
DNA wird zu Rezept-Werten und in die Pipeline geschrieben. Heute noch als Fork je Kanal, deshalb nur teilweise
halb derive_format.py, apply_recipe.py, fork_channel.py
3 Skripte
derive_format.py
HZ-322 · Render-Format aus AI-Vision automatisch ableiten (kanaluebergreifend, $0).
apply_recipe.py
HZ-230 Apply-Motor v2 – Kanal-Registry + Recipe in EINEM Befehl anwenden.
fork_channel.py
HZ-231 (Motor v2 Block C, der HZ-203-Kern): Kanal-ERSTELLEN aus Recipe+DNA.

Was der Kloner nicht kann: entscheiden, welcher Kanal das Vorbild sein soll. Messen kann er jede Nische, ranken muss ein Mensch. Und die letzte Stufe schreibt heute in einen geforkten Workflow statt in eine Straße, die zur Laufzeit liest.

Das Zielbild zeigt, wie eine DNA entsteht – hier steht, was in ihr drin ist, abgelegt als dna/<kanal>.json.

Die Liste führt drei verschiedene Dinge:

  • Wert – steht in der DNA, die Pipeline liest ihn (Bildquellen, Bildmenge, Übergänge, Font, Länge, Stimme). Ändern heißt: Zahl oder Name ändern.
  • Regel – keine Zahl, sondern eine Vorschrift, wie etwas entsteht: welche Formel das Skript baut, wie der Hook gemacht wird. Kommt aus dem Vorbild, nicht aus einer Liste.
  • System – Werkzeug der Fabrik selbst, damit DNA und Pipeline zusammenarbeiten.

⚠️ „Läuft" heißt nicht „gut"

Das ist der wichtigste Satz auf dieser Seite. Ein Baustein gilt hier als verdrahtet, wenn er existiert und in einen Workflow geschrieben wurde. Über das Ergebnis sagt das nichts. Zwei Dinge, die gleichzeitig wahr sind:

  • 25 Bausteine laufen
  • und trotzdem trifft keine gemessene Folge ihren eigenen Maßstab

Gemessen am 28.07.: history ist zu dunkel (typisches Frame 46 statt 105), hat halb so viel Licht-Dynamik wie das Vorbild und wiederholt 55 % seiner Bilder. alvaro zeigt 2 % Lesekarten statt 87 % – es klont das Format seines Vorbilds schlicht nicht.

Wer wissen will, wie gut ein Kanal wirklich ist, schaut nicht in diese Tabelle, sondern auf den Maßstab in seiner DNA und das Ergebnis von dna_pruefen.py. Diese Liste sagt nur, welche Schrauben es überhaupt gibt.

Und selbst „verdrahtet" ist schwächer, als es klingt: heute schreibt ein patch_*.py den Wert einmalig in einen geforkten Workflow, danach ist er eingefroren. Die Pipeline wählt ihn nicht zur Laufzeit aus einem Katalog. Wie groß der Unterschied ist, steht als Zahl im Kapitel Stand und Weg (26 %). Ein echter Laufzeit-Katalog ist HZ-203.

Wert Steht als Wert in der DNA. Die Pipeline liest ihn und richtet sich danach: Bildquellen, Bildmenge, Übergänge, Font, Länge, Stimme.
Regel Kein Wert, sondern eine Vorschrift, WIE etwas entsteht: welche Formel das Skript baut, wie der Hook gemacht wird, wann geschnitten wird. Kommt aus dem Vorbild.
System Weder Wert noch Regel, sondern Werkzeug: was die Fabrik selbst können muss, damit DNA und Pipeline überhaupt zusammenarbeiten.
#ArtBausteinStandWomit es gebaut wird
1RegelFormel (DNA)läuftP1-Nodes „Claude für Skript"/„…Hooks"/„…Title Optimizer" via inject_p1.py --full-p1 (PUT + Reactivate). Seit HZ-528 …
ganzer Eintrag
Ausführungs-Baustein
P1-Nodes „Claude für Skript"/„…Hooks"/„…Title Optimizer" via inject_p1.py --full-p1 (PUT + Reactivate). Seit HZ-528 enthält der Block eine EROEFFNUNGS-Sektion (clone_engine.eroeffnung_block): Wortbudget aus pacing gerechnet, Messzahlen aus channel_clone/retention/<kanal>_*.json (retention_probe.py), ohne Messung keine Zahlen. Zusätzlich liegt das Prompt-Gerüst jetzt im Rezept (prompts.p1 mit {CHANNEL_DNA}/{WORTZIEL}, gemessen von freeze_p1_prompt.py) – Ton aus dem Rezept, Formel aus der DNA, Zahlen aus dem Bauplan
Stand
bewiesen (Psych-P1 18.07.; HZ-528: Rückeinsetz-Beweis 45/45 byte-identisch, Idempotenz + --remove restlos). ⚠️ Kein Konsument von prompts.p1 – p1-Straße existiert noch nicht
2WertBild-Lookläuftapply_recipe --with-style: recipe.style → Preset aus style_presets.json als Marker-Block [APPLY_STYLE] im …
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-style: recipe.style → Preset aus style_presets.json als Marker-Block [APPLY_STYLE] im P1-Skript-Prompt (idempotent; Epochen-Mapping geschützt, --style-force als Ausnahme; stock_only/auto = skip)
Stand
verdrahtet 25.07. (HZ-344; Wirkbeweis geo: Marker live + Idempotenz)
3WertQuellen-Mix (ai/pexels/pixabay/wikimedia/unsplash/getty/archive/openverse/coverr/reuse)läuftP2 Stock-Kette (Pexels→Pixabay→Wikimedia→Unsplash, LIVE) + Router-Prompt + harvest-gw:8013 (ALLOWED_SOURCES: …
ganzer Eintrag
Ausführungs-Baustein
P2 Stock-Kette (Pexels→Pixabay→Wikimedia→Unsplash, LIVE) + Router-Prompt + harvest-gw:8013 (ALLOWED_SOURCES: pexels/wikimedia/getty/artlist/openverse/archive/coverr, HZ-286 verifiziert)
Stand
HZ-291+302: archive/openverse in P2 verdrahtet UND MODULAR aus Recipe. Quellen-Wahl liegt jetzt in channel_clone/recipes/<slug>.jsonrecipe.harvest_sources (history [archive,openverse,wikimedia], geo [wikimedia,pexels,openverse,archive]); generisches wf_fork/patch_harvest_sources.py --channel X setzt sie in den Harvest GW-Node (Regex, #7, idempotent, skip wenn keine Stage). WF-Auflösung AUTOMATISCH (resolve_harvest_wf: registry-pX-Kandidaten + Node-Check → neuer Kanal braucht KEINE ID-Pflege, nur Recipe-Feld; STOCK_WF-Dict nur noch Override für Sonderfälle wie history, dessen Stock-WF nicht in registry-p2.id steht). --list zeigt alle Harvest-Kanäle (WF-ID · Node- vs. Recipe-Quellen). Geo live+recipe-getrieben (Schreibpfad bewiesen), History-Node stimmt mit Recipe; Recipe-Änderung an History = --apply als Leon-Handgriff (Live-Classifier). coverr raus (nur Video). Offen separat: fork_channel.py-Vererbung + Stages für weitere Kanäle. youtube_clips , loc zurückgestellt (Cloudflare)
4WertMotion (zoom/kb/out)läuftbuild_payload.py MOTIONS
ganzer Eintrag
Ausführungs-Baustein
build_payload.py MOTIONS
Stand
live (genau diese 3)
4bWertMotion pan/tilt/pulseläuftStaticScene-Cases (pan live seit je, tilt/pulse NEU) – payload-gated
ganzer Eintrag
Ausführungs-Baustein
StaticScene-Cases (pan live seit je, tilt/pulse NEU) – payload-gated
Stand
verdrahtet 18.07.
4cWertMotion-Tempoläuftscene.motion_speed (build_payload aus Recipe) x zoomSpan in StaticScene
ganzer Eintrag
Ausführungs-Baustein
scene.motion_speed (build_payload aus Recipe) x zoomSpan in StaticScene
Stand
verdrahtet 18.07.
5WertÜbergänge (hart)läuftheutiger Beat-Cut
ganzer Eintrag
Ausführungs-Baustein
heutiger Beat-Cut
Stand
live
5bWertÜbergänge (11 weitere) + DauerläuftTransitionWrapper +9 Cases + scene.transition_seconds; Recipe-Rotation + Director pro Beat
ganzer Eintrag
Ausführungs-Baustein
TransitionWrapper +9 Cases + scene.transition_seconds; Recipe-Rotation + Director pro Beat
Stand
verdrahtet 18.07. (Wiring-Proof)
6WertSchnitt-TempohalbTARGET_SHOT_SECONDS env (CS-Fork live; Psych-Fork prüfen)
ganzer Eintrag
Ausführungs-Baustein
TARGET_SHOT_SECONDS env (CS-Fork live; Psych-Fork prüfen)
Stand
7WertCaptions karaoke_yellowläuftCaptions.tsx
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx
Stand
live
7bWertCaptions white/static/boxedläuftCaptions.tsx variant-Prop (scene.caption_variant aus Recipe)
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx variant-Prop (scene.caption_variant aus Recipe)
Stand
verdrahtet 18.07.
7cWertCaption-Font (6 Fonts)läuftCaptions.tsx font-Prop + @font-face (ttf in public/fonts) – Wiring-Proof: Bangers LIVE in MainVideo-Still
ganzer Eintrag
Ausführungs-Baustein
Captions.tsx font-Prop + @font-face (ttf in public/fonts) – Wiring-Proof: Bangers LIVE in MainVideo-Still
Stand
verdrahtet 18.07.
8WertKarten chapter_v7läuftOnScreenText.tsx + CHAPTER_CARDS=v7 env
ganzer Eintrag
Ausführungs-Baustein
OnScreenText.tsx + CHAPTER_CARDS=v7 env
Stand
live
8bWertKarten year/name, popupläuftgleiche Komponente + POPUP_CARDS env
ganzer Eintrag
Ausführungs-Baustein
gleiche Komponente + POPUP_CARDS env
Stand
env existiert (bei Psych bewusst off)
8cWertKarten quote/stathalbgleiche Komponente, nur P1-title_cards-Content („KICKER\
ganzer Eintrag
Ausführungs-Baustein
gleiche Komponente, nur P1-title_cards-Content („KICKER\
Stand
TERM")
9WertThumbnail tupacläuftP4 Thumbnail-Kette (Rollout 14.07., 8 Kanäle)
ganzer Eintrag
Ausführungs-Baustein
P4 Thumbnail-Kette (Rollout 14.07., 8 Kanäle)
Stand
live
9bWertThumbnail hook_band/cleanhalbP4-Prompt-Umschalter
ganzer Eintrag
Ausführungs-Baustein
P4-Prompt-Umschalter
Stand
Rollout-Skript als Muster da
10WertSubscribe-OverlayläuftSUBSCRIBE_OVERLAY_AT/DUR env
ganzer Eintrag
Ausführungs-Baustein
SUBSCRIBE_OVERLAY_AT/DUR env
Stand
live
10bWertMaskottchen-Introfehltneue Remotion-Komponente + Look-Entscheid
ganzer Eintrag
Ausführungs-Baustein
neue Remotion-Komponente + Look-Entscheid
Stand
11WerteBook Beschreibung+PinnedläuftP1 „Funnel Copy" + P4 (HZ-180)
ganzer Eintrag
Ausführungs-Baustein
P1 „Funnel Copy" + P4 (HZ-180)
Stand
live
11bWerteBook QR-OutroläuftOutroCard + Buch aus recipes/<kanal>.jsonrecipe.book (HZ-267; OUTRO_*-env nur noch Notfall-Override)
ganzer Eintrag
Ausführungs-Baustein
OutroCard + Buch aus recipes/<kanal>.jsonrecipe.book (HZ-267; OUTRO_*-env nur noch Notfall-Override)
Stand
scharf für history + psych (21.07.)
11cWerteBook Mid-PlugläuftMidPlugOverlay + payload.book_plugs (LISTE): 2 Einblendungen/Video auf Kapitelgrenzen, nie erste 60 s / letzte 45 s. Buch …
ganzer Eintrag
Ausführungs-Baustein
MidPlugOverlay + payload.book_plugs (LISTE): 2 Einblendungen/Video auf Kapitelgrenzen, nie erste 60 s / letzte 45 s. Buch kommt pro LAUF aus recipes/<kanal>.json (recipe_key im /render-Body) – nicht aus Container-env, weil ein Container mehrere Kanäle bedient. Optik = Variante G
Stand
scharf für history + psych, Code in cs/history-remotion/psychology (21.07.)
12WertVideo-Längeläuftapply_recipe --with-p1: recipe.length-Bucket → Wortziel im P1-Skript-Prompt (LEN_WORDS)
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-p1: recipe.length-Bucket → Wortziel im P1-Skript-Prompt (LEN_WORDS)
Stand
verdrahtet (patch_p1_tuning; Matrix hinkte – Stand korrigiert 25.07., HZ-344)
13WertSpracheläuftapply_recipe --with-p1: recipe.lang → Sprach-Direktive [APPLY_LANG] im P1-Prompt
ganzer Eintrag
Ausführungs-Baustein
apply_recipe --with-p1: recipe.lang → Sprach-Direktive [APPLY_LANG] im P1-Prompt
Stand
verdrahtet (patch_p1_tuning; Stand korrigiert 25.07., HZ-344)
14WertSFX-Sethalbbuild_payload.py SFX-Logik + WHOOSH_SFX; „pops_sparse" = Logik-Patch
ganzer Eintrag
Ausführungs-Baustein
build_payload.py SFX-Logik + WHOOSH_SFX; „pops_sparse" = Logik-Patch
Stand
15WertBGM-Pool-Auswahlhalbpick_bgm() rotiert HEUTE über ALLE bgm*.mp3; Subset = BGM_POOL env-Patch
ganzer Eintrag
Ausführungs-Baustein
pick_bgm() rotiert HEUTE über ALLE bgm*.mp3; Subset = BGM_POOL env-Patch
Stand
16WertStimmeläuftKette zu (HZ-254, 21.07.): voices.json (4.771 Stimmen + Akzent-Regeln) → voice_pick.py wählt automatisch aus DNA → …
ganzer Eintrag
Ausführungs-Baustein
Kette zu (HZ-254, 21.07.): voices.json (4.771 Stimmen + Akzent-Regeln) → voice_pick.py wählt automatisch aus DNA → Recipe-Feld voiceapply_recipe --with-voice patcht den P2-TTS-Node (Fallback auf den Pool, nicht mehr nur registry.voices)
Stand
verdrahtet 21.07. (Live-Apply nur auf Leons Go)
17WertKadenzhalbHQ-Studio-Tagesplaner/Kalender-API
ganzer Eintrag
Ausführungs-Baustein
HQ-Studio-Tagesplaner/Kalender-API
Stand
(heute Klick, API existiert)
18RegelAI-Director (Beat-Advisor)läuftLIVE: P2-Node „AI Director (HZ-212)" (Aggregate→Director→Coverage; Upload-map trägt director – Whitelist-Falle behoben) …
ganzer Eintrag
Ausführungs-Baustein
LIVE: P2-Node „AI Director (HZ-212)" (Aggregate→Director→Coverage; Upload-map trägt director – Whitelist-Falle behoben) – 1 Claude-Call/Video via claude-proxy ($0), wählt pro Beat transition/motion/sfx NUR aus der Recipe-Palette, fail-safe (Fehler ⇒ Beats unverändert); apply_recipe.py --with-director setzt die Palette aus dem Recipe; build_payload nutzt die Annotationen NUR bei aktivem Recipe
Stand
(Wirkbeweis = nächster echter Lauf)
19WertMaterial-Mix Stills/Bewegt (Jonas: 69 % Bewegt, 3 % KI = DER Look-Unterschied; wir 100 % KI-Stills)halbHeroScene.tsx rendert Videos LIVE + Wikimedia-Videos in Stock-Kette + fertiger Patch …
ganzer Eintrag
Ausführungs-Baustein
HeroScene.tsx rendert Videos LIVE + Wikimedia-Videos in Stock-Kette + fertiger Patch wf_fork/apply_pexels_gateway_videos.py + Harvester --video
Stand
Bausteine da, Router-/Mix-Patch fehlt
20RegelHook = bewegter Clip (Jonas: Sekunde 0 bewegt, wir statisch)halbP2-Router-Regel „Beat 1 = video" + erste Szene HeroScene
ganzer Eintrag
Ausführungs-Baustein
P2-Router-Regel „Beat 1 = video" + erste Szene HeroScene
Stand
reine Prompt-/Payload-Sache
21WertSchnitt-Dichte-Benchmark (Jonas ~10 Shots/Min · Apex 12-18 · wir 2,4 = 4-10× zu langsam)halbCS-Shot-Expansion (TARGET_SHOT_SECONDS + Bild-Reuse) auf Psych aktivieren
ganzer Eintrag
Ausführungs-Baustein
CS-Shot-Expansion (TARGET_SHOT_SECONDS + Bild-Reuse) auf Psych aktivieren
Stand
CS-Baustein live, Psych-Port fehlt
22SystemNEXUS-Parität: Template-Bibliothek=Recipes · Runs-Monitor=HQ-Übersicht · Clips-DRILLDOWN / Clip-AUSTAUSCH · CSV-Nischen-ImportläuftHQ builder/übersicht
ganzer Eintrag
Ausführungs-Baustein
HQ builder/übersicht
Stand
teils
23SystemVision-Anker (echte Frames des Zielkanals in der DNA als Stil-Referenz) + image_prompt_dna (EIN deterministischer Stil-Prompt)läuftClone: Anker aus Video-Thumbs (Algrow-Scrape) · p1_block traegt VISUAL-STYLE-PROMPT + THUMBNAIL-DNA → fliesst via inject_p1 …
ganzer Eintrag
Ausführungs-Baustein
Clone: Anker aus Video-Thumbs (Algrow-Scrape) · p1_block traegt VISUAL-STYLE-PROMPT + THUMBNAIL-DNA → fliesst via inject_p1 nach P1 (bereits re-injiziert 18.07.) · Ausbau: Anker als img2img-Referenz
Stand
Datenpfad live (Apex re-injiziert)
24SystemSelf-Optimizer (Leon: „System muss schlau sein") – AVD/CTR je Folge → schlaegt Recipe-/DNA-Aenderungen VOR (nie auto-aendern, Leon-Gate)fehltNightly-Skript: yt_analytics je Folge + aktives Recipe/DNA → Claude-Diagnose → Ticket-Note/TG-Vorschlag
ganzer Eintrag
Ausführungs-Baustein
Nightly-Skript: yt_analytics je Folge + aktives Recipe/DNA → Claude-Diagnose → Ticket-Note/TG-Vorschlag
Stand
designed, Bau auf Zuruf

Was im Katalog fehlt

Bausteine, die es geben müsste, aber nicht gibt – sie stehen noch nicht in der Matrix.

BausteinStandWarum er fehltTicket
Presenter / sprechende Person (HeyGen)fehltKein Baustein für einen Avatar oder Menschen, der in die Kamera spricht: alle unsere Kanäle sind faceless. Die Materialklasse `presenter_person` ist im Maßstab bereits vorgesehen, aber es gibt nichts, was sie erzeugt.noch keins

Quelle im Repo: channel_clone/APPLY_MATRIX.md