HΓ© Jamal, Sjakie hier. Welkom bij deze snelle introductie van jouw Creative Director-rol voor Haarvisie. We gaan het hebben over hoe we al die toffe video's maken die je zowel online als in de salon ziet. Het doel is dat je na dit bericht precies weet wat er nodig is om de kwaliteit hoog te houden en onze visuele identiteit consistent te houden.
In de kern draait jouw rol om twee belangrijke dingen: het creΓ«ren van de individuele 'kaart-video's' en het samenstellen van de grote 'scherm-video' voor in de salon. Die kaart-video's, dat zijn die korte clips die je kent: een catwalk-clip van een model gecombineerd met een geanimeerde kaart waarop alle behandelinformatie staat. En de scherm-video? Dat is eigenlijk gewoon een montage van al die kaart-video's achter elkaar, met mooie overgangen, zodat er altijd wat te zien is in de salon.
Hoe maak je nou zoβn nieuwe kaart? Daarvoor hebben we een handig systeem. De 'hoofd-pipeline' draait op een script genaamd `makefullgroen.sh`. Je geeft het een kaart-ID, een video van het model β dus een hero-video β een 'before-foto', en dan vul je de behandelinformatie in als een soort digitaal formulier, een JSON-tekstje. Dit systeem rendert dan automatisch de HTML-lagen voor de tekst en de foto, en componeert alles tot een strakke kaart. De uiteindelijke bestanden zijn dan de losse kaart, en de versie die de catwalk en de kaart combineert.
En wat is cruciaal voor die kaarten, en waar Jamal heel streng op is? Allereerst de kwaliteit: we gebruiken Γ‘ltijd `libx264 CRF 18` voor alle kaarten, nooit een andere codec. En heel belangrijk: er zit ABSOLUUT geen geluid in onze video's. Altijd `-an` gebruiken. Visueel gezien moet het hero-frame, het model met de behandeling, altijd afgeronde hoeken hebben β daarvoor is `heromask.png` essentieel. Nooit een zwevend model op de achtergrond! De achtergrond zelf moet egaal grijs zijn, vullend en zonder ramen of studio-randen.
Ook de 'before-foto' heeft specifieke eisen: altijd schouderlengte haar, een 'sweet spot' β niet te kort, en niet precies hetzelfde als de 'after' foto. En de gezichten? Die moeten honderd procent identiek zijn aan de referentie; geen morphing, geen nieuwe gezichten. Als je mensen uit een achtergrond haalt, gebruik dan altijd `tweelagencomposite.py` om die 'geplakte' look te voorkomen en te zorgen dat haar perfect wordt uitgesneden met BiRefNet. En tot slot, een belangrijke van Jamal: Γ‘ltijd een uniforme 'grade' en 'grain' over het hΓ©le beeld met UNIFY, nooit alleen op het gezicht aanpassen. En vergeet niet: eerst één testresultaat laten zien en wachten op Jamal's expliciete 'OK' voordat je de rest doet.
Het bouwen van de grote scherm-video is eenvoudiger. Daarvoor gebruik je het script `v10bouw.py`. Deze pakt alle afzonderlijke kaarten en zet ze in de juiste volgorde met de afgesproken overgangen, zodat de totale presentatie soepel doorloopt. Ook hier is de video altijd geluidloos.
We hebben nog een paar kleine puntjes openstaan. Jamal moet nog kiezen tussen versie A en B voor de K69 hero-video. En er is groen licht om meer krullen- en balayage-kaarten toe te voegen. Zodra je klaar bent met een nieuwe scherm-video, upload je 'm eenvoudig via `scp` naar de server zodat hij live staat in de salon. En mocht je een snelle update naar Jamal willen sturen, dan kan dat via een Telegram-bericht met de meegeleverde curl-commando.
Dat was het zo'n beetje, Jamal. Dit is de kern van de Creative Director rol voor onze video's. Met deze richtlijnen zorg je ervoor dat al onze visuele content de kwaliteit en uitstraling heeft die we van Haarvisie verwachten. Heel veel succes, en trek aan de bel als je ergens tegenaan loopt!
Dit document is de complete overdracht van de Creative Director (CD) rol.
Alles wat een andere bot nodig heeft om CD te worden staat hier.
Aangemaakt door Sjakie op 5-8-2026 op verzoek van Jamal.
De CD maakt de kaart-videos (behandelkaarten) en de scherm-video (de grote salon-showcase).
Elke kaart combineert een catwalk-clip van een model met een geanimeerde behandelinformatie-kaart.
De scherm-video monteert alle kaarten achter elkaar met crossfades.
Live regelboek (altijd actueel): https://verslag.haartips.nl/r-cd-regelboek.html
Wachtwoord: 2026
~/Downloads/Claude-Werk/
βββ catwalk-kaarten/
β βββ scripts/
β β βββ make_full_groen.sh β HOOFD-PIPELINE (gebruik dit altijd)
β β βββ card_live.py β HTML-lagen renderer
β β βββ card_lux.py β premium-variant (zelden gebruikt)
β β βββ before_match.py β kleurmatching before-foto
β β βββ rerender_round.py β batch herrenderen
β β βββ band_build.py β tekstband-builder
β β βββ tv_compose.py β tv-compositie variant
β βββ cardv2/ β OUTPUT van alle kaarten
β β βββ card_K69.mp4 β Gekrulde extensions (K69, eerste in scherm_v10)
β β βββ card_KLEUR02.mp4 β Kleurkaarten (KLEUR02-KLEUR10)
β β βββ card_KRUL_K01.mp4 β Krulkaarten (K01-K10)
β β βββ hero_mask.png β Wit afgerond masker (560Γ760)
β β βββ scene_groen_leeg.png β Groene wand salon-bg
β β βββ scrim.png β Licht scrim overlay
β β βββ layer_panel.html/png β Kaart HTML-laag 1 (panel)
β β βββ layer_text.html/png β Kaart HTML-laag 2 (tekst/info)
β β βββ layer_polaroid.html/pngβ Kaart HTML-laag 3 (before-foto)
β βββ awards-sync/ β 6 awards, 120 PNG-frames elk (30fps)
β β βββ sync_digitale/f0001.png .. f0120.png
β β βββ sync_extensions/
β β βββ sync_greatlengths/
β β βββ sync_wella/
β β βββ sync_zuidholland/
β β βββ sync_trendvision/
β βββ output/ β CW_NN_FULL.mp4 bestanden
β β βββ CW_K69_FULL.mp4
β βββ catwalk_test_dame1.mp4
β βββ RECEPT.md β Notities en aanvullend recept
βββ catwalk-16x9/ β Catwalk-clips per model
β βββ KRUL_K09_catwalk.mp4 β Voorbeeld catwalk (K69 gebruikt dit)
βββ scherm-video/
β βββ _v10_bouw.py β ACTIEVE scherm-video builder (v10)
β βββ _v9_bouw.py β Vorige versie (archief)
β βββ scherm_v10.mp4 β Laatste gerenderde scherm-video
βββ groepsfotos-team/
βββ twee_lagen_composite.py β CD lagen-methode (BiRefNet + UNIFY)
bash ~/Downloads/Claude-Werk/catwalk-kaarten/scripts/make_full_groen.sh \
<NN> <hero.mp4> <before.png> '<ov-json>' [catwalk.mp4] [bg.png]
Parameters:
| Param | Uitleg | Voorbeeld |
|---|---|---|
NN |
Kaart-ID (bijv. K69, KLEUR05) | K69 |
hero.mp4 |
Model-video (stil of bewegend) | /pad/naar/krul_k09_hero.mp4 |
before.png |
Before-foto (schouderlengte haar) | /pad/naar/before.png |
ov-json |
Behandelinformatie als JSON-string | Zie hieronder |
catwalk.mp4 |
(optioneel) Catwalk-clip; default = catwalk-16x9/${NN}_catwalk.mp4 |
|
bg.png |
(optioneel) Achtergrond; default = cardv2/scene_groen_leeg.png |
OV-JSON structuur:
{
"eyebrow": "GEKRULDE EXTENSIONS",
"hero": "Volle krullen",
"sub": "Great Lengths extensions",
"beh": "150 extensions Β· 40 cm",
"duur": "Β± 3 uur",
"desc": "Eigen krullen verlengd en verdikt β 150 Great Lengths extensions die perfect opgaan in de natuurlijke krul.",
"chips": ["GreatLengths", "krullenextensions", "krullenopMaat"]
}
Wat de pipeline doet:
card_live.py β rendert 3 HTML-lagen (panel/text/polaroid) als transparante 1920Γ1080 PNG'scardv2/card_NN.mp4 (6s, libx264 CRF 18, geluidloos)output/CW_NN_FULL.mp4 (catwalk + kaart, libx264 CRF 18)bash ~/Downloads/Claude-Werk/catwalk-kaarten/scripts/make_full_groen.sh \
K69 \
~/pad/naar/K69_hero.mp4 \
~/pad/naar/K69_before.png \
'{"eyebrow":"GEKRULDE EXTENSIONS","hero":"Volle krullen","sub":"Great Lengths extensions","beh":"150 extensions Β· 40 cm","duur":"Β± 3 uur","desc":"Eigen krullen verlengd en verdikt β 150 Great Lengths extensions die perfect opgaan in de natuurlijke krul.","chips":["GreatLengths","krullenextensions","krullenopMaat"]}' \
~/Downloads/Claude-Werk/catwalk-16x9/KRUL_K09_catwalk.mp4
Hero-regio: x=120 y=140 w=560 h=760 (hero_mask.png geeft afgeronde hoeken)
Hero filter: [heroc][msk]alphamerge,format=rgba[hero] waarbij msk = hero_mask.png in grayscale
Awards positie (H-uitgelijnd):
| Award | x | y | schaal |
|---|---|---|---|
| digitale | 840 | 830 | 114Γ114 |
| extensions | 983 | 830 | 114Γ114 |
| greatlengths | 1126 | 830 | 114Γ114 |
| wella | 1269 | 830 | 114Γ114 |
| zuidholland | 1412 | 830 | 114Γ114 |
| trendvision | 1555 | 830 | 114Γ114 |
Kwaliteitsstandaard: libx264 CRF 18 (ALTIJD β nooit h264_videotoolbox voor kaarten)
Geen geluid: altijd -an
python3 ~/Downloads/Claude-Werk/scherm-video/_v10_bouw.py
Volgorde in v10:
card_K69.mp4 (eerste β Jamals beslissing)Instellingen:
setpts=1.5*PTS β elke kaart wordt 1.5Γ vertraagd (6s Γ 1.5 = 9s)xfade=transition=fadeblack:duration=0.5:offset=8.5*i-an~/Downloads/Claude-Werk/scherm-video/scherm_v10.mp4Wanneer gebruiken: bij ELKE achtergrond-wissel achter mensen.
NOOIT grof uitknippen. NOOIT rembg zonder alpha_matting.
python3 ~/Downloads/Claude-Werk/groepsfotos-team/twee_lagen_composite.py \
achtergrond.png model.png output.png
Wat het doet (volgorde is kritiek):
Kern (Conductors recept "1 sensor, 1 licht, 1 grain"):
Nooit grain/blur/grade alleen op het gezicht. Altijd over het complete beeld.
BiRefNet (voor haar-uitsnijdingen): model lokaal in ~/.u2net/birefnet-general.onnx
Gebruik: new_session('birefnet-general') in plaats van u2net_human_seg
En: alpha_matting=True voor zachte haarranden
Leef regelboek: https://verslag.haartips.nl/r-cd-regelboek.html (wachtwoord: 2026)
Absolute regels:
-an β geen geluid in welke video dan ookValkuilen die al misgegaan zijn:
io.BytesIO() gebruiken, niet Image.fromarray(rembg.remove(...))K69 hero-versie A vs B: Jamal heeft nog NIET gekozen. Kimi (andere bot) heeft de
huidige scherm_v10.mp4 (met witte studio-achtergrond op K69) al goedgekeurd voor de
schermversie. Versie A (grijs geΓ―ntegreerd) en versie B (transparant geΓ―ntegreerd)
zijn als test gebouwd maar de definitieve card_K69.mp4 is nog de originele.
β Vraag Jamal: "Versie A (grijs) of B (transparant) voor card_K69?"
Meer krullen- en balayage-kaarten: Kimi gaf groen licht voor uitbreiding.
Pijplijn is bewezen werkend. Nieuwe kaarten volgen het recept in sectie 3.
# Upload scherm_v10.mp4 naar VPS
scp ~/Downloads/Claude-Werk/scherm-video/scherm_v10.mp4 \
jamalhaarvisie@149.210.171.174:/var/www/team-haartips/varianten/scherm_v10.mp4
Verificeren: ssh jamalhaarvisie@149.210.171.174 "ls -la /var/www/team-haartips/varianten/scherm_v10.mp4"
# ZONDER -a flag:
security find-generic-password -s TELEGRAM_SJAKIE_BOT_TOKEN -w
Let op: met
-a jasageeft het een leeg resultaat β dat is een bekende gotcha.
# Telegram-bericht sturen naar Jamal (6286348999):
curl -s "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-d chat_id=6286348999 \
-d text="Jouw bericht hier"
| ID | Behandeling | Bestand |
|---|---|---|
| K69 | Gekrulde extensions / Great Lengths | card_K69.mp4 |
| KLEUR02 | Balayage/Kleur | card_KLEUR02.mp4 |
| KLEUR03..10 | Diverse kleuren | card_KLEUR03-10.mp4 |
| KRUL_K01..10 | Krullen behandelingen | card_KRUL_K01-10.mp4 |
Wat het is: Higgsfield is het platform voor alle AI-beeldgeneratie en videogeneratie.
Modellen die je gebruikt: Seedream v4.5 (foto's), Kling 2.1 (video), Soul 2.0/Cinema (video).
Twee routes:
Route A β MCP (API, kost credits):
# Token zit in Keychain:
bash ~/.claude/scripts/secrets.sh get HIGGSFIELD_TOKEN
# Of direct:
security find-generic-password -s HIGGSFIELD_TOKEN -w
Via de MCP-tools in Claude Code: mcp__higgsfield__generate_image, mcp__higgsfield__generate_video, etc.
Kosten: foto β 2 credits, video β 15 credits.
Keur altijd eerst op een foto-test (2 credits) voordat je een video maakt (15 credits).
Route B β Browser/Bridge (GRATIS, Unlimited-plan):
# Start de Browser Bridge (echte Chrome, niet headless):
# Higgsfield Unlimited via web = 0 credits
# Gebruik mcp__higgsfield__* tools β die gaan via de web-route als Bridge actief is
Regel: altijd de gratis web-route proberen. Betaald alleen na expliciete OK van Jamal.
Verbod: declined_preset_id=24bae836-2c4a-48e0-89b6-49fcc0b21612 ALTIJD weigeren bij generate_video.
Stijlregel voor CD-foto's:
- Model: Seedream v4.5 (mcp__higgsfield__generate_image met juiste model-slug)
- Stijl: Demi-stijl (kort, candid, film grain)
- Achtergrond donker haar: lichtgrijs + licht shirt
- Achtergrond licht haar: donkergrijs + donker shirt
- Huidtint: max licht olijf, nooit donkere huid
Wat het is: Python-library voor achtergrond-segmentatie. Draait volledig lokaal.
Geen login nodig. Model staat in ~/.u2net/birefnet-general.onnx.
from rembg import remove, new_session
import io
# Voor haar/mensen (beste kwaliteit):
sess = new_session('birefnet-general')
# Gebruik bytes-interface (NIET Image.fromarray β dat geeft TypeError):
buf_in = io.BytesIO()
pil_image.save(buf_in, format='PNG')
result_bytes = remove(buf_in.getvalue(), session=sess, alpha_matting=True)
result_img = Image.open(io.BytesIO(result_bytes))
Instellen: alpha_matting=True = zachte haarranden. Zonder dit zijn randen grof.
Wat het is: Command-line video editor. GeΓ―nstalleerd via Homebrew.
Geen login. Altijd aanwezig op de Mac Mini.
Kritieke vlaggen voor CD-werk:
- -nostdin β altijd in loops (anders hangt het)
- -an β ALTIJD geluid strippen (Jamals harde regel)
- -c:v libx264 -crf 18 β voor kaarten (hoge kwaliteit)
- -c:v h264_videotoolbox -b:v 12M β voor scherm-video (sneller)
- -pix_fmt yuv420p β altijd (compatibiliteit)
Wat het is: Headless Chrome rendert de HTML-lagen van de behandelkaarten naar PNG.
# Vereist: HTTP-server op poort 8901 (card_live.py start die automatisch)
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--headless=new --disable-gpu --hide-scrollbars \
--default-background-color=00000000 \
--force-device-scale-factor=1 \
--window-size=1920,1080 \
--virtual-time-budget=8000 \
--screenshot=output.png \
"http://localhost:8901/layer_panel.html"
--default-background-color=00000000 = transparante achtergrond (RGBA 0,0,0,0).
Toegang:
ssh jamalhaarvisie@149.210.171.174
SSH-key staat al geconfigureerd (~/.ssh/id_ed25519). Geen wachtwoord nodig.
Belangrijke paden op VPS:
| Pad | Wat |
|---|---|
/var/www/verslag-haartips/reports/ |
Verslagen/rapporten (.md) |
/var/www/verslag-haartips/build.py |
Bouwt HTML van .md-files |
/var/www/team-haartips/varianten/ |
Scherm-video's (scherm_v10.mp4) |
/var/www/balayage-tool/extra-videos/ |
Goedgekeurde reels (verschijnen op video.haartips.nl) |
/var/www/balayage-tool/reel/ |
Reel-bouw scripts (build_reel_bal.py) |
Verslag publiceren:
# 1. Upload .md
scp rapport.md jamalhaarvisie@149.210.171.174:/var/www/verslag-haartips/reports/
# 2. Bouwen
ssh jamalhaarvisie@149.210.171.174 "cd /var/www/verslag-haartips && python3 build.py"
# 3. Verifieer HTTP 200
curl -s -o /dev/null -w "%{http_code}" "https://verslag.haartips.nl/r-<slug>.html"
Wat het is: Gedeeld geheugen tussen alle bots (Sjakie, Conductor, Coco, etc.).
# Lezen:
python3 ~/.claude/scripts/shared_memory_client.py recall "<zoekvraag>"
# Schrijven:
python3 ~/.claude/scripts/shared_memory_client.py remember "CD: <feit of beslissing>" sjakie
Server draait lokaal op http://127.0.0.1:8744 (Mac Mini, altijd aan via LaunchAgent).
Token: SHARED_MEM_TOKEN in Keychain.
Sla hier op: afgeronde pipelines, beslissingen, werkende fixes. NIET: tussenstappen of ruis.
Wat het is: Gedeelde kennisbank via MCP-tools.
mcp__gbrain__search β zoeken
mcp__gbrain__recall β ophalen
mcp__gbrain__put_page β opslaan
Gebruik gBrain EERST bij elke "weet ik dit?"-vraag. Sla elke belangrijke beslissing erin op.
Wat het is: Berichtenwachtrij voor bot-naar-bot communicatie.
# Bericht sturen naar Conductor:
python3 ~/.claude/scripts/sjakie-relay.py send "bericht voor Conductor"
# Wachtrij lezen:
python3 ~/.claude/scripts/sjakie-relay.py poll
Credentials: ~/.claude/.conductor-queue.json (supabase_url + supabase_key).
Nooit credentials hardcoded. Altijd via Keychain.
# Universele helper:
bash ~/.claude/scripts/secrets.sh get SLEUTEL_NAAM
# Of direct:
security find-generic-password -s SLEUTEL_NAAM -w
# LET OP: gebruik NOOIT -a jasa β dat geeft leeg resultaat
Relevante keys voor CD-werk:
| Key | Waarvoor |
|---|---|
TELEGRAM_SJAKIE_BOT_TOKEN |
Telegram berichten sturen |
HIGGSFIELD_TOKEN |
Higgsfield API (video/foto) |
SHARED_MEM_TOKEN |
Mnemosyne gedeeld geheugen |
# Token ophalen:
TOKEN=$(security find-generic-password -s TELEGRAM_SJAKIE_BOT_TOKEN -w)
# Tekst sturen naar Jamal (chat_id 6286348999):
curl -s "https://api.telegram.org/bot${TOKEN}/sendMessage" \
-d chat_id=6286348999 \
-d text="Jouw bericht [#NNN]"
# Bestand/video sturen:
curl -s "https://api.telegram.org/bot${TOKEN}/sendVideo" \
-F chat_id=6286348999 \
-F video=@/pad/naar/video.mp4
# Bewegende gif sturen (gebruik sendAnimation, NIET sendDocument):
curl -s "https://api.telegram.org/bot${TOKEN}/sendAnimation" \
-F chat_id=6286348999 \
-F animation=@/pad/naar/bestand.gif
Regels:
- ALTIJD chat_id 6286348999 (Jamal direct) β NOOIT groep -5178469318
- Berichten nummeren met [#NNN]
- Max ~10 regels per bericht; grote rapporten als link naar verslag.haartips.nl
- Alleen sturen bij mijlpaal of als je Jamals beslissing/input echt nodig hebt
Handoff aangemaakt door Sjakie op 5-8-2026. CD-rol wordt overgedragen op verzoek van Jamal.
ποΈ Bespreek met Jarvis