@devinilabs/reelstack 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2267 @@
1
+ /**
2
+ * REFERENCE — JcodeReel (Family: glass)
3
+ *
4
+ * Canonical example of the glass family's motion vocabulary, frame-locked
5
+ * BEAT structure, and scene choreography. Bundled with ReelStack v1.4+
6
+ * for STUDY and as the source for the scaffold-from-reference flow.
7
+ *
8
+ * Asset imports stripped (look for REFERENCE-STRIP markers). Bring your own
9
+ * voiceover, brand SVGs, captures.
10
+ *
11
+ * License: study + adapt patterns OK. Verbatim re-publication as your own
12
+ * template NOT OK. See ReelStack LICENSE.
13
+ *
14
+ * Source: my-video/src/JcodeReel.tsx
15
+ * Bundled at: 2026-05-12T19:40:04.825Z
16
+ */
17
+ import React from "react";
18
+ import {
19
+ AbsoluteFill,
20
+ Img,
21
+ OffthreadVideo,
22
+ Sequence,
23
+ interpolate,
24
+ spring,
25
+ staticFile,
26
+ useCurrentFrame,
27
+ useVideoConfig,
28
+ } from "remotion";
29
+ import {
30
+ C,
31
+ ease,
32
+ glassBase,
33
+ CausticBlobs,
34
+ HairlineGrid,
35
+ IridescentRing,
36
+ GlassCard,
37
+ EyebrowPill,
38
+ StaggeredWords,
39
+ ScrambleText,
40
+ Counter,
41
+ SonarRings,
42
+ ParticleBurst,
43
+ LightBeam,
44
+ FONT,
45
+ MONO,
46
+ } from "./GraphifyReel";
47
+
48
+ // ═══════════════════════════════════════════════════════════════
49
+ // TIMING — 72.13s @ 30fps = 2164 frames, audio-locked
50
+ // BEATs derived from /tmp/jcode.srt sentence boundaries (whisper-cli base.en)
51
+ // ═══════════════════════════════════════════════════════════════
52
+ export const JCODE_TOTAL = 2164;
53
+
54
+ export const BEAT = {
55
+ hook: 0, // 0.00s — "63 times faster than Codex…"
56
+ intro: 348, // 11.60s — "Welcome back guys"
57
+ harness: 554, // 18.46s — "So here's the thing…"
58
+ rust: 907, // 30.22s — "And jcode just rebuilt…in Rust"
59
+ memory: 1154, // 38.45s — "Now about that built-in memory system"
60
+ parallel: 1463, // 48.78s — "Parallel sessions are native too"
61
+ swarms: 1660, // 55.35s — "And the craziest part?"
62
+ cta: 1995, // 66.51s — "If you want the repo link"
63
+ end: 2164, // 72.13s
64
+ } as const;
65
+
66
+ // jcode brand accent — the ONLY non-iridescent color, single accent per leonxinx Rule 2
67
+ const JC = {
68
+ rust: "#E55A1A",
69
+ rustSoft: "#F9C5A5",
70
+ rustDeep: "#9B3A0E",
71
+ rustHaze: "rgba(229,90,26,0.18)",
72
+ } as const;
73
+
74
+ const SAFE_TOP = 290; // 15% of 1920
75
+ const SAFE_BOTTOM = 1500; // bottom 22% begins
76
+
77
+ // ═══════════════════════════════════════════════════════════════
78
+ // FILM GRAIN — copy of GraphifyReel's overlay (it's not exported)
79
+ // ═══════════════════════════════════════════════════════════════
80
+ const FilmGrain: React.FC = () => (
81
+ <AbsoluteFill
82
+ style={{
83
+ backgroundImage:
84
+ "url(\"data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E\")",
85
+ opacity: 0.06,
86
+ pointerEvents: "none",
87
+ mixBlendMode: "multiply",
88
+ }}
89
+ />
90
+ );
91
+
92
+ // ═══════════════════════════════════════════════════════════════
93
+ // FLOATING GLYPHS — code-symbol pills drifting on sine paths (Scene 1)
94
+ // Anti-emoji per leonxinx — uses Unicode math/code symbols only
95
+ // ═══════════════════════════════════════════════════════════════
96
+ const FloatingGlyphs: React.FC<{ startFrame?: number }> = ({ startFrame = 0 }) => {
97
+ const frame = useCurrentFrame();
98
+ const local = Math.max(0, frame - startFrame);
99
+ const glyphs = [
100
+ { ch: "</>", x: 120, y: 360, phase: 0.0, speed: 0.025, size: 36, color: C.iriCyan },
101
+ { ch: "{ }", x: 880, y: 480, phase: 1.1, speed: 0.022, size: 38, color: C.iriViolet },
102
+ { ch: "λ", x: 200, y: 1240, phase: 2.0, speed: 0.028, size: 44, color: C.iriRose },
103
+ { ch: "∞", x: 920, y: 1140, phase: 3.2, speed: 0.024, size: 40, color: JC.rust },
104
+ { ch: "Σ", x: 100, y: 760, phase: 0.8, speed: 0.030, size: 42, color: C.iriGold },
105
+ { ch: "∇", x: 940, y: 1380, phase: 4.5, speed: 0.026, size: 38, color: C.iriCyan },
106
+ ];
107
+ return (
108
+ <AbsoluteFill style={{ pointerEvents: "none" }}>
109
+ {glyphs.map((g, i) => {
110
+ const birth = i * 6;
111
+ const lo = Math.max(0, local - birth);
112
+ const intro = interpolate(lo, [0, 30], [0, 1], {
113
+ extrapolateRight: "clamp",
114
+ easing: ease.expoOut,
115
+ });
116
+ const driftX = Math.sin(local * g.speed + g.phase) * 26;
117
+ const driftY = Math.cos(local * g.speed * 1.3 + g.phase) * 22;
118
+ const rot = Math.sin(local * g.speed * 0.8 + g.phase) * 6;
119
+ return (
120
+ <div
121
+ key={i}
122
+ style={{
123
+ position: "absolute",
124
+ left: g.x + driftX,
125
+ top: g.y + driftY,
126
+ padding: "8px 14px",
127
+ borderRadius: 14,
128
+ ...glassBase,
129
+ opacity: intro * 0.85,
130
+ transform: `translate(-50%,-50%) scale(${0.7 + intro * 0.3}) rotate(${rot}deg)`,
131
+ fontFamily: MONO,
132
+ fontSize: g.size,
133
+ fontWeight: 600,
134
+ color: g.color,
135
+ willChange: "transform, opacity",
136
+ }}
137
+ >
138
+ {g.ch}
139
+ </div>
140
+ );
141
+ })}
142
+ </AbsoluteFill>
143
+ );
144
+ };
145
+
146
+ // ═══════════════════════════════════════════════════════════════
147
+ // CHIP — small glass capsule with optional dot
148
+ // ═══════════════════════════════════════════════════════════════
149
+ const Chip: React.FC<{
150
+ children: React.ReactNode;
151
+ dotColor?: string;
152
+ style?: React.CSSProperties;
153
+ }> = ({ children, dotColor, style }) => (
154
+ <div
155
+ style={{
156
+ ...glassBase,
157
+ borderRadius: 9999,
158
+ padding: "10px 22px",
159
+ display: "inline-flex",
160
+ alignItems: "center",
161
+ gap: 10,
162
+ fontFamily: MONO,
163
+ fontSize: 18,
164
+ fontWeight: 500,
165
+ color: C.inkSoft,
166
+ letterSpacing: "0.18em",
167
+ textTransform: "uppercase",
168
+ ...style,
169
+ }}
170
+ >
171
+ {dotColor && (
172
+ <div
173
+ style={{
174
+ width: 8,
175
+ height: 8,
176
+ borderRadius: "50%",
177
+ background: dotColor,
178
+ boxShadow: `0 0 12px ${dotColor}`,
179
+ }}
180
+ />
181
+ )}
182
+ {children}
183
+ </div>
184
+ );
185
+
186
+ // ═══════════════════════════════════════════════════════════════
187
+ // FLOW ARROW — animated SVG path with strokeDashoffset cycle
188
+ // ═══════════════════════════════════════════════════════════════
189
+ const FlowArrow: React.FC<{
190
+ d: string;
191
+ stroke?: string;
192
+ strokeWidth?: number;
193
+ speed?: number;
194
+ startFrame?: number;
195
+ }> = ({ d, stroke = C.iriViolet, strokeWidth = 3, speed = 1.2, startFrame = 0 }) => {
196
+ const frame = useCurrentFrame();
197
+ const local = Math.max(0, frame - startFrame);
198
+ // Continuous flow — dashoffset cycles every 40 frames
199
+ const dashCycle = (local * speed) % 40;
200
+ const drawIn = interpolate(local, [0, 24], [0, 1], {
201
+ extrapolateRight: "clamp",
202
+ easing: ease.expoOut,
203
+ });
204
+ return (
205
+ <svg
206
+ style={{ position: "absolute", inset: 0, width: "100%", height: "100%", pointerEvents: "none" }}
207
+ viewBox="0 0 1080 1920"
208
+ preserveAspectRatio="none"
209
+ >
210
+ <path
211
+ d={d}
212
+ fill="none"
213
+ stroke={stroke}
214
+ strokeWidth={strokeWidth}
215
+ strokeLinecap="round"
216
+ strokeDasharray="20 8"
217
+ strokeDashoffset={-dashCycle}
218
+ opacity={drawIn * 0.85}
219
+ style={{ filter: `drop-shadow(0 0 8px ${stroke})` }}
220
+ />
221
+ </svg>
222
+ );
223
+ };
224
+
225
+ // ═══════════════════════════════════════════════════════════════
226
+ // HARNESS DIAGRAM (Scene 3)
227
+ // Vertical stack: [Claude Code] [Codex CLI] → HARNESS → AI MODEL
228
+ // ═══════════════════════════════════════════════════════════════
229
+ const HarnessDiagram: React.FC<{ startFrame: number }> = ({ startFrame }) => {
230
+ const frame = useCurrentFrame();
231
+ const local = Math.max(0, frame - startFrame);
232
+
233
+ const tile = (delay: number) => {
234
+ const lo = Math.max(0, local - delay);
235
+ return {
236
+ opacity: interpolate(lo, [0, 24], [0, 1], { extrapolateRight: "clamp", easing: ease.expoOut }),
237
+ y: interpolate(lo, [0, 24], [40, 0], { extrapolateRight: "clamp", easing: ease.power3Out }),
238
+ };
239
+ };
240
+
241
+ const top = tile(0);
242
+ const mid = tile(20);
243
+ const bot = tile(40);
244
+
245
+ // pulsing border on harness layer (perpetual)
246
+ const pulse = (Math.sin(local * 0.08) + 1) * 0.5;
247
+ const harnessGlow = interpolate(pulse, [0, 1], [0.35, 0.85]);
248
+
249
+ // labels reveal inside harness layer (prompts / tools / memory / sessions)
250
+ const labels = ["prompts", "tools", "memory", "sessions"];
251
+ const labelStart = 70;
252
+
253
+ return (
254
+ <AbsoluteFill style={{ pointerEvents: "none" }}>
255
+ {/* Top row: source pills (Claude Code + Codex CLI) */}
256
+ <div
257
+ style={{
258
+ position: "absolute",
259
+ top: 460,
260
+ left: 0,
261
+ right: 0,
262
+ display: "flex",
263
+ gap: 24,
264
+ justifyContent: "center",
265
+ opacity: top.opacity,
266
+ transform: `translateY(${top.y}px)`,
267
+ willChange: "transform, opacity",
268
+ }}
269
+ >
270
+ <div
271
+ style={{
272
+ ...glassBase,
273
+ borderRadius: 24,
274
+ padding: "20px 28px",
275
+ display: "flex",
276
+ alignItems: "center",
277
+ gap: 14,
278
+ fontFamily: FONT,
279
+ fontSize: 26,
280
+ fontWeight: 600,
281
+ color: C.ink,
282
+ }}
283
+ >
284
+ <Img src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)} style={{ width: 36, height: 36 }} />
285
+ Claude Code
286
+ </div>
287
+ <div
288
+ style={{
289
+ ...glassBase,
290
+ borderRadius: 24,
291
+ padding: "20px 28px",
292
+ display: "flex",
293
+ alignItems: "center",
294
+ gap: 14,
295
+ fontFamily: FONT,
296
+ fontSize: 26,
297
+ fontWeight: 600,
298
+ color: C.ink,
299
+ }}
300
+ >
301
+ <Img src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)} style={{ width: 36, height: 36 }} />
302
+ Codex CLI
303
+ </div>
304
+ </div>
305
+
306
+ {/* Arrow from sources → harness */}
307
+ <FlowArrow
308
+ d="M 540 580 L 540 720"
309
+ stroke={C.iriViolet}
310
+ strokeWidth={4}
311
+ startFrame={startFrame + 14}
312
+ />
313
+
314
+ {/* Middle: HARNESS layer (the glowing intermediary) */}
315
+ <div
316
+ style={{
317
+ position: "absolute",
318
+ top: 760,
319
+ left: 80,
320
+ right: 80,
321
+ padding: "32px 36px",
322
+ ...glassBase,
323
+ borderRadius: 36,
324
+ opacity: mid.opacity,
325
+ transform: `translateY(${mid.y}px)`,
326
+ boxShadow: [
327
+ "0 24px 48px -12px rgba(120,100,180,0.22)",
328
+ "inset 0 1.5px 0 rgba(255,255,255,0.95)",
329
+ `0 0 ${24 + 24 * pulse}px ${C.iriViolet}${Math.round(harnessGlow * 60)
330
+ .toString(16)
331
+ .padStart(2, "0")}`,
332
+ ].join(", "),
333
+ willChange: "transform, opacity",
334
+ }}
335
+ >
336
+ <div
337
+ style={{
338
+ fontFamily: MONO,
339
+ fontSize: 16,
340
+ color: C.inkMuted,
341
+ letterSpacing: "0.18em",
342
+ textTransform: "uppercase",
343
+ marginBottom: 14,
344
+ }}
345
+ >
346
+ The Harness
347
+ </div>
348
+ <div
349
+ style={{
350
+ display: "flex",
351
+ flexWrap: "wrap",
352
+ gap: 12,
353
+ fontFamily: FONT,
354
+ }}
355
+ >
356
+ {labels.map((l, i) => {
357
+ const lo = Math.max(0, local - (labelStart + i * 14));
358
+ const op = interpolate(lo, [0, 18], [0, 1], { extrapolateRight: "clamp" });
359
+ const sc = interpolate(lo, [0, 18], [0.7, 1], {
360
+ extrapolateRight: "clamp",
361
+ easing: ease.backOut,
362
+ });
363
+ return (
364
+ <div
365
+ key={l}
366
+ style={{
367
+ ...glassBase,
368
+ borderRadius: 9999,
369
+ padding: "10px 22px",
370
+ fontSize: 22,
371
+ fontWeight: 600,
372
+ color: C.ink,
373
+ opacity: op,
374
+ transform: `scale(${sc})`,
375
+ willChange: "transform, opacity",
376
+ }}
377
+ >
378
+ {l}
379
+ </div>
380
+ );
381
+ })}
382
+ </div>
383
+ </div>
384
+
385
+ {/* Arrow from harness → AI model */}
386
+ <FlowArrow
387
+ d="M 540 1070 L 540 1200"
388
+ stroke={C.iriCyan}
389
+ strokeWidth={4}
390
+ startFrame={startFrame + 32}
391
+ />
392
+
393
+ {/* Bottom: AI MODEL sphere */}
394
+ <div
395
+ style={{
396
+ position: "absolute",
397
+ top: 1250,
398
+ left: 0,
399
+ right: 0,
400
+ display: "flex",
401
+ justifyContent: "center",
402
+ opacity: bot.opacity,
403
+ transform: `translateY(${bot.y}px)`,
404
+ willChange: "transform, opacity",
405
+ }}
406
+ >
407
+ <div
408
+ style={{
409
+ position: "relative",
410
+ width: 220,
411
+ height: 220,
412
+ }}
413
+ >
414
+ <IridescentRing size={220} thickness={3} speed={1.2} borderRadius={9999} />
415
+ <div
416
+ style={{
417
+ position: "absolute",
418
+ inset: 4,
419
+ borderRadius: "50%",
420
+ background: `radial-gradient(circle at 35% 30%, #fff 0%, ${C.iriCyan} 35%, ${C.iriViolet} 80%)`,
421
+ boxShadow: `0 12px 40px ${C.iriViolet}80`,
422
+ display: "flex",
423
+ alignItems: "center",
424
+ justifyContent: "center",
425
+ fontFamily: MONO,
426
+ fontSize: 22,
427
+ fontWeight: 600,
428
+ color: "#fff",
429
+ letterSpacing: "0.18em",
430
+ textTransform: "uppercase",
431
+ }}
432
+ >
433
+ AI Model
434
+ </div>
435
+ </div>
436
+ </div>
437
+ </AbsoluteFill>
438
+ );
439
+ };
440
+
441
+ // ═══════════════════════════════════════════════════════════════
442
+ // MEMORY CONSTELLATION (Scene 5)
443
+ // 8 glass nodes connected by drawing-in lines, breathing pulses
444
+ // ═══════════════════════════════════════════════════════════════
445
+ const MemoryConstellation: React.FC<{ startFrame: number }> = ({ startFrame }) => {
446
+ const frame = useCurrentFrame();
447
+ const local = Math.max(0, frame - startFrame);
448
+
449
+ // 8 nodes positioned around a soft elliptical orbit centered at (540, 960)
450
+ const nodes = [
451
+ { x: 540, y: 720, label: "ctx" },
452
+ { x: 760, y: 800, label: "files" },
453
+ { x: 860, y: 980, label: "decisions" },
454
+ { x: 760, y: 1160, label: "user" },
455
+ { x: 540, y: 1220, label: "goals" },
456
+ { x: 320, y: 1160, label: "stack" },
457
+ { x: 220, y: 980, label: "errors" },
458
+ { x: 320, y: 800, label: "diffs" },
459
+ ];
460
+
461
+ // edges (subset — neural-map look without overcrowding)
462
+ const edges: Array<[number, number]> = [
463
+ [0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 0],
464
+ [0, 4], [2, 6], [1, 5], [3, 7],
465
+ ];
466
+
467
+ return (
468
+ <AbsoluteFill style={{ pointerEvents: "none" }}>
469
+ {/* Edges — SVG, drawing in via strokeDashoffset */}
470
+ <svg
471
+ style={{ position: "absolute", inset: 0, width: "100%", height: "100%" }}
472
+ viewBox="0 0 1080 1920"
473
+ preserveAspectRatio="none"
474
+ >
475
+ {edges.map(([a, b], i) => {
476
+ const A = nodes[a];
477
+ const B = nodes[b];
478
+ const len = Math.hypot(B.x - A.x, B.y - A.y);
479
+ const drawIn = interpolate(
480
+ local,
481
+ [10 + i * 5, 40 + i * 5],
482
+ [len, 0],
483
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: ease.expoOut },
484
+ );
485
+ const op = interpolate(local, [10 + i * 5, 40 + i * 5], [0, 0.6], {
486
+ extrapolateLeft: "clamp",
487
+ extrapolateRight: "clamp",
488
+ });
489
+ return (
490
+ <line
491
+ key={i}
492
+ x1={A.x}
493
+ y1={A.y}
494
+ x2={B.x}
495
+ y2={B.y}
496
+ stroke={i % 2 === 0 ? C.iriViolet : C.iriCyan}
497
+ strokeWidth={2}
498
+ strokeDasharray={len}
499
+ strokeDashoffset={drawIn}
500
+ opacity={op}
501
+ />
502
+ );
503
+ })}
504
+ </svg>
505
+
506
+ {/* Nodes — glass orbs with breathing pulse */}
507
+ {nodes.map((n, i) => {
508
+ const birth = i * 5;
509
+ const lo = Math.max(0, local - birth);
510
+ const intro = interpolate(lo, [0, 24], [0, 1], {
511
+ extrapolateRight: "clamp",
512
+ easing: ease.backOut,
513
+ });
514
+ const breath = (Math.sin(local * 0.06 + i * 0.7) + 1) * 0.5;
515
+ const scale = intro * (1 + breath * 0.08);
516
+ return (
517
+ <div
518
+ key={i}
519
+ style={{
520
+ position: "absolute",
521
+ left: n.x,
522
+ top: n.y,
523
+ transform: `translate(-50%,-50%) scale(${scale})`,
524
+ willChange: "transform",
525
+ opacity: intro,
526
+ }}
527
+ >
528
+ <div
529
+ style={{
530
+ ...glassBase,
531
+ borderRadius: 9999,
532
+ width: 110,
533
+ height: 110,
534
+ display: "flex",
535
+ alignItems: "center",
536
+ justifyContent: "center",
537
+ fontFamily: MONO,
538
+ fontSize: 16,
539
+ fontWeight: 600,
540
+ color: C.ink,
541
+ boxShadow: [
542
+ "0 12px 30px -8px rgba(120,100,180,0.25)",
543
+ "inset 0 1.5px 0 rgba(255,255,255,0.95)",
544
+ `0 0 ${14 + breath * 14}px ${i % 3 === 0 ? JC.rust : i % 2 === 0 ? C.iriViolet : C.iriCyan}55`,
545
+ ].join(", "),
546
+ }}
547
+ >
548
+ {n.label}
549
+ </div>
550
+ </div>
551
+ );
552
+ })}
553
+
554
+ {/* Center heart — "memory" core */}
555
+ <div
556
+ style={{
557
+ position: "absolute",
558
+ left: 540,
559
+ top: 970,
560
+ transform: "translate(-50%,-50%)",
561
+ }}
562
+ >
563
+ <div
564
+ style={{
565
+ position: "relative",
566
+ width: 140,
567
+ height: 140,
568
+ }}
569
+ >
570
+ <IridescentRing size={140} thickness={3} speed={0.8} borderRadius={9999} />
571
+ <div
572
+ style={{
573
+ position: "absolute",
574
+ inset: 4,
575
+ borderRadius: "50%",
576
+ background: `radial-gradient(circle at 35% 35%, ${JC.rustSoft} 0%, ${JC.rust} 60%, ${JC.rustDeep} 100%)`,
577
+ display: "flex",
578
+ alignItems: "center",
579
+ justifyContent: "center",
580
+ color: "#fff",
581
+ fontFamily: MONO,
582
+ fontSize: 14,
583
+ fontWeight: 700,
584
+ letterSpacing: "0.2em",
585
+ textTransform: "uppercase",
586
+ boxShadow: `0 0 32px ${JC.rust}88`,
587
+ }}
588
+ >
589
+ mem
590
+ </div>
591
+ </div>
592
+ </div>
593
+ </AbsoluteFill>
594
+ );
595
+ };
596
+
597
+ // ═══════════════════════════════════════════════════════════════
598
+ // AGENT SWARM DIAGRAM (Scene 7)
599
+ // Coordinator orb center + 6 worker orbs spawning outward + connections
600
+ // ═══════════════════════════════════════════════════════════════
601
+ const AgentSwarmDiagram: React.FC<{ startFrame: number; fps: number }> = ({
602
+ startFrame,
603
+ fps,
604
+ }) => {
605
+ const frame = useCurrentFrame();
606
+ const local = Math.max(0, frame - startFrame);
607
+
608
+ // 6 workers in circular orbit
609
+ const workers = Array.from({ length: 6 }, (_, i) => {
610
+ const angle = (i / 6) * Math.PI * 2 - Math.PI / 2;
611
+ return {
612
+ angle,
613
+ orbit: 360,
614
+ birth: 18 + i * 14,
615
+ label: `agent ${i + 1}`,
616
+ };
617
+ });
618
+
619
+ // Centralize on viewport center: x=540, y=960 (true center of 1080x1920)
620
+ const CX = 540;
621
+ const CY = 960;
622
+ const ORBIT = 320;
623
+ const WORKER_SIZE = 100;
624
+ const COORD_SIZE = 200;
625
+
626
+ return (
627
+ <AbsoluteFill style={{ pointerEvents: "none" }}>
628
+ {/* Orbit ring (faint, perfectly centered) */}
629
+ <div
630
+ style={{
631
+ position: "absolute",
632
+ left: CX - ORBIT,
633
+ top: CY - ORBIT,
634
+ width: ORBIT * 2,
635
+ height: ORBIT * 2,
636
+ border: `1px dashed ${C.hairline}`,
637
+ borderRadius: "50%",
638
+ opacity: interpolate(local, [10, 30], [0, 0.6], { extrapolateRight: "clamp" }),
639
+ }}
640
+ />
641
+
642
+ {/* Connection lines via SVG positioned at viewport center */}
643
+ <svg
644
+ style={{
645
+ position: "absolute",
646
+ left: 0,
647
+ top: 0,
648
+ width: "100%",
649
+ height: "100%",
650
+ pointerEvents: "none",
651
+ }}
652
+ viewBox="0 0 1080 1920"
653
+ preserveAspectRatio="none"
654
+ >
655
+ <defs>
656
+ <linearGradient id="conn-grad" x1="0%" y1="0%" x2="100%" y2="0%">
657
+ <stop offset="0%" stopColor={JC.rust} stopOpacity="0.9" />
658
+ <stop offset="100%" stopColor={C.iriCyan} stopOpacity="0.6" />
659
+ </linearGradient>
660
+ </defs>
661
+ {workers.map((w, i) => {
662
+ const lo = Math.max(0, local - w.birth);
663
+ const draw = interpolate(lo, [0, 24], [0, 1], {
664
+ extrapolateRight: "clamp",
665
+ easing: ease.expoOut,
666
+ });
667
+ const x2 = CX + Math.cos(w.angle) * ORBIT * draw;
668
+ const y2 = CY + Math.sin(w.angle) * ORBIT * draw;
669
+ const dashCycle = (local * 1.4 + i * 5) % 24;
670
+ return (
671
+ <line
672
+ key={i}
673
+ x1={CX}
674
+ y1={CY}
675
+ x2={x2}
676
+ y2={y2}
677
+ stroke="url(#conn-grad)"
678
+ strokeWidth={2.5}
679
+ strokeDasharray="12 6"
680
+ strokeDashoffset={-dashCycle}
681
+ opacity={draw * 0.85}
682
+ />
683
+ );
684
+ })}
685
+ </svg>
686
+
687
+ {/* Workers — glass orbs spawn outward via spring, centered around (CX, CY) */}
688
+ {workers.map((w, i) => {
689
+ const lo = Math.max(0, local - w.birth);
690
+ const sp = spring({
691
+ frame: lo,
692
+ fps,
693
+ from: 0,
694
+ to: 1,
695
+ config: { damping: 14, stiffness: 95, mass: 0.7 },
696
+ });
697
+ const x = CX + Math.cos(w.angle) * ORBIT * sp;
698
+ const y = CY + Math.sin(w.angle) * ORBIT * sp;
699
+ const breath = (Math.sin(local * 0.1 + i * 1.1) + 1) * 0.5;
700
+ return (
701
+ <div
702
+ key={i}
703
+ style={{
704
+ position: "absolute",
705
+ left: x - WORKER_SIZE / 2,
706
+ top: y - WORKER_SIZE / 2,
707
+ width: WORKER_SIZE,
708
+ height: WORKER_SIZE,
709
+ transform: `scale(${sp})`,
710
+ transformOrigin: "center",
711
+ willChange: "transform",
712
+ }}
713
+ >
714
+ <div
715
+ style={{
716
+ ...glassBase,
717
+ borderRadius: "50%",
718
+ width: "100%",
719
+ height: "100%",
720
+ display: "flex",
721
+ alignItems: "center",
722
+ justifyContent: "center",
723
+ fontFamily: MONO,
724
+ fontSize: 14,
725
+ fontWeight: 600,
726
+ color: C.ink,
727
+ boxShadow: [
728
+ "0 12px 24px -6px rgba(120,100,180,0.25)",
729
+ "inset 0 1.5px 0 rgba(255,255,255,0.95)",
730
+ `0 0 ${10 + breath * 14}px ${C.iriCyan}55`,
731
+ ].join(", "),
732
+ }}
733
+ >
734
+ {w.label}
735
+ </div>
736
+ </div>
737
+ );
738
+ })}
739
+
740
+ {/* Inner sonar pulses — centered on (CX, CY) */}
741
+ {[0, 30, 60].map((p, i) => {
742
+ const cycle = (local + p) % 90;
743
+ const sc = interpolate(cycle, [0, 90], [0.6, 2.0], { easing: ease.expoOut });
744
+ const op = interpolate(cycle, [0, 30, 90], [0, 0.45, 0]);
745
+ return (
746
+ <div
747
+ key={i}
748
+ style={{
749
+ position: "absolute",
750
+ left: CX - COORD_SIZE / 2,
751
+ top: CY - COORD_SIZE / 2,
752
+ width: COORD_SIZE,
753
+ height: COORD_SIZE,
754
+ borderRadius: "50%",
755
+ border: `2px solid ${JC.rust}`,
756
+ transform: `scale(${sc})`,
757
+ transformOrigin: "center",
758
+ opacity: op,
759
+ }}
760
+ />
761
+ );
762
+ })}
763
+
764
+ {/* Coordinator orb — exact viewport-centered */}
765
+ <div
766
+ style={{
767
+ position: "absolute",
768
+ left: CX - COORD_SIZE / 2,
769
+ top: CY - COORD_SIZE / 2,
770
+ width: COORD_SIZE,
771
+ height: COORD_SIZE,
772
+ }}
773
+ >
774
+ <IridescentRing size={COORD_SIZE} thickness={4} speed={1.4} borderRadius={9999} />
775
+ <div
776
+ style={{
777
+ position: "absolute",
778
+ inset: 4,
779
+ borderRadius: "50%",
780
+ background: `radial-gradient(circle at 35% 30%, #fff 0%, ${JC.rustSoft} 30%, ${JC.rust} 80%)`,
781
+ display: "flex",
782
+ flexDirection: "column",
783
+ alignItems: "center",
784
+ justifyContent: "center",
785
+ fontFamily: MONO,
786
+ color: "#fff",
787
+ boxShadow: `0 12px 40px ${JC.rust}80`,
788
+ }}
789
+ >
790
+ <div style={{ fontSize: 12, letterSpacing: "0.22em", opacity: 0.85, textTransform: "uppercase" }}>
791
+ coordinator
792
+ </div>
793
+ <div style={{ fontSize: 24, fontWeight: 700, marginTop: 4 }}>0</div>
794
+ </div>
795
+ </div>
796
+ </AbsoluteFill>
797
+ );
798
+ };
799
+
800
+ // ═══════════════════════════════════════════════════════════════
801
+ // COMMENT MORPH CHIP (Scene 8)
802
+ // Speech bubble with "AI" → morphs into DM envelope
803
+ // ═══════════════════════════════════════════════════════════════
804
+ const CommentMorphChip: React.FC<{ startFrame: number }> = ({ startFrame }) => {
805
+ const frame = useCurrentFrame();
806
+ const local = Math.max(0, frame - startFrame);
807
+
808
+ // Phase 1: speech-bubble scale-pop (0-30)
809
+ // Phase 2: settle (30-90)
810
+ // Phase 3: crossfade to envelope (90-120)
811
+ // Phase 4: envelope holds (120+)
812
+ const popIn = interpolate(local, [0, 24], [0, 1], {
813
+ extrapolateRight: "clamp",
814
+ easing: ease.backOut,
815
+ });
816
+ const bubbleOpacity = interpolate(local, [0, 24, 90, 110], [0, 1, 1, 0], {
817
+ extrapolateLeft: "clamp",
818
+ extrapolateRight: "clamp",
819
+ });
820
+ const envelopeOpacity = interpolate(local, [90, 110], [0, 1], {
821
+ extrapolateLeft: "clamp",
822
+ extrapolateRight: "clamp",
823
+ });
824
+ const envelopeScale = interpolate(local, [90, 110], [0.7, 1], {
825
+ extrapolateLeft: "clamp",
826
+ extrapolateRight: "clamp",
827
+ easing: ease.backOut,
828
+ });
829
+
830
+ return (
831
+ <div style={{ position: "relative", width: 280, height: 220 }}>
832
+ {/* Bubble */}
833
+ <div
834
+ style={{
835
+ position: "absolute",
836
+ inset: 0,
837
+ opacity: bubbleOpacity,
838
+ transform: `scale(${popIn})`,
839
+ willChange: "transform, opacity",
840
+ }}
841
+ >
842
+ <svg viewBox="0 0 280 220" style={{ width: "100%", height: "100%", overflow: "visible" }}>
843
+ <defs>
844
+ <linearGradient id="bubble-fill" x1="0%" y1="0%" x2="100%" y2="100%">
845
+ <stop offset="0%" stopColor="#FFFFFFE6" />
846
+ <stop offset="100%" stopColor="#FFFFFFB3" />
847
+ </linearGradient>
848
+ </defs>
849
+ <path
850
+ d="M 30 30 H 250 a 24 24 0 0 1 24 24 v 100 a 24 24 0 0 1 -24 24 H 130 l -36 36 v -36 H 30 a 24 24 0 0 1 -24 -24 V 54 a 24 24 0 0 1 24 -24 z"
851
+ fill="url(#bubble-fill)"
852
+ stroke={C.glassBorder}
853
+ strokeWidth={2}
854
+ style={{ filter: `drop-shadow(0 12px 32px ${C.iriViolet}55)` }}
855
+ />
856
+ </svg>
857
+ <div
858
+ style={{
859
+ position: "absolute",
860
+ top: 56,
861
+ left: 0,
862
+ right: 30,
863
+ textAlign: "center",
864
+ fontFamily: FONT,
865
+ fontSize: 84,
866
+ fontWeight: 800,
867
+ color: JC.rust,
868
+ letterSpacing: "-0.04em",
869
+ lineHeight: 1,
870
+ }}
871
+ >
872
+ AI
873
+ </div>
874
+ </div>
875
+
876
+ {/* Envelope (DM) */}
877
+ <div
878
+ style={{
879
+ position: "absolute",
880
+ inset: 0,
881
+ opacity: envelopeOpacity,
882
+ transform: `scale(${envelopeScale})`,
883
+ willChange: "transform, opacity",
884
+ }}
885
+ >
886
+ <svg viewBox="0 0 280 220" style={{ width: "100%", height: "100%", overflow: "visible" }}>
887
+ <defs>
888
+ <linearGradient id="env-fill" x1="0%" y1="0%" x2="100%" y2="100%">
889
+ <stop offset="0%" stopColor={JC.rust} />
890
+ <stop offset="100%" stopColor={JC.rustDeep} />
891
+ </linearGradient>
892
+ </defs>
893
+ <rect
894
+ x={20}
895
+ y={50}
896
+ width={240}
897
+ height={140}
898
+ rx={20}
899
+ fill="url(#env-fill)"
900
+ style={{ filter: `drop-shadow(0 16px 36px ${JC.rust}80)` }}
901
+ />
902
+ <path
903
+ d="M 20 60 L 140 140 L 260 60"
904
+ fill="none"
905
+ stroke="#fff"
906
+ strokeWidth={4}
907
+ strokeLinecap="round"
908
+ strokeLinejoin="round"
909
+ />
910
+ <text
911
+ x={140}
912
+ y={172}
913
+ textAnchor="middle"
914
+ fontFamily={MONO}
915
+ fontSize={18}
916
+ fontWeight={600}
917
+ fill="#fff"
918
+ letterSpacing="0.18em"
919
+ >
920
+ DM SENT
921
+ </text>
922
+ </svg>
923
+ </div>
924
+ </div>
925
+ );
926
+ };
927
+
928
+ // ═══════════════════════════════════════════════════════════════
929
+ // CHROMATIC STREAK NUMBER — number with R/G/B channel offset
930
+ // (used in Scene 4 corner re-callbacks)
931
+ // ═══════════════════════════════════════════════════════════════
932
+ const ChromaticStat: React.FC<{
933
+ text: string;
934
+ startFrame: number;
935
+ size: number;
936
+ color?: string;
937
+ }> = ({ text, startFrame, size, color = C.ink }) => {
938
+ const frame = useCurrentFrame();
939
+ const local = Math.max(0, frame - startFrame);
940
+ const slide = interpolate(local, [0, 30], [120, 0], {
941
+ extrapolateLeft: "clamp",
942
+ extrapolateRight: "clamp",
943
+ easing: ease.expoOut,
944
+ });
945
+ const op = interpolate(local, [0, 18], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
946
+ const offset = interpolate(local, [0, 30], [10, 0], {
947
+ extrapolateLeft: "clamp",
948
+ extrapolateRight: "clamp",
949
+ easing: ease.expoOut,
950
+ });
951
+ return (
952
+ <div style={{ position: "relative", opacity: op, transform: `translateX(${slide}px)` }}>
953
+ <span
954
+ style={{
955
+ position: "absolute",
956
+ left: -offset,
957
+ top: 0,
958
+ fontFamily: MONO,
959
+ fontSize: size,
960
+ fontWeight: 700,
961
+ color: "#FF3344",
962
+ mixBlendMode: "multiply",
963
+ opacity: 0.7,
964
+ }}
965
+ >
966
+ {text}
967
+ </span>
968
+ <span
969
+ style={{
970
+ position: "absolute",
971
+ left: offset,
972
+ top: 0,
973
+ fontFamily: MONO,
974
+ fontSize: size,
975
+ fontWeight: 700,
976
+ color: "#22DDFF",
977
+ mixBlendMode: "multiply",
978
+ opacity: 0.7,
979
+ }}
980
+ >
981
+ {text}
982
+ </span>
983
+ <span
984
+ style={{
985
+ position: "relative",
986
+ fontFamily: MONO,
987
+ fontSize: size,
988
+ fontWeight: 700,
989
+ color,
990
+ }}
991
+ >
992
+ {text}
993
+ </span>
994
+ </div>
995
+ );
996
+ };
997
+
998
+ // ═══════════════════════════════════════════════════════════════
999
+ // SCENE 1 — HOOK (0–348, 11.6s)
1000
+ // VO: "63 times faster than Codex. 20 times more memory efficient
1001
+ // than Claude Code. Built-in memory, parallel sessions, agent
1002
+ // swarms... and it's completely free. Built by one guy."
1003
+ // ═══════════════════════════════════════════════════════════════
1004
+ const HookScene: React.FC = () => {
1005
+ const frame = useCurrentFrame();
1006
+ const { fps } = useVideoConfig();
1007
+ const local = frame - BEAT.hook;
1008
+
1009
+ // Beat-aligned reveals (timed against subtitle 1: 0-6.82s, 16 words)
1010
+ // 63 → 0s, 20 → ~2.6s (frame 78), built-in memory chip → ~5.6s (frame 168),
1011
+ // FREE → ~6.5s (frame 195), built by one guy → ~10.7s (frame 320)
1012
+ const F_63 = 8;
1013
+ const F_20 = 78;
1014
+ const F_KEYWORDS = 168;
1015
+ const F_FREE = 220;
1016
+ const F_TAG = 320;
1017
+
1018
+ return (
1019
+ <AbsoluteFill>
1020
+ {/* Layer 1: Sonar rings */}
1021
+ <SonarRings />
1022
+
1023
+ {/* Layer 2: Three light beams */}
1024
+ <LightBeam delay={F_63 + 6} angle={-18} />
1025
+ <LightBeam delay={F_20 + 6} angle={22} />
1026
+ <LightBeam delay={F_KEYWORDS + 6} angle={-12} />
1027
+
1028
+ {/* Layer 3: Particle burst */}
1029
+ <ParticleBurst />
1030
+
1031
+ {/* Layer 4: Floating code glyphs */}
1032
+ <FloatingGlyphs startFrame={20} />
1033
+
1034
+ {/* Layer 6 — Stat counter "63×" */}
1035
+ <div
1036
+ style={{
1037
+ position: "absolute",
1038
+ left: 80,
1039
+ top: 440,
1040
+ opacity: interpolate(local, [F_63, F_63 + 12], [0, 1], {
1041
+ extrapolateLeft: "clamp",
1042
+ extrapolateRight: "clamp",
1043
+ }),
1044
+ transform: `translateY(${interpolate(local, [F_63, F_63 + 24], [40, 0], {
1045
+ extrapolateLeft: "clamp",
1046
+ extrapolateRight: "clamp",
1047
+ easing: ease.expoOut,
1048
+ })}px)`,
1049
+ }}
1050
+ >
1051
+ <div style={{ display: "flex", alignItems: "baseline", gap: 12 }}>
1052
+ <ScrambleText
1053
+ text="63"
1054
+ startFrame={F_63}
1055
+ duration={20}
1056
+ fontSize={240}
1057
+ fontWeight={800}
1058
+ fontFamily={MONO}
1059
+ color={JC.rust}
1060
+ letterSpacing="-0.06em"
1061
+ />
1062
+ <span
1063
+ style={{
1064
+ fontFamily: MONO,
1065
+ fontSize: 120,
1066
+ fontWeight: 600,
1067
+ color: C.inkSoft,
1068
+ letterSpacing: "-0.04em",
1069
+ }}
1070
+ >
1071
+ ×
1072
+ </span>
1073
+ </div>
1074
+ <div
1075
+ style={{
1076
+ fontFamily: MONO,
1077
+ fontSize: 22,
1078
+ fontWeight: 600,
1079
+ color: C.inkMuted,
1080
+ letterSpacing: "0.18em",
1081
+ textTransform: "uppercase",
1082
+ marginTop: 4,
1083
+ }}
1084
+ >
1085
+ faster than codex
1086
+ </div>
1087
+ </div>
1088
+
1089
+ {/* Stat counter "20×" — slides in from right */}
1090
+ <div
1091
+ style={{
1092
+ position: "absolute",
1093
+ right: 60,
1094
+ top: 800,
1095
+ textAlign: "right",
1096
+ opacity: interpolate(local, [F_20, F_20 + 14], [0, 1], {
1097
+ extrapolateLeft: "clamp",
1098
+ extrapolateRight: "clamp",
1099
+ }),
1100
+ transform: `translateX(${interpolate(local, [F_20, F_20 + 28], [80, 0], {
1101
+ extrapolateLeft: "clamp",
1102
+ extrapolateRight: "clamp",
1103
+ easing: ease.expoOut,
1104
+ })}px)`,
1105
+ }}
1106
+ >
1107
+ <div style={{ display: "flex", alignItems: "baseline", gap: 12, justifyContent: "flex-end" }}>
1108
+ <ScrambleText
1109
+ text="20"
1110
+ startFrame={F_20}
1111
+ duration={20}
1112
+ fontSize={220}
1113
+ fontWeight={800}
1114
+ fontFamily={MONO}
1115
+ color={C.iriViolet}
1116
+ letterSpacing="-0.06em"
1117
+ />
1118
+ <span
1119
+ style={{
1120
+ fontFamily: MONO,
1121
+ fontSize: 110,
1122
+ fontWeight: 600,
1123
+ color: C.inkSoft,
1124
+ letterSpacing: "-0.04em",
1125
+ }}
1126
+ >
1127
+ ×
1128
+ </span>
1129
+ </div>
1130
+ <div
1131
+ style={{
1132
+ fontFamily: MONO,
1133
+ fontSize: 22,
1134
+ fontWeight: 600,
1135
+ color: C.inkMuted,
1136
+ letterSpacing: "0.18em",
1137
+ textTransform: "uppercase",
1138
+ marginTop: 4,
1139
+ }}
1140
+ >
1141
+ less ram than claude code
1142
+ </div>
1143
+ </div>
1144
+
1145
+ {/* Keyword chips reveal: MEMORY · PARALLEL · SWARMS */}
1146
+ <div
1147
+ style={{
1148
+ position: "absolute",
1149
+ left: 0,
1150
+ right: 0,
1151
+ top: 1100,
1152
+ display: "flex",
1153
+ flexWrap: "wrap",
1154
+ gap: 12,
1155
+ justifyContent: "center",
1156
+ padding: "0 60px",
1157
+ }}
1158
+ >
1159
+ {[
1160
+ { label: "memory", color: C.iriCyan, delay: 0 },
1161
+ { label: "parallel", color: C.iriViolet, delay: 16 },
1162
+ { label: "swarms", color: JC.rust, delay: 32 },
1163
+ ].map((k) => {
1164
+ const lo = Math.max(0, local - (F_KEYWORDS + k.delay));
1165
+ const sp = spring({
1166
+ frame: lo,
1167
+ fps,
1168
+ from: 0,
1169
+ to: 1,
1170
+ config: { damping: 12, stiffness: 100 },
1171
+ });
1172
+ return (
1173
+ <Chip
1174
+ key={k.label}
1175
+ dotColor={k.color}
1176
+ style={{
1177
+ opacity: sp,
1178
+ transform: `scale(${0.6 + sp * 0.4})`,
1179
+ fontSize: 22,
1180
+ }}
1181
+ >
1182
+ {k.label}
1183
+ </Chip>
1184
+ );
1185
+ })}
1186
+ </div>
1187
+
1188
+ {/* Built by one guy tag */}
1189
+ <div
1190
+ style={{
1191
+ position: "absolute",
1192
+ left: 0,
1193
+ right: 0,
1194
+ top: 1430,
1195
+ textAlign: "center",
1196
+ opacity: interpolate(local, [F_TAG, F_TAG + 18], [0, 1], {
1197
+ extrapolateLeft: "clamp",
1198
+ extrapolateRight: "clamp",
1199
+ }),
1200
+ transform: `translateY(${interpolate(local, [F_TAG, F_TAG + 24], [20, 0], {
1201
+ extrapolateLeft: "clamp",
1202
+ extrapolateRight: "clamp",
1203
+ easing: ease.expoOut,
1204
+ })}px)`,
1205
+ }}
1206
+ >
1207
+ <Chip dotColor={C.iriRose} style={{ fontSize: 18 }}>
1208
+ built by one guy
1209
+ </Chip>
1210
+ </div>
1211
+ </AbsoluteFill>
1212
+ );
1213
+ };
1214
+
1215
+ // ═══════════════════════════════════════════════════════════════
1216
+ // SCENE 2 — INTRO (348–554, 6.9s)
1217
+ // VO: "Welcome back guys. The tool's called jcode...
1218
+ // and once you see what it actually does, you might never
1219
+ // go back to the others."
1220
+ // ═══════════════════════════════════════════════════════════════
1221
+ const IntroScene: React.FC = () => {
1222
+ const frame = useCurrentFrame();
1223
+ const { fps } = useVideoConfig();
1224
+ const local = frame - BEAT.intro;
1225
+
1226
+ // jcode logotype — letters scale-blur entry, stagger 4 frames
1227
+ const letters = "jcode".split("");
1228
+ const F_WELCOME = 0;
1229
+ const F_LOGO = 30;
1230
+ const F_SUBTITLE = 96;
1231
+
1232
+ // logo halo pulse (perpetual)
1233
+ const haloPulse = (Math.sin(local * 0.06) + 1) * 0.5;
1234
+
1235
+ return (
1236
+ <AbsoluteFill>
1237
+ {/* Floating glyphs continue from hook */}
1238
+ <FloatingGlyphs startFrame={-300} />
1239
+
1240
+ {/* "Welcome back" eyebrow */}
1241
+ <div
1242
+ style={{
1243
+ position: "absolute",
1244
+ top: 460,
1245
+ left: 0,
1246
+ right: 0,
1247
+ display: "flex",
1248
+ justifyContent: "center",
1249
+ opacity: interpolate(local, [F_WELCOME, F_WELCOME + 18], [0, 1], {
1250
+ extrapolateLeft: "clamp",
1251
+ extrapolateRight: "clamp",
1252
+ }),
1253
+ transform: `translateY(${interpolate(
1254
+ local,
1255
+ [F_WELCOME, F_WELCOME + 24],
1256
+ [16, 0],
1257
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: ease.expoOut },
1258
+ )}px)`,
1259
+ }}
1260
+ >
1261
+ <EyebrowPill>Welcome back · the tool</EyebrowPill>
1262
+ </div>
1263
+
1264
+ {/* jcode logotype — center */}
1265
+ <div
1266
+ style={{
1267
+ position: "absolute",
1268
+ inset: 0,
1269
+ display: "flex",
1270
+ alignItems: "center",
1271
+ justifyContent: "center",
1272
+ }}
1273
+ >
1274
+ {/* halo behind logo */}
1275
+ <div
1276
+ style={{
1277
+ position: "absolute",
1278
+ width: 900,
1279
+ height: 320,
1280
+ borderRadius: "50%",
1281
+ background: `radial-gradient(ellipse at center, ${JC.rust}40 0%, ${JC.rust}10 40%, transparent 70%)`,
1282
+ filter: "blur(40px)",
1283
+ opacity: 0.4 + haloPulse * 0.4,
1284
+ }}
1285
+ />
1286
+ <div
1287
+ style={{
1288
+ position: "relative",
1289
+ display: "flex",
1290
+ gap: "0.04em",
1291
+ fontFamily: FONT,
1292
+ fontSize: 280,
1293
+ fontWeight: 800,
1294
+ letterSpacing: "-0.06em",
1295
+ lineHeight: 1,
1296
+ color: C.ink,
1297
+ }}
1298
+ >
1299
+ {letters.map((ch, i) => {
1300
+ const lo = Math.max(0, local - (F_LOGO + i * 4));
1301
+ const op = interpolate(lo, [0, 22], [0, 1], {
1302
+ extrapolateRight: "clamp",
1303
+ easing: ease.expoOut,
1304
+ });
1305
+ const sc = interpolate(lo, [0, 22], [0.4, 1], {
1306
+ extrapolateRight: "clamp",
1307
+ easing: ease.backOut,
1308
+ });
1309
+ const blur = interpolate(lo, [0, 22], [16, 0], { extrapolateRight: "clamp" });
1310
+ return (
1311
+ <span
1312
+ key={i}
1313
+ style={{
1314
+ display: "inline-block",
1315
+ opacity: op,
1316
+ transform: `scale(${sc})`,
1317
+ filter: `blur(${blur}px)`,
1318
+ willChange: "transform, opacity, filter",
1319
+ // last char gets rust accent
1320
+ color: i === 0 ? JC.rust : C.ink,
1321
+ }}
1322
+ >
1323
+ {ch}
1324
+ </span>
1325
+ );
1326
+ })}
1327
+ </div>
1328
+ </div>
1329
+
1330
+ {/* Subtitle */}
1331
+ <div
1332
+ style={{
1333
+ position: "absolute",
1334
+ left: 80,
1335
+ right: 80,
1336
+ top: 1180,
1337
+ textAlign: "center",
1338
+ }}
1339
+ >
1340
+ <StaggeredWords
1341
+ text="the harness you might never go back from"
1342
+ startFrame={BEAT.intro + F_SUBTITLE}
1343
+ fontSize={42}
1344
+ fontWeight={500}
1345
+ color={C.inkSoft}
1346
+ align="center"
1347
+ perWordDelay={3}
1348
+ duration={20}
1349
+ letterSpacing="-0.02em"
1350
+ highlight="harness"
1351
+ highlightColor={JC.rust}
1352
+ />
1353
+ </div>
1354
+ </AbsoluteFill>
1355
+ );
1356
+ };
1357
+
1358
+ // ═══════════════════════════════════════════════════════════════
1359
+ // SCENE 3 — HARNESS EXPLAIN (554–907, 11.8s)
1360
+ // VO: "So here's the thing. Tools like Claude Code and Codex CLI
1361
+ // have a layer sitting between you and the AI model. It handles
1362
+ // your prompts, your tools, your memory, your sessions.
1363
+ // It's called a harness."
1364
+ // ═══════════════════════════════════════════════════════════════
1365
+ const HarnessScene: React.FC = () => {
1366
+ const frame = useCurrentFrame();
1367
+ const local = frame - BEAT.harness;
1368
+
1369
+ return (
1370
+ <AbsoluteFill>
1371
+ <FloatingGlyphs startFrame={-500} />
1372
+
1373
+ {/* eyebrow */}
1374
+ <div
1375
+ style={{
1376
+ position: "absolute",
1377
+ top: 320,
1378
+ left: 0,
1379
+ right: 0,
1380
+ display: "flex",
1381
+ justifyContent: "center",
1382
+ opacity: interpolate(local, [0, 18], [0, 1], {
1383
+ extrapolateLeft: "clamp",
1384
+ extrapolateRight: "clamp",
1385
+ }),
1386
+ }}
1387
+ >
1388
+ <EyebrowPill>How they work today</EyebrowPill>
1389
+ </div>
1390
+
1391
+ {/* Diagram */}
1392
+ <HarnessDiagram startFrame={BEAT.harness + 12} />
1393
+
1394
+ {/* "It's called a harness" payoff line — appears late in scene */}
1395
+ <div
1396
+ style={{
1397
+ position: "absolute",
1398
+ left: 80,
1399
+ right: 80,
1400
+ top: 1500,
1401
+ textAlign: "center",
1402
+ opacity: interpolate(local, [240, 270], [0, 1], {
1403
+ extrapolateLeft: "clamp",
1404
+ extrapolateRight: "clamp",
1405
+ }),
1406
+ transform: `translateY(${interpolate(local, [240, 270], [16, 0], {
1407
+ extrapolateLeft: "clamp",
1408
+ extrapolateRight: "clamp",
1409
+ easing: ease.expoOut,
1410
+ })}px)`,
1411
+ }}
1412
+ >
1413
+ <div
1414
+ style={{
1415
+ fontFamily: FONT,
1416
+ fontSize: 38,
1417
+ fontWeight: 600,
1418
+ color: C.inkSoft,
1419
+ letterSpacing: "-0.02em",
1420
+ }}
1421
+ >
1422
+ it&apos;s called <span style={{ color: JC.rust, fontWeight: 800 }}>a harness</span>.
1423
+ </div>
1424
+ </div>
1425
+ </AbsoluteFill>
1426
+ );
1427
+ };
1428
+
1429
+ // ═══════════════════════════════════════════════════════════════
1430
+ // SCENE 4 — RUST REBUILD (907–1154, 8.2s)
1431
+ // VO: "And jcode just rebuilt that entire harness from scratch in
1432
+ // Rust. [exhale] Which is exactly why those numbers are even
1433
+ // possible."
1434
+ // ═══════════════════════════════════════════════════════════════
1435
+ const RustRebuildScene: React.FC = () => {
1436
+ const frame = useCurrentFrame();
1437
+ const { fps } = useVideoConfig();
1438
+ const local = frame - BEAT.rust;
1439
+
1440
+ // Particles converging inward (reverse of ParticleBurst)
1441
+ const ConvergingParticles = () => {
1442
+ const particles = Array.from({ length: 60 }, (_, i) => {
1443
+ const angle = (i / 60) * Math.PI * 2 + (i * 0.31);
1444
+ const distance = 200 + (i % 6) * 90;
1445
+ const size = 4 + (i % 4) * 3;
1446
+ const colorIdx = i % 4;
1447
+ const color = [JC.rust, JC.rustSoft, C.iriCyan, C.iriViolet][colorIdx];
1448
+ const delay = (i * 0.6) % 18;
1449
+ return { angle, distance, size, color, delay };
1450
+ });
1451
+ return (
1452
+ <AbsoluteFill style={{ alignItems: "center", justifyContent: "center" }}>
1453
+ {particles.map((p, i) => {
1454
+ const lo = Math.max(0, local - p.delay);
1455
+ const conv = interpolate(lo, [0, 60], [1, 0], {
1456
+ extrapolateLeft: "clamp",
1457
+ extrapolateRight: "clamp",
1458
+ easing: ease.expoOut,
1459
+ });
1460
+ const x = Math.cos(p.angle) * p.distance * conv;
1461
+ const y = Math.sin(p.angle) * p.distance * conv;
1462
+ const op = interpolate(lo, [0, 12, 60, 90], [0, 0.85, 0.4, 0]);
1463
+ return (
1464
+ <div
1465
+ key={i}
1466
+ style={{
1467
+ position: "absolute",
1468
+ width: p.size,
1469
+ height: p.size,
1470
+ borderRadius: "50%",
1471
+ background: p.color,
1472
+ boxShadow: `0 0 ${p.size * 2}px ${p.color}`,
1473
+ transform: `translate(${x}px, ${y}px)`,
1474
+ opacity: op,
1475
+ willChange: "transform, opacity",
1476
+ }}
1477
+ />
1478
+ );
1479
+ })}
1480
+ </AbsoluteFill>
1481
+ );
1482
+ };
1483
+
1484
+ const F_EYEBROW = 0;
1485
+ const F_RUST = 30;
1486
+ const F_HEADLINE = 76;
1487
+ const F_STATS = 138;
1488
+ const F_TAG = 188;
1489
+
1490
+ const headlineWords = ["rebuilt", "from", "scratch"];
1491
+
1492
+ return (
1493
+ <AbsoluteFill>
1494
+ <ConvergingParticles />
1495
+
1496
+ {/* Eyebrow */}
1497
+ <div
1498
+ style={{
1499
+ position: "absolute",
1500
+ top: 340,
1501
+ left: 0,
1502
+ right: 0,
1503
+ display: "flex",
1504
+ justifyContent: "center",
1505
+ opacity: interpolate(local, [F_EYEBROW, F_EYEBROW + 18], [0, 1], {
1506
+ extrapolateLeft: "clamp",
1507
+ extrapolateRight: "clamp",
1508
+ }),
1509
+ transform: `translateY(${interpolate(local, [F_EYEBROW, F_EYEBROW + 24], [12, 0], {
1510
+ extrapolateLeft: "clamp",
1511
+ extrapolateRight: "clamp",
1512
+ easing: ease.expoOut,
1513
+ })}px)`,
1514
+ }}
1515
+ >
1516
+ <EyebrowPill>rebuilt in rust</EyebrowPill>
1517
+ </div>
1518
+
1519
+ {/* Rust logo — center */}
1520
+ <div
1521
+ style={{
1522
+ position: "absolute",
1523
+ left: 0,
1524
+ right: 0,
1525
+ top: 500,
1526
+ display: "flex",
1527
+ justifyContent: "center",
1528
+ }}
1529
+ >
1530
+ {(() => {
1531
+ const lo = Math.max(0, local - F_RUST);
1532
+ const sp = spring({
1533
+ frame: lo,
1534
+ fps,
1535
+ from: 0,
1536
+ to: 1,
1537
+ config: { damping: 12, stiffness: 90, mass: 0.9 },
1538
+ });
1539
+ const rot = interpolate(lo, [0, 50], [-90, 0], {
1540
+ extrapolateLeft: "clamp",
1541
+ extrapolateRight: "clamp",
1542
+ easing: ease.expoOut,
1543
+ });
1544
+ const breath = (Math.sin(local * 0.05) + 1) * 0.5;
1545
+ return (
1546
+ <div
1547
+ style={{
1548
+ position: "relative",
1549
+ width: 280,
1550
+ height: 280,
1551
+ opacity: sp,
1552
+ transform: `scale(${sp}) rotate(${rot}deg)`,
1553
+ willChange: "transform, opacity",
1554
+ }}
1555
+ >
1556
+ <div
1557
+ style={{
1558
+ position: "absolute",
1559
+ inset: -50,
1560
+ borderRadius: "50%",
1561
+ background: `radial-gradient(circle, ${JC.rust}55 0%, ${JC.rust}18 32%, transparent 70%)`,
1562
+ filter: "blur(40px)",
1563
+ opacity: 0.6 + breath * 0.4,
1564
+ }}
1565
+ />
1566
+ <Img
1567
+ src={staticFile("captures/your-asset.png" /* REFERENCE-STRIP */)}
1568
+ style={{ width: "100%", height: "100%", position: "relative" }}
1569
+ />
1570
+ </div>
1571
+ );
1572
+ })()}
1573
+ </div>
1574
+
1575
+ {/* Headline — per-WORD entrance, single line via nowrap */}
1576
+ <div
1577
+ style={{
1578
+ position: "absolute",
1579
+ left: 0,
1580
+ right: 0,
1581
+ top: 920,
1582
+ display: "flex",
1583
+ justifyContent: "center",
1584
+ alignItems: "baseline",
1585
+ gap: "0.32em",
1586
+ whiteSpace: "nowrap",
1587
+ fontFamily: FONT,
1588
+ fontSize: 92,
1589
+ fontWeight: 800,
1590
+ letterSpacing: "-0.045em",
1591
+ lineHeight: 1,
1592
+ color: C.ink,
1593
+ }}
1594
+ >
1595
+ {headlineWords.map((w, i) => {
1596
+ const lo = Math.max(0, local - (F_HEADLINE + i * 8));
1597
+ const op = interpolate(lo, [0, 22], [0, 1], { extrapolateRight: "clamp" });
1598
+ const y = interpolate(lo, [0, 28], [36, 0], {
1599
+ extrapolateRight: "clamp",
1600
+ easing: ease.expoOut,
1601
+ });
1602
+ const blur = interpolate(lo, [0, 22], [10, 0], { extrapolateRight: "clamp" });
1603
+ const isRust = w === "scratch";
1604
+ return (
1605
+ <span
1606
+ key={i}
1607
+ style={{
1608
+ display: "inline-block",
1609
+ opacity: op,
1610
+ transform: `translateY(${y}px)`,
1611
+ filter: `blur(${blur}px)`,
1612
+ color: isRust ? JC.rust : C.ink,
1613
+ willChange: "transform, opacity, filter",
1614
+ }}
1615
+ >
1616
+ {w}
1617
+ </span>
1618
+ );
1619
+ })}
1620
+ </div>
1621
+
1622
+ {/* Speed-callback row: 63x faster + 20x less RAM (visual proof of "those numbers") */}
1623
+ <div
1624
+ style={{
1625
+ position: "absolute",
1626
+ left: 0,
1627
+ right: 0,
1628
+ top: 1080,
1629
+ display: "flex",
1630
+ justifyContent: "center",
1631
+ alignItems: "center",
1632
+ gap: 56,
1633
+ opacity: interpolate(local, [F_STATS, F_STATS + 24], [0, 1], {
1634
+ extrapolateLeft: "clamp",
1635
+ extrapolateRight: "clamp",
1636
+ }),
1637
+ transform: `translateY(${interpolate(local, [F_STATS, F_STATS + 28], [20, 0], {
1638
+ extrapolateLeft: "clamp",
1639
+ extrapolateRight: "clamp",
1640
+ easing: ease.expoOut,
1641
+ })}px)`,
1642
+ }}
1643
+ >
1644
+ <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }}>
1645
+ <div style={{ fontFamily: MONO, fontSize: 110, fontWeight: 800, color: JC.rust, letterSpacing: "-0.06em", lineHeight: 1 }}>63×</div>
1646
+ <div style={{ fontFamily: MONO, fontSize: 18, fontWeight: 600, color: C.inkMuted, letterSpacing: "0.18em", textTransform: "uppercase" }}>faster</div>
1647
+ </div>
1648
+ <div style={{ width: 1, height: 90, background: C.hairline }} />
1649
+ <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 6 }}>
1650
+ <div style={{ fontFamily: MONO, fontSize: 110, fontWeight: 800, color: C.iriViolet, letterSpacing: "-0.06em", lineHeight: 1 }}>20×</div>
1651
+ <div style={{ fontFamily: MONO, fontSize: 18, fontWeight: 600, color: C.inkMuted, letterSpacing: "0.18em", textTransform: "uppercase" }}>less ram</div>
1652
+ </div>
1653
+ </div>
1654
+
1655
+ {/* Closing tag */}
1656
+ <div
1657
+ style={{
1658
+ position: "absolute",
1659
+ left: 0,
1660
+ right: 0,
1661
+ top: 1320,
1662
+ display: "flex",
1663
+ justifyContent: "center",
1664
+ opacity: interpolate(local, [F_TAG, F_TAG + 24], [0, 1], {
1665
+ extrapolateLeft: "clamp",
1666
+ extrapolateRight: "clamp",
1667
+ }),
1668
+ }}
1669
+ >
1670
+ <Chip dotColor={JC.rust} style={{ fontSize: 14 }}>
1671
+ why those numbers happen
1672
+ </Chip>
1673
+ </div>
1674
+ </AbsoluteFill>
1675
+ );
1676
+ };
1677
+
1678
+ // ═══════════════════════════════════════════════════════════════
1679
+ // SCENE 5 — MEMORY (1154–1463, 10.3s)
1680
+ // VO: "Now about that built-in memory system... zero extra setup.
1681
+ // It just remembers stuff naturally, kinda like a human would.
1682
+ // No more re-explaining your codebase every session."
1683
+ // ═══════════════════════════════════════════════════════════════
1684
+ const MemoryScene: React.FC = () => {
1685
+ const frame = useCurrentFrame();
1686
+ const { fps } = useVideoConfig();
1687
+ const local = frame - BEAT.memory;
1688
+
1689
+ return (
1690
+ <AbsoluteFill>
1691
+ {/* eyebrow */}
1692
+ <div
1693
+ style={{
1694
+ position: "absolute",
1695
+ top: 320,
1696
+ left: 0,
1697
+ right: 0,
1698
+ display: "flex",
1699
+ justifyContent: "center",
1700
+ opacity: interpolate(local, [0, 18], [0, 1], {
1701
+ extrapolateLeft: "clamp",
1702
+ extrapolateRight: "clamp",
1703
+ }),
1704
+ }}
1705
+ >
1706
+ <EyebrowPill>built-in memory</EyebrowPill>
1707
+ </div>
1708
+
1709
+ {/* "ZERO SETUP" badge */}
1710
+ <div
1711
+ style={{
1712
+ position: "absolute",
1713
+ left: 0,
1714
+ right: 0,
1715
+ top: 410,
1716
+ display: "flex",
1717
+ justifyContent: "center",
1718
+ }}
1719
+ >
1720
+ {(() => {
1721
+ const lo = Math.max(0, local - 30);
1722
+ const sp = spring({
1723
+ frame: lo,
1724
+ fps,
1725
+ from: 0,
1726
+ to: 1,
1727
+ config: { damping: 11, stiffness: 95 },
1728
+ });
1729
+ return (
1730
+ <div
1731
+ style={{
1732
+ ...glassBase,
1733
+ borderRadius: 9999,
1734
+ padding: "16px 36px",
1735
+ display: "flex",
1736
+ alignItems: "center",
1737
+ gap: 12,
1738
+ opacity: sp,
1739
+ transform: `scale(${0.6 + sp * 0.4})`,
1740
+ fontFamily: FONT,
1741
+ fontSize: 38,
1742
+ fontWeight: 800,
1743
+ color: JC.rust,
1744
+ letterSpacing: "-0.02em",
1745
+ boxShadow: [
1746
+ "0 16px 32px -8px rgba(229,90,26,0.25)",
1747
+ "inset 0 1.5px 0 rgba(255,255,255,0.95)",
1748
+ ].join(", "),
1749
+ }}
1750
+ >
1751
+ <div
1752
+ style={{
1753
+ width: 10,
1754
+ height: 10,
1755
+ borderRadius: "50%",
1756
+ background: JC.rust,
1757
+ boxShadow: `0 0 14px ${JC.rust}`,
1758
+ }}
1759
+ />
1760
+ ZERO SETUP
1761
+ </div>
1762
+ );
1763
+ })()}
1764
+ </div>
1765
+
1766
+ {/* Constellation */}
1767
+ <MemoryConstellation startFrame={BEAT.memory + 50} />
1768
+
1769
+ {/* Quote-styled phrase below */}
1770
+ <div
1771
+ style={{
1772
+ position: "absolute",
1773
+ left: 80,
1774
+ right: 80,
1775
+ top: 1400,
1776
+ textAlign: "center",
1777
+ }}
1778
+ >
1779
+ <StaggeredWords
1780
+ text="remembers your codebase, naturally."
1781
+ startFrame={BEAT.memory + 180}
1782
+ fontSize={40}
1783
+ fontWeight={500}
1784
+ color={C.inkSoft}
1785
+ align="center"
1786
+ perWordDelay={4}
1787
+ duration={22}
1788
+ letterSpacing="-0.02em"
1789
+ highlight="naturally"
1790
+ highlightColor={JC.rust}
1791
+ />
1792
+ </div>
1793
+ </AbsoluteFill>
1794
+ );
1795
+ };
1796
+
1797
+ // ═══════════════════════════════════════════════════════════════
1798
+ // SCENE 6 — PARALLEL SESSIONS (1463–1660, 6.6s) — CLIP SCENE
1799
+ // VO: "Parallel sessions are native too. So you can run multiple
1800
+ // agents side by side without melting your laptop."
1801
+ // Wrapped in <Sequence> at root so OffthreadVideo timing works.
1802
+ // useCurrentFrame() inside this scene returns LOCAL frames.
1803
+ // ═══════════════════════════════════════════════════════════════
1804
+ const ParallelScene: React.FC = () => {
1805
+ const local = useCurrentFrame(); // LOCAL — Sequence.from = BEAT.parallel
1806
+ const { fps } = useVideoConfig();
1807
+
1808
+ // Top frame entrance (jcode-repo)
1809
+ const topSp = spring({
1810
+ frame: local,
1811
+ fps,
1812
+ from: 0,
1813
+ to: 1,
1814
+ config: { damping: 14, stiffness: 100 },
1815
+ });
1816
+ // Bottom frame entrance (parallel-jscode), staggered
1817
+ const botSp = spring({
1818
+ frame: Math.max(0, local - 8),
1819
+ fps,
1820
+ from: 0,
1821
+ to: 1,
1822
+ config: { damping: 14, stiffness: 100 },
1823
+ });
1824
+
1825
+ // Connecting line pulse
1826
+ const linePulse = (Math.sin(local * 0.18) + 1) * 0.5;
1827
+
1828
+ return (
1829
+ <AbsoluteFill>
1830
+ {/* Header eyebrow */}
1831
+ <div
1832
+ style={{
1833
+ position: "absolute",
1834
+ top: 80,
1835
+ left: 0,
1836
+ right: 0,
1837
+ display: "flex",
1838
+ justifyContent: "center",
1839
+ }}
1840
+ >
1841
+ <EyebrowPill>parallel sessions · native</EyebrowPill>
1842
+ </div>
1843
+
1844
+ {/* Top frame: jcode-repo.mov */}
1845
+ <div
1846
+ style={{
1847
+ position: "absolute",
1848
+ top: 200,
1849
+ left: 60,
1850
+ width: 960,
1851
+ height: 720,
1852
+ borderRadius: 28,
1853
+ overflow: "hidden",
1854
+ ...glassBase,
1855
+ opacity: topSp,
1856
+ transform: `translateY(${(1 - topSp) * -40}px)`,
1857
+ willChange: "transform, opacity",
1858
+ }}
1859
+ >
1860
+ {/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
1861
+ {/* glass tint overlay */}
1862
+ <div
1863
+ style={{
1864
+ position: "absolute",
1865
+ inset: 0,
1866
+ background: "linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(120,100,180,0.08) 100%)",
1867
+ pointerEvents: "none",
1868
+ }}
1869
+ />
1870
+ </div>
1871
+
1872
+ {/* Caption: agent · 1 */}
1873
+ <div
1874
+ style={{
1875
+ position: "absolute",
1876
+ top: 940,
1877
+ left: 60,
1878
+ opacity: topSp,
1879
+ }}
1880
+ >
1881
+ <Chip dotColor={C.iriCyan} style={{ fontSize: 16 }}>
1882
+ agent · 1
1883
+ </Chip>
1884
+ </div>
1885
+
1886
+ {/* Connecting glow line */}
1887
+ <div
1888
+ style={{
1889
+ position: "absolute",
1890
+ top: 990,
1891
+ left: 60,
1892
+ width: 960,
1893
+ height: 2,
1894
+ background: `linear-gradient(90deg, ${C.iriCyan}, ${JC.rust}, ${C.iriViolet})`,
1895
+ opacity: 0.3 + linePulse * 0.5,
1896
+ boxShadow: `0 0 ${8 + linePulse * 14}px ${JC.rust}`,
1897
+ }}
1898
+ />
1899
+
1900
+ {/* "running 2 sessions in parallel" status */}
1901
+ <div
1902
+ style={{
1903
+ position: "absolute",
1904
+ top: 1010,
1905
+ left: 0,
1906
+ right: 0,
1907
+ display: "flex",
1908
+ justifyContent: "center",
1909
+ opacity: interpolate(local, [12, 28], [0, 1], {
1910
+ extrapolateLeft: "clamp",
1911
+ extrapolateRight: "clamp",
1912
+ }),
1913
+ }}
1914
+ >
1915
+ <div
1916
+ style={{
1917
+ ...glassBase,
1918
+ borderRadius: 9999,
1919
+ padding: "8px 18px",
1920
+ fontFamily: MONO,
1921
+ fontSize: 14,
1922
+ fontWeight: 600,
1923
+ color: JC.rust,
1924
+ letterSpacing: "0.18em",
1925
+ textTransform: "uppercase",
1926
+ display: "flex",
1927
+ alignItems: "center",
1928
+ gap: 8,
1929
+ }}
1930
+ >
1931
+ <div
1932
+ style={{
1933
+ width: 8,
1934
+ height: 8,
1935
+ borderRadius: "50%",
1936
+ background: JC.rust,
1937
+ boxShadow: `0 0 10px ${JC.rust}`,
1938
+ }}
1939
+ />
1940
+ 2 sessions · 0ms sync
1941
+ </div>
1942
+ </div>
1943
+
1944
+ {/* Bottom frame: parallel-jscode.mp4 */}
1945
+ <div
1946
+ style={{
1947
+ position: "absolute",
1948
+ top: 1060,
1949
+ left: 60,
1950
+ width: 960,
1951
+ height: 720,
1952
+ borderRadius: 28,
1953
+ overflow: "hidden",
1954
+ ...glassBase,
1955
+ opacity: botSp,
1956
+ transform: `translateY(${(1 - botSp) * 40}px)`,
1957
+ willChange: "transform, opacity",
1958
+ }}
1959
+ >
1960
+ {/* REFERENCE-STRIP: <OffthreadVideo> removed — bring your own clip */}
1961
+ <div
1962
+ style={{
1963
+ position: "absolute",
1964
+ inset: 0,
1965
+ background: "linear-gradient(180deg, rgba(255,255,255,0.04) 0%, rgba(229,90,26,0.08) 100%)",
1966
+ pointerEvents: "none",
1967
+ }}
1968
+ />
1969
+ </div>
1970
+
1971
+ {/* Caption: agent · 2 */}
1972
+ <div
1973
+ style={{
1974
+ position: "absolute",
1975
+ bottom: 80,
1976
+ right: 60,
1977
+ opacity: botSp,
1978
+ }}
1979
+ >
1980
+ <Chip dotColor={JC.rust} style={{ fontSize: 16 }}>
1981
+ agent · 2
1982
+ </Chip>
1983
+ </div>
1984
+ </AbsoluteFill>
1985
+ );
1986
+ };
1987
+
1988
+ // ═══════════════════════════════════════════════════════════════
1989
+ // SCENE 7 — SWARMS (1660–1995, 11.2s)
1990
+ // VO: "And the craziest part? Agents can spawn their own teammates.
1991
+ // One becomes the coordinator, the others become workers...
1992
+ // and they all collab on the same codebase, in real time."
1993
+ // ═══════════════════════════════════════════════════════════════
1994
+ const SwarmsScene: React.FC = () => {
1995
+ const frame = useCurrentFrame();
1996
+ const { fps } = useVideoConfig();
1997
+ const local = frame - BEAT.swarms;
1998
+
1999
+ return (
2000
+ <AbsoluteFill>
2001
+ {/* eyebrow */}
2002
+ <div
2003
+ style={{
2004
+ position: "absolute",
2005
+ top: 320,
2006
+ left: 0,
2007
+ right: 0,
2008
+ display: "flex",
2009
+ justifyContent: "center",
2010
+ opacity: interpolate(local, [0, 18], [0, 1], {
2011
+ extrapolateLeft: "clamp",
2012
+ extrapolateRight: "clamp",
2013
+ }),
2014
+ }}
2015
+ >
2016
+ <EyebrowPill>agents spawn agents</EyebrowPill>
2017
+ </div>
2018
+
2019
+ {/* Headline */}
2020
+ <div
2021
+ style={{
2022
+ position: "absolute",
2023
+ left: 80,
2024
+ right: 80,
2025
+ top: 410,
2026
+ textAlign: "center",
2027
+ }}
2028
+ >
2029
+ <StaggeredWords
2030
+ text="agents that spawn teammates"
2031
+ startFrame={BEAT.swarms + 6}
2032
+ fontSize={62}
2033
+ fontWeight={800}
2034
+ color={C.ink}
2035
+ align="center"
2036
+ perWordDelay={4}
2037
+ duration={22}
2038
+ letterSpacing="-0.04em"
2039
+ highlight="spawn"
2040
+ highlightColor={JC.rust}
2041
+ />
2042
+ </div>
2043
+
2044
+ {/* Swarm diagram */}
2045
+ <AgentSwarmDiagram startFrame={BEAT.swarms + 60} fps={fps} />
2046
+
2047
+ {/* Bottom row of role chips */}
2048
+ <div
2049
+ style={{
2050
+ position: "absolute",
2051
+ left: 0,
2052
+ right: 0,
2053
+ top: 1480,
2054
+ display: "flex",
2055
+ justifyContent: "center",
2056
+ gap: 16,
2057
+ opacity: interpolate(local, [200, 230], [0, 1], {
2058
+ extrapolateLeft: "clamp",
2059
+ extrapolateRight: "clamp",
2060
+ }),
2061
+ }}
2062
+ >
2063
+ <Chip dotColor={JC.rust}>1 coordinator</Chip>
2064
+ <Chip dotColor={C.iriCyan}>n workers</Chip>
2065
+ <Chip dotColor={C.iriViolet}>shared codebase</Chip>
2066
+ </div>
2067
+ </AbsoluteFill>
2068
+ );
2069
+ };
2070
+
2071
+ // ═══════════════════════════════════════════════════════════════
2072
+ // SCENE 8 — CTA (1995–2164, 5.6s)
2073
+ // VO: "If you want the repo link, just comment 'AI' below and
2074
+ // I'll slide it straight into your DMs"
2075
+ // ═══════════════════════════════════════════════════════════════
2076
+ const CTAScene: React.FC = () => {
2077
+ const frame = useCurrentFrame();
2078
+ const { fps } = useVideoConfig();
2079
+ const local = frame - BEAT.cta;
2080
+
2081
+ return (
2082
+ <AbsoluteFill>
2083
+ {/* Sonar rings continue at heightened intensity */}
2084
+ <SonarRings />
2085
+
2086
+ {/* Particle burst kick at scene start */}
2087
+ <ParticleBurst />
2088
+
2089
+ {/* Eyebrow */}
2090
+ <div
2091
+ style={{
2092
+ position: "absolute",
2093
+ top: 380,
2094
+ left: 0,
2095
+ right: 0,
2096
+ display: "flex",
2097
+ justifyContent: "center",
2098
+ opacity: interpolate(local, [0, 18], [0, 1], {
2099
+ extrapolateLeft: "clamp",
2100
+ extrapolateRight: "clamp",
2101
+ }),
2102
+ }}
2103
+ >
2104
+ <EyebrowPill>want the repo?</EyebrowPill>
2105
+ </div>
2106
+
2107
+ {/* Big "COMMENT 'AI'" headline with iridescent fill */}
2108
+ <div
2109
+ style={{
2110
+ position: "absolute",
2111
+ left: 0,
2112
+ right: 0,
2113
+ top: 480,
2114
+ textAlign: "center",
2115
+ fontFamily: FONT,
2116
+ fontWeight: 800,
2117
+ letterSpacing: "-0.04em",
2118
+ lineHeight: 1.0,
2119
+ opacity: interpolate(local, [10, 36], [0, 1], {
2120
+ extrapolateLeft: "clamp",
2121
+ extrapolateRight: "clamp",
2122
+ }),
2123
+ transform: `translateY(${interpolate(local, [10, 36], [30, 0], {
2124
+ extrapolateLeft: "clamp",
2125
+ extrapolateRight: "clamp",
2126
+ easing: ease.expoOut,
2127
+ })}px)`,
2128
+ }}
2129
+ >
2130
+ <div style={{ fontSize: 72, color: C.ink }}>comment</div>
2131
+ <div
2132
+ style={{
2133
+ fontSize: 220,
2134
+ background: `linear-gradient(90deg, ${C.iriCyan}, ${JC.rust}, ${C.iriViolet})`,
2135
+ WebkitBackgroundClip: "text",
2136
+ WebkitTextFillColor: "transparent",
2137
+ backgroundClip: "text",
2138
+ color: "transparent",
2139
+ marginTop: -10,
2140
+ }}
2141
+ >
2142
+ &quot;AI&quot;
2143
+ </div>
2144
+ </div>
2145
+
2146
+ {/* Comment → DM morph chip, center */}
2147
+ <div
2148
+ style={{
2149
+ position: "absolute",
2150
+ left: 0,
2151
+ right: 0,
2152
+ top: 950,
2153
+ display: "flex",
2154
+ justifyContent: "center",
2155
+ }}
2156
+ >
2157
+ <CommentMorphChip startFrame={BEAT.cta + 40} />
2158
+ </div>
2159
+
2160
+ {/* "and i'll DM you" caption */}
2161
+ <div
2162
+ style={{
2163
+ position: "absolute",
2164
+ left: 0,
2165
+ right: 0,
2166
+ top: 1240,
2167
+ textAlign: "center",
2168
+ fontFamily: FONT,
2169
+ fontSize: 36,
2170
+ fontWeight: 500,
2171
+ color: C.inkSoft,
2172
+ letterSpacing: "-0.02em",
2173
+ opacity: interpolate(local, [80, 110], [0, 1], {
2174
+ extrapolateLeft: "clamp",
2175
+ extrapolateRight: "clamp",
2176
+ }),
2177
+ }}
2178
+ >
2179
+ i&apos;ll slide it straight into your DMs
2180
+ </div>
2181
+
2182
+ {/* Bottom logo lockup */}
2183
+ <div
2184
+ style={{
2185
+ position: "absolute",
2186
+ left: 0,
2187
+ right: 0,
2188
+ top: 1380,
2189
+ display: "flex",
2190
+ flexDirection: "column",
2191
+ alignItems: "center",
2192
+ gap: 12,
2193
+ opacity: interpolate(local, [100, 130], [0, 1], {
2194
+ extrapolateLeft: "clamp",
2195
+ extrapolateRight: "clamp",
2196
+ }),
2197
+ }}
2198
+ >
2199
+ <div
2200
+ style={{
2201
+ fontFamily: FONT,
2202
+ fontSize: 100,
2203
+ fontWeight: 800,
2204
+ letterSpacing: "-0.06em",
2205
+ color: C.ink,
2206
+ }}
2207
+ >
2208
+ <span style={{ color: JC.rust }}>j</span>code
2209
+ </div>
2210
+ <Chip dotColor={JC.rust} style={{ fontSize: 14 }}>
2211
+ free · open source
2212
+ </Chip>
2213
+ </div>
2214
+ </AbsoluteFill>
2215
+ );
2216
+ };
2217
+
2218
+ // ═══════════════════════════════════════════════════════════════
2219
+ // MAIN COMPOSITION
2220
+ // ═══════════════════════════════════════════════════════════════
2221
+ export const JcodeReel: React.FC = () => {
2222
+ const frame = useCurrentFrame();
2223
+ const { width, height } = useVideoConfig();
2224
+
2225
+ return (
2226
+ <AbsoluteFill
2227
+ style={{
2228
+ background: `radial-gradient(ellipse at 50% 30%, ${C.bgWarm} 0%, ${C.bg} 50%, ${C.bgCool} 100%)`,
2229
+ width,
2230
+ height,
2231
+ overflow: "hidden",
2232
+ }}
2233
+ >
2234
+ {/* === Persistent overlays (run all 72s) === */}
2235
+ <CausticBlobs />
2236
+ <HairlineGrid opacity={0.04} />
2237
+ <FilmGrain />
2238
+
2239
+ {/* === Scenes (conditional render at root → useCurrentFrame() returns global) === */}
2240
+ {frame >= BEAT.hook && frame < BEAT.intro && <HookScene />}
2241
+ {frame >= BEAT.intro && frame < BEAT.harness && <IntroScene />}
2242
+ {frame >= BEAT.harness && frame < BEAT.rust && <HarnessScene />}
2243
+ {frame >= BEAT.rust && frame < BEAT.memory && <RustRebuildScene />}
2244
+ {frame >= BEAT.memory && frame < BEAT.parallel && <MemoryScene />}
2245
+ {frame >= BEAT.swarms && frame < BEAT.cta && <SwarmsScene />}
2246
+ {frame >= BEAT.cta && frame < BEAT.end && <CTAScene />}
2247
+
2248
+ {/* === Parallel scene wrapped in Sequence so OffthreadVideo timing works
2249
+ (per memory: useCurrentFrame() inside is LOCAL) === */}
2250
+ <Sequence from={BEAT.parallel} durationInFrames={BEAT.swarms - BEAT.parallel}>
2251
+ <ParallelScene />
2252
+ </Sequence>
2253
+
2254
+ {/* === Vignette === */}
2255
+ <AbsoluteFill
2256
+ style={{
2257
+ background:
2258
+ "radial-gradient(ellipse at center, transparent 50%, rgba(14,14,18,0.18) 100%)",
2259
+ pointerEvents: "none",
2260
+ }}
2261
+ />
2262
+
2263
+ {/* === Audio === */}
2264
+ {/* REFERENCE-STRIP: voiceover tag removed — bring your own voiceover */}
2265
+ </AbsoluteFill>
2266
+ );
2267
+ };