Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
16e1baa
feat: Initialize project — PRD and feature map
claude Jun 5, 2026
8702d76
feat: Add Nexora AI branded email preview template
claude Jun 6, 2026
44f580a
feat(PROJ-1): Write feature specification for Supabase Infrastructure…
claude Jun 6, 2026
a14d235
feat: Add NORA webapp dashboard mockup
claude Jun 6, 2026
9589023
docs(PROJ-1): Add technical architecture design for Supabase Infrastr…
claude Jun 6, 2026
1697584
feat(PROJ-1): Implement Supabase infrastructure — auth, middleware, D…
claude Jun 6, 2026
564d926
chore(PROJ-1): Update status to In Progress
claude Jun 6, 2026
fdd1594
test(PROJ-1): Add QA test results, unit tests, and E2E tests
claude Jun 6, 2026
5a2cee0
chore: Ignore generated playwright-report and test-results
claude Jun 6, 2026
d74bb42
fix(PROJ-1): Add logout button (AC5) and middleware error handling (AC6)
claude Jun 6, 2026
020e28c
fix(PROJ-1): Make SQL schema idempotent — safe to re-run
claude Jun 6, 2026
0a0f3ac
feat(PROJ-3): Write feature specification for Review & Approval Dashb…
claude Jun 6, 2026
97dcbed
docs(PROJ-3): Add technical design for Review & Approval Dashboard
claude Jun 7, 2026
271b86d
feat(PROJ-3): Implement frontend for Review & Approval Dashboard
claude Jun 7, 2026
d329cac
chore(PROJ-3): Update status to In Progress
claude Jun 7, 2026
2270baf
feat(PROJ-3): Harden backend — Zod validation, auth check, query limi…
claude Jun 7, 2026
17a651f
test(PROJ-3): Add QA test results for Review & Approval Dashboard
claude Jun 7, 2026
61ee0d9
deploy(PROJ-3): Add production security headers
claude Jun 7, 2026
6b4d755
NORA MVP: Infrastruktur (PROJ-1) + Review & Approval Dashboard (PROJ-…
billichstefan-ui Jun 7, 2026
31e290a
deploy(PROJ-3): Deploy NORA MVP to production
claude Jun 7, 2026
1904012
feat(PROJ-2): Write feature specification for Daily Suggestion Engine
claude Jun 7, 2026
6028f5e
docs(PROJ-2): Add technical design for Daily Suggestion Engine
claude Jun 7, 2026
09fe3a3
feat(PROJ-2): Implement frontend — Jetzt generieren button
claude Jun 7, 2026
01685a7
feat(PROJ-2): Implement backend — Claude generation engine, cron, API
claude Jun 7, 2026
61a9206
feat(PROJ-2): Daily Suggestion Engine — Claude generation, cron, dash…
claude Jun 7, 2026
dac7663
fix(PROJ-2): Show detailed error message in generation toast
claude Jun 7, 2026
6c8d8f3
fix(PROJ-2): Catch createServiceRoleClient errors to surface missing-…
claude Jun 7, 2026
e686931
feat(PROJ-4): Write feature specification for Monday.com Task Auto-Cr…
claude Jun 7, 2026
022a126
docs(PROJ-4): Add technical design for Monday.com Task Auto-Creation
claude Jun 7, 2026
063e59b
feat(PROJ-4): Implement Monday.com Task Auto-Creation
claude Jun 7, 2026
b29ec07
chore(PROJ-4): Update status to In Progress
claude Jun 7, 2026
b52b8ec
test(PROJ-4): Add QA test results for Monday.com Task Auto-Creation
claude Jun 7, 2026
70dd741
deploy(PROJ-4): Deploy Monday.com Task Auto-Creation to production
claude Jun 7, 2026
0bb228f
feat(PROJ-5): Write feature specification for Notion Document Auto-Cr…
claude Jun 7, 2026
e06db5d
docs(PROJ-5): Add technical design for Notion Document Auto-Creation
claude Jun 7, 2026
251e1f8
feat(PROJ-5): Implement Notion Document Auto-Creation backend
claude Jun 7, 2026
0879d1c
test(PROJ-5): Add QA test results for Notion Document Auto-Creation
claude Jun 7, 2026
85e35c0
deploy(PROJ-5): Deploy Notion Document Auto-Creation to production
claude Jun 7, 2026
5aeac41
fix(PROJ-5): Accept full Notion URL or raw ID for NOTION_PARENT_PAGE_ID
claude Jun 7, 2026
bb88afd
docs(PROJ-5): Record post-deploy NOTION_PARENT_PAGE_ID URL fix
claude Jun 7, 2026
f817dab
feat(PROJ-8): Write feature specification for Notion document elabora…
claude Jun 7, 2026
42465b8
docs(PROJ-8): Track Notion document elaboration in INDEX and PRD
claude Jun 7, 2026
fe661b7
docs(PROJ-8): Add technical design for Notion document elaboration
claude Jun 7, 2026
442c09e
feat(PROJ-8): Elaborate Notion documents with Claude on approval
claude Jun 7, 2026
2c74cfd
docs(PROJ-8): Update status to In Progress
claude Jun 7, 2026
467c84e
test(PROJ-8): Add QA test results and E2E spec for Notion document el…
claude Jun 7, 2026
242d0f3
deploy(PROJ-8): Mark Notion-Dokument-Ausarbeitung as Deployed
claude Jun 7, 2026
1f5e5ba
feat(PROJ-7): Write feature specification for Context-Aware Suggestions
claude Jun 8, 2026
782ded5
docs(PROJ-7): Add QualiPilot repo reference (billichstefan-ui/Qualipi…
claude Jun 8, 2026
cfeb659
docs(PROJ-7): Add technical design for Context-Aware Suggestions
claude Jun 8, 2026
d21bb2e
feat(PROJ-7): Implement context-aware suggestions with live data
claude Jun 8, 2026
7f6a6ad
chore(PROJ-7): Update status to In Progress
claude Jun 8, 2026
094606f
test(PROJ-7): Add QA test results and E2E spec for Context-Aware Sugg…
claude Jun 8, 2026
3eb5cac
deploy(PROJ-7): Deploy Context-Aware Suggestions to production
claude Jun 8, 2026
038e650
test(PROJ-2): Add QA test results and E2E spec for Daily Suggestion E…
claude Jun 10, 2026
91e7d36
deploy(PROJ-2): Deploy Daily Suggestion Engine to production
claude Jun 10, 2026
7073154
feat(PROJ-6): Write feature specification for Implementation Tracking…
claude Jun 10, 2026
a947a54
docs(PROJ-6): Add technical design for Implementation Tracking & History
claude Jun 10, 2026
a2ea27b
feat(PROJ-6): Implement frontend for Implementation Tracking & History
claude Jun 10, 2026
9c7d4cc
feat(PROJ-6): Implement backend for Implementation Tracking & History
claude Jun 10, 2026
e567b54
Merge main: PROJ-6 frontend, PROJ-7, PROJ-2 QA into feature branch
claude Jun 10, 2026
4da10b3
test(PROJ-6): Add QA test results for Implementation Tracking & History
claude Jun 10, 2026
895979b
fix(PROJ-2): Exclude /api from middleware matcher so cron reaches end…
claude Jun 10, 2026
92cedc9
deploy(PROJ-6): Deploy Implementation Tracking & History to production
claude Jun 10, 2026
2eac786
fix(PROJ-6): Fix history stats to show all-time counts via separate D…
claude Jun 11, 2026
9b9e59b
feat(dashboard): Cards disappear immediately on approve/reject, move …
claude Jun 11, 2026
b9a7dea
docs(PROJ-3,PROJ-6): Document card-disappear design change and BUG-2 fix
claude Jun 11, 2026
7ddc878
feat(PROJ-9): Digital Product Research (Demand Validation) — Produkt-…
billichstefan-ui Jun 21, 2026
1f5f5eb
Kordix-AI-Markenkonsolidierung + PROJ-10 Design & Brand Kategorie (#4)
billichstefan-ui Jun 21, 2026
182cb80
docs(content): add EP01 full video production package (Claude GMP qua…
claude Jun 25, 2026
09e3c3b
feat(content): add generated EP01 brand visuals (hero + thumbnails)
claude Jun 25, 2026
c929da0
docs(content): link editable Canva thumbnail design for EP01
claude Jun 25, 2026
9c00d21
feat(content): add EP01 faceless video POC (intro clip + hook voiceover)
claude Jun 25, 2026
d49ad97
feat(content): assemble EP01 faceless hook scene (Julian VO)
claude Jun 25, 2026
8bf2123
feat(content): add EP01 vertical Short (72s, Sora captions + Julian VO)
claude Jun 26, 2026
7371211
feat(content): add EP01 music bed + 16:9 cut; vertical now ships with…
claude Jun 26, 2026
f7eb6c0
docs(content): add Higgsfield clip download index + script for EP01
claude Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,7 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

# Playwright
playwright-report/
test-results/
41 changes: 41 additions & 0 deletions content/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Kordix AI — Content Production System

> Faceless AI-powered media company. Tagline: **AI for Pharma Professionals** · *Build Smarter. Validate Faster.*

This directory holds the production blueprints for Kordix AI's owned media (YouTube, TikTok, Shorts, LinkedIn, Newsletter). Code for the BizDev Agent app lives in `src/`; **content lives here** so scripts, SEO, and asset specs are version-controlled and reusable.

## Content Pillars

| # | Pillar | Share | Core topics |
|---|--------|-------|-------------|
| 1 | **AI for GMP** | 40% | Claude for CSV, URS generation, IQ/OQ/PQ automation, FMEA, Annex 11, Data Integrity |
| 2 | AI Business | 30% | Digital products, templates, passive income, Notion systems |
| 3 | Claude Tutorials | 20% | Claude Code, Skills, Agents, MCP, Memory, prompt engineering |
| 4 | Future of Pharma | 10% | AI validation, digital twins, agentic AI, Pharma 4.0 |

## The 8-Step Video System

Every episode ships with: **1.** Research → **2.** Script → **3.** Storyboard → **4.** Voiceover → **5.** Video assets → **6.** Editing guide → **7.** SEO package → **8.** Distribution (TikTok / Shorts / Reels / LinkedIn / Newsletter).

## Compliance Guardrail (non-negotiable)

Kordix AI sells trust to a regulated audience. **Every GxP video must make the same honest claim:** AI accelerates the *drafting* of validation documentation — the qualified SME's review, critical thinking, and approval remain mandatory under GAMP 5 (2nd ed.), 21 CFR Part 11, and EU Annex 11. Never imply AI output is "validated," that review can be skipped, or that this produces an audit-ready package without human approval. This framing is both correct and our strongest differentiator against hype-merchant competitors.

## Monetization Hooks (attach to every episode)

- **Lead magnet** → free download (URS template / CSV readiness checklist) to grow the list.
- **Product funnel** → GMP Starter Pack (€39) → CSV Toolkit (€99) → Validation OS (€199) → AI Validation Agents (€499+).
- **Affiliate** → Claude/Anthropic, Notion, Canva, ElevenLabs, CapCut.

## Episodes

| Ep | Title | Pillar | Status | File |
|----|-------|--------|--------|------|
| 01 | I Let Claude Build a GMP Qualification Package in 10 Minutes | 1 — AI for GMP | Ready to produce | [EP01](youtube/EP01-claude-gmp-qualification-package.md) |

## Brand Quick-Reference

- **Background** `#070B1E` · **Surface** `#0E1430` · **Primary** `#0078FF` · **Cyan** `#38E5FF` · **Indigo** `#7B81FF` · **Violet** `#A720FF` · **Teal** `#0E9594`
- **Signature gradient:** `#38E5FF → #0078FF → #7B81FF → #A720FF`
- **Font:** Sora — headlines UPPERCASE, wide letter-spacing.
- **Logo:** hexagon-network + 3D crystal (icosahedron) in blue→violet; wordmark **KORDIX** (white) + **AI** (cyan).
473 changes: 473 additions & 0 deletions content/youtube/EP01-claude-gmp-qualification-package.md

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
35 changes: 35 additions & 0 deletions content/youtube/assets/EP01/EP01-captions-169.ass
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
[Script Info]
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080
WrapStyle: 0
ScaledBorderAndShadow: yes

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Cap,Sora,52,&H00FFFFFF,&H000078FF,&H00000000,&H96000000,-1,0,0,0,100,100,0,0,1,4,2,2,200,200,70,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:03.00,Cap,,0,0,0,,This normally takes three weeks.
Dialogue: 0,0:00:03.00,0:00:06.00,Cap,,0,0,0,,First draft in under 10 minutes.
Dialogue: 0,0:00:06.00,0:00:08.50,Cap,,0,0,0,,Without risking an FDA 483.
Dialogue: 0,0:00:08.50,0:00:11.00,Cap,,0,0,0,,The AI didn't replace the validation.
Dialogue: 0,0:00:11.00,0:00:13.00,Cap,,0,0,0,,It replaced the blank page.
Dialogue: 0,0:00:13.00,0:00:18.00,Cap,,0,0,0,,If you've validated a computerized system...
Dialogue: 0,0:00:18.00,0:00:22.00,Cap,,0,0,0,,The pain isn't thinking. It's the typing.
Dialogue: 0,0:00:22.00,0:00:25.00,Cap,,0,0,0,,URS. Risk assessment.
Dialogue: 0,0:00:25.00,0:00:28.00,Cap,,0,0,0,,IQ. OQ. PQ.
Dialogue: 0,0:00:28.00,0:00:32.50,Cap,,0,0,0,,A traceability matrix linking every test.
Dialogue: 0,0:00:32.50,0:00:35.50,Cap,,0,0,0,,I gave Claude a skill.
Dialogue: 0,0:00:35.50,0:00:38.00,Cap,,0,0,0,,GAMP 5. ALCOA+. Part 11.
Dialogue: 0,0:00:38.00,0:00:42.00,Cap,,0,0,0,,I described one system -- environmental monitoring.
Dialogue: 0,0:00:42.00,0:00:45.00,Cap,,0,0,0,,It drafted the whole package.
Dialogue: 0,0:00:45.00,0:00:48.00,Cap,,0,0,0,,Structured requirements. Risk assessment.
Dialogue: 0,0:00:48.00,0:00:52.00,Cap,,0,0,0,,Test protocols. A matrix with no gaps.
Dialogue: 0,0:00:52.00,0:00:55.00,Cap,,0,0,0,,But the AI only drafts.
Dialogue: 0,0:00:55.00,0:00:58.50,Cap,,0,0,0,,It rated one risk wrong.
Dialogue: 0,0:00:58.50,0:01:02.00,Cap,,0,0,0,,It didn't know we poll every 15 minutes.
Dialogue: 0,0:01:02.00,0:01:04.50,Cap,,0,0,0,,I caught it in two seconds.
Dialogue: 0,0:01:04.50,0:01:09.00,Cap,,0,0,0,,The specialist owns every approval.
Dialogue: 0,0:01:09.00,0:01:12.59,Cap,,0,0,0,,AI kills the blank page. Follow for more.
35 changes: 35 additions & 0 deletions content/youtube/assets/EP01/EP01-captions-72s.ass
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
[Script Info]
ScriptType: v4.00+
PlayResX: 1080
PlayResY: 1920
WrapStyle: 0
ScaledBorderAndShadow: yes

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Cap,Sora,76,&H00FFFFFF,&H000078FF,&H00000000,&H96000000,-1,0,0,0,100,100,0,0,1,5,3,2,90,90,300,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:03.00,Cap,,0,0,0,,This normally takes\Nthree weeks.
Dialogue: 0,0:00:03.00,0:00:06.00,Cap,,0,0,0,,First draft in\Nunder 10 minutes.
Dialogue: 0,0:00:06.00,0:00:08.50,Cap,,0,0,0,,Without risking an\NFDA 483.
Dialogue: 0,0:00:08.50,0:00:11.00,Cap,,0,0,0,,The AI didn't replace\Nthe validation.
Dialogue: 0,0:00:11.00,0:00:13.00,Cap,,0,0,0,,It replaced the\Nblank page.
Dialogue: 0,0:00:13.00,0:00:18.00,Cap,,0,0,0,,If you've validated a\Ncomputerized system...
Dialogue: 0,0:00:18.00,0:00:22.00,Cap,,0,0,0,,The pain isn't thinking.\NIt's the typing.
Dialogue: 0,0:00:22.00,0:00:25.00,Cap,,0,0,0,,URS. Risk assessment.
Dialogue: 0,0:00:25.00,0:00:28.00,Cap,,0,0,0,,IQ. OQ. PQ.
Dialogue: 0,0:00:28.00,0:00:32.50,Cap,,0,0,0,,A traceability matrix\Nlinking every test.
Dialogue: 0,0:00:32.50,0:00:35.50,Cap,,0,0,0,,I gave Claude\Na skill.
Dialogue: 0,0:00:35.50,0:00:38.00,Cap,,0,0,0,,GAMP 5. ALCOA+.\NPart 11.
Dialogue: 0,0:00:38.00,0:00:42.00,Cap,,0,0,0,,I described one system --\Nenvironmental monitoring.
Dialogue: 0,0:00:42.00,0:00:45.00,Cap,,0,0,0,,It drafted the\Nwhole package.
Dialogue: 0,0:00:45.00,0:00:48.00,Cap,,0,0,0,,Structured requirements.\NRisk assessment.
Dialogue: 0,0:00:48.00,0:00:52.00,Cap,,0,0,0,,Test protocols. A matrix\Nwith no gaps.
Dialogue: 0,0:00:52.00,0:00:55.00,Cap,,0,0,0,,But the AI\Nonly drafts.
Dialogue: 0,0:00:55.00,0:00:58.50,Cap,,0,0,0,,It rated one\Nrisk wrong.
Dialogue: 0,0:00:58.50,0:01:02.00,Cap,,0,0,0,,It didn't know we poll\Nevery 15 minutes.
Dialogue: 0,0:01:02.00,0:01:04.50,Cap,,0,0,0,,I caught it in\Ntwo seconds.
Dialogue: 0,0:01:04.50,0:01:09.00,Cap,,0,0,0,,The specialist owns\Nevery approval.
Dialogue: 0,0:01:09.00,0:01:12.59,Cap,,0,0,0,,AI kills the blank page.\NFollow for more.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added content/youtube/assets/EP01/EP01-music-bed.m4a
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/youtube/assets/EP01/EP01-thumbnail-B.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
78 changes: 78 additions & 0 deletions content/youtube/assets/EP01/EP01-variants-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/usr/bin/env bash
# Build the music + landscape variants of the EP01 short from committed sources.
# Produces: EP01-music-bed.m4a, EP01-short-vertical-72s.mp4 (with music),
# EP01-landscape-16x9-72s.mp4 (with music).
# Requires: ffmpeg (libx264 + libass + lavfi) on PATH, ./fonts/Sora.ttf.
# Run from content/youtube/assets/EP01/ : bash EP01-variants-build.sh
set -euo pipefail
cd "$(dirname "$0")"

VO="EP01-voiceover-julian-72s.mp3"
FPS=30

# ---- 1. Procedural ambient music bed (Cm: C2/G2 drone + Cm triad, tremolo, reverb) ----
echo "Generating ambient music bed..."
ffmpeg -y \
-f lavfi -i "sine=frequency=65.41:duration=73" \
-f lavfi -i "sine=frequency=98.00:duration=73" \
-f lavfi -i "sine=frequency=261.63:duration=73" \
-f lavfi -i "sine=frequency=311.13:duration=73" \
-f lavfi -i "sine=frequency=392.00:duration=73" \
-filter_complex "[0:a]volume=0.50[d0];[1:a]volume=0.32[d1];\
[2:a]volume=0.16[p0];[3:a]volume=0.13[p1];[4:a]volume=0.13[p2];\
[p0][p1][p2]amix=inputs=3:normalize=0[pad];[pad]tremolo=f=0.10:d=0.7[padm];\
[d0][d1][padm]amix=inputs=3:normalize=0[raw];\
[raw]aecho=0.8:0.7:55:0.3,highpass=f=35,lowpass=f=4200,volume=1.15,\
afade=t=in:st=0:d=3,afade=t=out:st=70:d=3,alimiter=limit=0.9[m]" \
-map "[m]" -ac 1 -ar 44100 -c:a aac -b:a 160k EP01-music-bed.m4a >/dev/null 2>&1

# ---- shared timeline (same as EP01-vertical-build.sh) ----
SRC=(EP01-intro-clip-hero-5s.mp4 \
broll/EP01-vert-broll-01-483-stamp.mp4 broll/EP01-vert-broll-02-blank-page.mp4 \
broll/EP01-vert-broll-03-typing-data.mp4 broll/EP01-vert-broll-04-vmodel.mp4 \
EP01-broll-matrix-5s.mp4 broll/EP01-vert-broll-05-neural-core.mp4 \
broll/EP01-vert-broll-06-ems-sensor.mp4 EP01-broll-binders-5s.mp4 \
broll/EP01-vert-broll-07-risk-warning.mp4 broll/EP01-vert-broll-06-ems-sensor.mp4 \
broll/EP01-vert-broll-08-crystal-outro.mp4)
SS=(0 0 0 0 0 0 0 0 0 0 2.0 0)
DUR=(4.0 5.5 5.5 6.5 6.5 5.0 6.5 6.5 5.0 7.56 6.0 8.0)
LAND=" 0 5 8 " # indices that are native 16:9 (full-frame); others are 9:16 (pillarbox in landscape)

AUD='[1:a]afade=t=in:st=0:d=0.15,afade=t=out:st=72.09:d=0.5[vo];[2:a]volume=2.0,highpass=f=60[bed];[vo][bed]amix=inputs=2:normalize=0:duration=first,alimiter=limit=0.95[a]'

build_master () { # $1=W $2=H $3=mode(vert|land) $4=out
local W=$1 H=$2 MODE=$3 OUT=$4 list="concat_${MODE}.txt"; : > "$list"
for i in "${!SRC[@]}"; do
local idx; idx=$(printf "%02d" $((i+1))); local seg="seg_${MODE}_$idx.mp4"
if [ "$MODE" = vert ] || [[ "$LAND" == *" $i "* ]]; then
ffmpeg -y -ss "${SS[$i]}" -i "${SRC[$i]}" -t "${DUR[$i]}" \
-vf "scale=${W}:${H}:force_original_aspect_ratio=increase,crop=${W}:${H},setsar=1,fps=${FPS},format=yuv420p" \
-c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -r "$FPS" -an -video_track_timescale 30000 "$seg" >/dev/null 2>&1
else # vertical clip into landscape frame -> blurred pillarbox
ffmpeg -y -ss "${SS[$i]}" -i "${SRC[$i]}" -t "${DUR[$i]}" \
-filter_complex "[0:v]split=2[bg][fg];[bg]scale=${W}:${H}:force_original_aspect_ratio=increase,crop=${W}:${H},gblur=sigma=28,eq=brightness=-0.12[bgb];[fg]scale=-2:${H}[fgs];[bgb][fgs]overlay=(W-w)/2:(H-h)/2,setsar=1,fps=${FPS},format=yuv420p[out]" \
-map "[out]" -c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -r "$FPS" -an -video_track_timescale 30000 "$seg" >/dev/null 2>&1
fi
echo "file '$seg'" >> "$list"
done
ffmpeg -y -f concat -safe 0 -i "$list" -c copy "$OUT" >/dev/null 2>&1
rm -f seg_${MODE}_??.mp4 "$list"
}

mux () { # $1=master $2=ass $3=out
ffmpeg -y -i "$1" -i "$VO" -i EP01-music-bed.m4a \
-filter_complex "[0:v]subtitles=$2:fontsdir=fonts,fade=t=in:st=0:d=0.5,fade=t=out:st=72.07:d=0.5[v];$AUD" \
-map "[v]" -map "[a]" -c:v libx264 -preset medium -crf 19 -pix_fmt yuv420p \
-c:a aac -b:a 192k -movflags +faststart -shortest "$3"
}

echo "Building vertical (9:16) master + mux with music..."
build_master 1080 1920 vert master_vert.mp4
mux master_vert.mp4 EP01-captions-72s.ass EP01-short-vertical-72s.mp4

echo "Building landscape (16:9) master + mux with music..."
build_master 1920 1080 land master_land.mp4
mux master_land.mp4 EP01-captions-169.ass EP01-landscape-16x9-72s.mp4

rm -f master_vert.mp4 master_land.mp4
echo "Done -> EP01-short-vertical-72s.mp4 (music) + EP01-landscape-16x9-72s.mp4"
52 changes: 52 additions & 0 deletions content/youtube/assets/EP01/EP01-vertical-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env bash
# Rebuild EP01-short-vertical-72s.mp4 from the committed sources in this folder.
# Requires: ffmpeg (with libx264 + libass) on PATH, and ./fonts/Sora.ttf.
# Run from content/youtube/assets/EP01/ : bash EP01-vertical-build.sh
set -euo pipefail
cd "$(dirname "$0")"

OUT="EP01-short-vertical-72s.mp4"
VO="EP01-voiceover-julian-72s.mp3" # full ~72s Julian VO (ElevenLabs)
ASS="EP01-captions-72s.ass" # burned-in captions (Sora)
W=1080; H=1920; FPS=30

# Timeline: source file | in-point (ss) | duration — sums to ~72.56s (the VO length).
# Old 16:9 clips are centre-cropped to 9:16; new clips are native 9:16 (720x1280).
SRC=(EP01-intro-clip-hero-5s.mp4 \
broll/EP01-vert-broll-01-483-stamp.mp4 \
broll/EP01-vert-broll-02-blank-page.mp4 \
broll/EP01-vert-broll-03-typing-data.mp4 \
broll/EP01-vert-broll-04-vmodel.mp4 \
EP01-broll-matrix-5s.mp4 \
broll/EP01-vert-broll-05-neural-core.mp4 \
broll/EP01-vert-broll-06-ems-sensor.mp4 \
EP01-broll-binders-5s.mp4 \
broll/EP01-vert-broll-07-risk-warning.mp4 \
broll/EP01-vert-broll-06-ems-sensor.mp4 \
broll/EP01-vert-broll-08-crystal-outro.mp4)
SS=(0 0 0 0 0 0 0 0 0 0 2.0 0)
DUR=(4.0 5.5 5.5 6.5 6.5 5.0 6.5 6.5 5.0 7.56 6.0 8.0)

VF="scale=${W}:${H}:force_original_aspect_ratio=increase,crop=${W}:${H},setsar=1,fps=${FPS},format=yuv420p"

echo "Normalising ${#SRC[@]} segments to ${W}x${H}..."
: > concat.txt
for i in "${!SRC[@]}"; do
idx=$(printf "%02d" $((i+1)))
ffmpeg -y -ss "${SS[$i]}" -i "${SRC[$i]}" -t "${DUR[$i]}" -vf "$VF" \
-c:v libx264 -preset medium -crf 18 -pix_fmt yuv420p -r "$FPS" -an \
-video_track_timescale 30000 "seg$idx.mp4" >/dev/null 2>&1
echo "file 'seg$idx.mp4'" >> concat.txt
done

echo "Concatenating..."
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy master_silent.mp4 >/dev/null 2>&1

echo "Burning captions + muxing VO + fades..."
ffmpeg -y -i master_silent.mp4 -i "$VO" \
-filter_complex "[0:v]subtitles=${ASS}:fontsdir=fonts,fade=t=in:st=0:d=0.5,fade=t=out:st=72.07:d=0.5[v];[1:a]afade=t=in:st=0:d=0.15,afade=t=out:st=72.09:d=0.5[a]" \
-map "[v]" -map "[a]" -c:v libx264 -preset medium -crf 19 -pix_fmt yuv420p \
-c:a aac -b:a 192k -movflags +faststart -shortest "$OUT"

rm -f seg??.mp4 concat.txt master_silent.mp4
echo "Done -> $OUT"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
36 changes: 36 additions & 0 deletions content/youtube/assets/EP01/download-higgsfield.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
# Download every EP01 Higgsfield clip to ./higgsfield-raw/ via the public CDN.
# Works from any machine with internet (the URLs are public/unsigned).
# Usage: bash download-higgsfield.sh
set -euo pipefail
cd "$(dirname "$0")"
OUT="higgsfield-raw"; mkdir -p "$OUT"
B="https://d8j0ntlcm91z4.cloudfront.net/user_3F6UVmiDGRtp3TwVQvwWDTHaXmu"

# name | url-filename (06-25 EP01 production set)
CLIPS=(
"01-intro-crystal|hf_20260625_124233_da0a7bfe-a07a-4893-9e65-e6dd746e54fd.mp4"
"02-binders|hf_20260625_131118_a1d078ef-c04a-470d-ab85-3fb64915abc1.mp4"
"03-matrix|hf_20260625_131126_d5083685-2a59-409b-8e23-857f40740279.mp4"
"04-483-stamp|hf_20260625_132447_277e1481-a753-4b1d-9876-b1110dad7e71.mp4"
"05-blank-page|hf_20260625_132456_2fd642bb-82fb-43fc-9143-4097ebccdfff.mp4"
"06-typing-data|hf_20260625_132505_a1cb2a56-a9e0-429a-8d1e-c40dd4fa5793.mp4"
"07-vmodel|hf_20260625_132513_7a03c56f-acd0-4e44-8c10-2d67f09706fb.mp4"
"08-neural-core|hf_20260625_132521_b6775961-5869-4ea6-85e9-e3f693ed8b9a.mp4"
"09-ems-sensor|hf_20260625_132605_f094361b-e0c0-4f9b-ab52-a158d0805a25.mp4"
"10-risk-warning|hf_20260625_132716_ecf54f93-2092-4739-b924-b48ab70a861c.mp4"
"11-crystal-outro|hf_20260625_132726_8df9ad62-343f-4d4e-bcc5-37944a8179c0.mp4"
# 06-24 earlier brand-tech b-roll (not in the EP01 cut)
"12-follow-button|hf_20260624_172418_2cffcf5d-f615-42e3-a5ff-d482a0762d63.mp4"
"13-edit-timeline|hf_20260624_172413_5d88da68-89e4-4e57-adf9-75ffcbdb75dd.mp4"
"14-doc-writing|hf_20260624_172409_7a93466e-4438-4b6e-955b-949b0492befd.mp4"
"15-desk-to-laptop|hf_20260624_172404_3c76975e-d1fb-439a-a467-f4254618eda2.mp4"
"16-frames|hf_20260624_172238_71dacca9-0fd5-45d8-a00d-17a911292df4.mp4"
"17-waveform|hf_20260624_172231_b3e0ea46-8012-406b-a65d-b95a5ef75c8a.mp4"
)
for c in "${CLIPS[@]}"; do
name="${c%%|*}"; file="${c##*|}"
echo "-> $name.mp4"
curl -fsSL --retry 3 -o "$OUT/$name.mp4" "$B/$file" || echo " FAILED: $name"
done
echo "Done. Files in ./$OUT/"
Binary file added content/youtube/assets/EP01/fonts/Sora.ttf
Binary file not shown.
Loading