wizz-method 2.15.0 → 2.17.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.
Files changed (85) hide show
  1. package/README.md +12 -1
  2. package/THIRD-PARTY-NOTICES.md +6 -0
  3. package/package.json +5 -2
  4. package/skills-registry.yaml +18 -6
  5. package/src/bmm-skills/1-analysis/wizz-agent-analyst/customize.toml +1 -1
  6. package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +34 -12
  7. package/src/bmm-skills/2-plan-workflows/wizz-agent-pm/customize.toml +1 -1
  8. package/src/bmm-skills/2-plan-workflows/wizz-agent-ux-designer/customize.toml +1 -1
  9. package/src/bmm-skills/3-solutioning/wizz-agent-architect/customize.toml +1 -1
  10. package/src/bmm-skills/4-implementation/wizz-agent-dev/customize.toml +1 -1
  11. package/src/bmm-skills/module.yaml +10 -0
  12. package/src/core-skills/_shared/handoff-protocol.md +10 -0
  13. package/src/modules/wizz/_shared/encerramento.md +4 -0
  14. package/src/modules/wizz/_shared/organizacao.md +58 -0
  15. package/src/modules/wizz/_shared/video-pipeline.md +1 -0
  16. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +9 -1
  17. package/src/modules/wizz/agents/wizz-maestro/customize.toml +8 -2
  18. package/src/skills-lib/wizz-inicio-de-projeto/SKILL.md +11 -0
  19. package/src/skills-lib/wizz-router/SKILL.md +3 -1
  20. package/src/skills-lib/wizz-router/references/routing-table-flat.md +1 -0
  21. package/src/skills-lib/wizz-video-styles/SKILL.md +66 -0
  22. package/src/skills-lib/wizz-video-styles/assets/audio/CREDITS.md +54 -0
  23. package/src/skills-lib/wizz-video-styles/assets/audio/LIBRARIES.md +31 -0
  24. package/src/skills-lib/wizz-video-styles/assets/audio/kit.json +182 -0
  25. package/src/skills-lib/wizz-video-styles/assets/audio/music/acoustic-lifestyle.mp3 +0 -0
  26. package/src/skills-lib/wizz-video-styles/assets/audio/music/cinematic-tense.mp3 +0 -0
  27. package/src/skills-lib/wizz-video-styles/assets/audio/music/classical-light.mp3 +0 -0
  28. package/src/skills-lib/wizz-video-styles/assets/audio/music/corporate-light.mp3 +0 -0
  29. package/src/skills-lib/wizz-video-styles/assets/audio/music/lofi-chill.mp3 +0 -0
  30. package/src/skills-lib/wizz-video-styles/assets/audio/music/meme-beat.mp3 +0 -0
  31. package/src/skills-lib/wizz-video-styles/assets/audio/music/piano-editorial.mp3 +0 -0
  32. package/src/skills-lib/wizz-video-styles/assets/audio/music/tech-pulse.mp3 +0 -0
  33. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/boom-impact.mp3 +0 -0
  34. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/click-mouse.mp3 +0 -0
  35. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ding-notify.mp3 +0 -0
  36. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/glitch-short.mp3 +0 -0
  37. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ka-ching.mp3 +0 -0
  38. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/pop-bubble.mp3 +0 -0
  39. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/record-scratch.mp3 +0 -0
  40. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/riser-short.mp3 +0 -0
  41. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/swoosh-text.mp3 +0 -0
  42. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/typing-short.mp3 +0 -0
  43. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-fast.mp3 +0 -0
  44. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-soft.mp3 +0 -0
  45. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/EditorialReel.tsx +111 -0
  46. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/README.md +77 -0
  47. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/captions.tsx +56 -0
  48. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/example-words.json +285 -0
  49. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/primitives.tsx +241 -0
  50. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/scenes.tsx +113 -0
  51. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/theme.ts +68 -0
  52. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/timeline.ts +65 -0
  53. package/src/skills-lib/wizz-video-styles/data/recipes.json +341 -0
  54. package/src/skills-lib/wizz-video-styles/data/references.json +3397 -0
  55. package/src/skills-lib/wizz-video-styles/data/styles.json +726 -0
  56. package/src/skills-lib/wizz-video-styles/references/audio.md +54 -0
  57. package/src/skills-lib/wizz-video-styles/references/measured-patterns.md +38 -0
  58. package/src/skills-lib/wizz-video-styles/references/research-method.md +33 -0
  59. package/src/skills-lib/wizz-video-styles/references/style-picker.md +51 -0
  60. package/src/skills-lib/wizz-video-styles/references/styles/camera-no-setup.md +60 -0
  61. package/src/skills-lib/wizz-video-styles/references/styles/desafio-numero.md +60 -0
  62. package/src/skills-lib/wizz-video-styles/references/styles/esquete.md +57 -0
  63. package/src/skills-lib/wizz-video-styles/references/styles/experimento.md +56 -0
  64. package/src/skills-lib/wizz-video-styles/references/styles/explicador-animado.md +62 -0
  65. package/src/skills-lib/wizz-video-styles/references/styles/macro-asmr.md +61 -0
  66. package/src/skills-lib/wizz-video-styles/references/styles/meme-rapido.md +65 -0
  67. package/src/skills-lib/wizz-video-styles/references/styles/motion-editorial.md +69 -0
  68. package/src/skills-lib/wizz-video-styles/references/styles/podcast-clip.md +61 -0
  69. package/src/skills-lib/wizz-video-styles/references/styles/pov-vlog.md +57 -0
  70. package/src/skills-lib/wizz-video-styles/references/styles/quadro-branco.md +60 -0
  71. package/src/skills-lib/wizz-video-styles/references/styles/talking-head-cards.md +62 -0
  72. package/src/skills-lib/wizz-video-styles/references/styles/talking-head-legenda.md +62 -0
  73. package/src/skills-lib/wizz-video-styles/references/styles/tour.md +59 -0
  74. package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +66 -0
  75. package/src/skills-lib/wizz-video-styles/scripts/build_catalog.py +128 -0
  76. package/tools/hooks/README.md +14 -2
  77. package/tools/hooks/session-rules.js +65 -140
  78. package/tools/hooks/wizz-arrumar.js +418 -0
  79. package/tools/hooks/wizz-artifact-guard.js +160 -0
  80. package/tools/hooks/wizz-feature-lib.js +414 -0
  81. package/tools/hooks/wizz-feature.js +401 -0
  82. package/tools/hooks/wizz-layout-lib.js +152 -0
  83. package/tools/hooks/wizz-router-enforce.js +21 -1
  84. package/tools/installer/core/doctor.js +5 -1
  85. package/tools/installer/core/hooks-settings.js +10 -0
@@ -0,0 +1,68 @@
1
+ import { createContext, useContext } from "react";
2
+ import { loadFont as loadInter } from "@remotion/google-fonts/Inter";
3
+ import { loadFont as loadJetBrainsMono } from "@remotion/google-fonts/JetBrainsMono";
4
+ import { loadFont as loadPlayfair } from "@remotion/google-fonts/PlayfairDisplay";
5
+
6
+ // Tema do estilo "motion editorial". Tudo que é cor, fonte e sombra mora aqui;
7
+ // as peças leem via useTheme() e a composição aceita um tema parcial por props.
8
+
9
+ export const W = 1080;
10
+ export const H = 1920;
11
+ export const FPS = 30;
12
+
13
+ const playfair = loadPlayfair("italic", { weights: ["600", "700"], subsets: ["latin"] });
14
+ const inter = loadInter("normal", { weights: ["400", "700", "800"], subsets: ["latin"] });
15
+ const mono = loadJetBrainsMono("normal", { weights: ["500", "700"], subsets: ["latin"] });
16
+
17
+ export const waitForFonts = (): Promise<unknown[]> =>
18
+ Promise.all([playfair.waitUntilDone(), inter.waitUntilDone(), mono.waitUntilDone()]);
19
+
20
+ export type EditorialTheme = {
21
+ bg: string; // fundo claro
22
+ grid: string; // linhas da grade (rgba bem sutil)
23
+ glow: string; // luz central do fundo
24
+ vignette: string; // escurecimento das bordas
25
+ ink: string; // texto principal sobre o fundo
26
+ card: string; // base dos cards escuros
27
+ cardHi: string; // topo do gradiente dos cards
28
+ line: string; // texto claro sobre card escuro
29
+ onAccent: string; // texto sobre a cor de destaque
30
+ accent: string; // cor de destaque (palavra-chave, chips, anel)
31
+ accentWarm: string; // início do gradiente dos raios
32
+ accentLight: string; // fim do gradiente, contadores, cursor
33
+ accentShadow: string; // sombra dos raios e do anel
34
+ dash: string; // conector tracejado
35
+ shadow: string; // sombra funda dos cards
36
+ serif: string;
37
+ sans: string;
38
+ mono: string;
39
+ };
40
+
41
+ export const defaultTheme: EditorialTheme = {
42
+ bg: "#EEE7DA",
43
+ grid: "rgba(60,40,20,.045)",
44
+ glow: "rgba(255,255,255,.55)",
45
+ vignette: "rgba(80,50,20,.10)",
46
+ ink: "#1A1A1A",
47
+ card: "#1C1916",
48
+ cardHi: "#2A2521",
49
+ line: "#DFD8C6",
50
+ onAccent: "#FFFFFF",
51
+ accent: "#B5541C",
52
+ accentWarm: "#C9622A",
53
+ accentLight: "#E39A6C",
54
+ accentShadow: "rgba(150,70,20,.25)",
55
+ dash: "#6B5A4A",
56
+ shadow: "0 50px 90px rgba(70,40,15,.32), 0 12px 24px rgba(40,20,5,.22)",
57
+ serif: playfair.fontFamily,
58
+ sans: inter.fontFamily,
59
+ mono: mono.fontFamily,
60
+ };
61
+
62
+ export const mergeTheme = (overrides?: Partial<EditorialTheme>): EditorialTheme => ({
63
+ ...defaultTheme,
64
+ ...overrides,
65
+ });
66
+
67
+ export const ThemeContext = createContext<EditorialTheme>(defaultTheme);
68
+ export const useTheme = (): EditorialTheme => useContext(ThemeContext);
@@ -0,0 +1,65 @@
1
+ import { FPS } from "./theme";
2
+
3
+ // Timing vem do ctc-align: { words: [{ text, start, end }], total } em segundos.
4
+ // Trocar a voz = realinhar o JSON; as cenas seguem as palavras-âncora, não segundos.
5
+
6
+ export type Word = { text: string; start: number; end: number };
7
+ export type WordsData = { words: Word[]; total: number };
8
+
9
+ export const norm = (s: string): string => s.toLowerCase().replace(/[^\p{L}\p{N}]/gu, "");
10
+
11
+ // Início (s) da primeira palavra `text` que começa em `after` ou depois.
12
+ // A busca é monotônica: sempre passe o tempo da âncora anterior como `after`,
13
+ // assim palavras repetidas ("e", "o") não casam com uma ocorrência antiga.
14
+ export const at = (words: readonly Word[], text: string, after = 0): number => {
15
+ const target = norm(text);
16
+ const hit = words.find((w) => w.start >= after - 0.001 && norm(w.text) === target);
17
+ if (!hit) throw new Error(`palavra não encontrada depois de ${after}s: "${text}"`);
18
+ return hit.start;
19
+ };
20
+
21
+ // Resolve um mapa nome -> palavra em tempos absolutos (monotônico na ordem de declaração).
22
+ export const resolveMarks = (
23
+ words: readonly Word[],
24
+ marks: Readonly<Record<string, string>> | undefined,
25
+ from: number,
26
+ ): Record<string, number> =>
27
+ Object.entries(marks ?? {}).reduce<{ cursor: number; out: Record<string, number> }>(
28
+ (acc, [name, text]) => {
29
+ const t = at(words, text, acc.cursor);
30
+ return { cursor: t, out: { ...acc.out, [name]: t } };
31
+ },
32
+ { cursor: from, out: {} },
33
+ ).out;
34
+
35
+ export type Anchored = { at: string; marks?: Record<string, string> };
36
+
37
+ export type TimedScene<T extends Anchored> = {
38
+ def: T;
39
+ from: number; // s, absoluto
40
+ dur: number; // s
41
+ marks: Record<string, number>; // s, RELATIVO ao início da cena (usa direto dentro da Sequence)
42
+ };
43
+
44
+ // Monta as cenas por âncora: cada cena começa na sua palavra e vai até a âncora da
45
+ // próxima. `overlap` faz a cena seguinte entrar um pouco antes enquanto a anterior sobe.
46
+ export const buildScenes = <T extends Anchored>(
47
+ words: readonly Word[],
48
+ defs: readonly T[],
49
+ opts: { end: number; overlap?: number },
50
+ ): TimedScene<T>[] => {
51
+ const overlap = opts.overlap ?? 0.12;
52
+ const starts = defs.reduce<number[]>((acc, d) => [...acc, at(words, d.at, acc[acc.length - 1] ?? 0)], []);
53
+ return defs.map((def, i) => {
54
+ const from = Math.max(0, starts[i] - (i ? overlap : 0));
55
+ const to = starts[i + 1] ?? opts.end;
56
+ const abs = resolveMarks(words, def.marks, starts[i]);
57
+ const marks = Object.fromEntries(Object.entries(abs).map(([k, v]) => [k, v - from]));
58
+ return { def, from, dur: to - from + overlap, marks };
59
+ });
60
+ };
61
+
62
+ export const toFrames = (seconds: number): number => Math.round(seconds * FPS);
63
+
64
+ // Duração total do filme: fim da fala + respiro final.
65
+ export const totalSeconds = (data: WordsData, tail = 1.4): number => data.total + tail;
@@ -0,0 +1,341 @@
1
+ {
2
+ "niches": {
3
+ "a": "dev / AI / build in public (EN)",
4
+ "b": "dev / AI / tech business (BR)",
5
+ "c": "personal finance / investing",
6
+ "d": "product / SaaS / marketing / business / law",
7
+ "e": "health / fitness / nutrition",
8
+ "f": "food / recipes / lifestyle / travel",
9
+ "g": "beauty / fashion / local services (clinic, salon, architecture, real estate)",
10
+ "h": "education / science / comedy"
11
+ },
12
+ "styles": {
13
+ "motion-editorial": {
14
+ "title": "Motion editorial (Greg Isenberg)",
15
+ "needs": "Only a voice track. No one on camera required (a short face insert is optional). App or product screens as screenshots.",
16
+ "fits": "Explaining a system, a workflow, a tool or a framework; tech, SaaS, AI, productivity, finance apps, B2B. Calm authority, saves and comments.",
17
+ "look": [
18
+ "Light warm background (cream, sand, light grey) with a faint square grid and a soft vignette.",
19
+ "One object at a time in the centre: dark rounded cards with deep soft shadows, pill-shaped inputs, file chips, a phone card holding a real screenshot.",
20
+ "An accent shape in one warm colour (orange, copper) that recurs: rays, a ring, a starburst.",
21
+ "Dashed connectors drawing between chips; text typed inside pills."
22
+ ],
23
+ "palette": "Background #EEE7DA, ink #1A1A1A, card #1C1916 → #2A2521, card text #DFD8C6, one accent (#B5541C / #C9622A / #E39A6C). Swap the accent for the brand colour; keep the light background.",
24
+ "type": "Serif italic display for headlines and pill text (Playfair Display italic 600/700); sans for small UI; mono for code.",
25
+ "motion": [
26
+ "Each scene enters with a spring (scale 0.94 → 1, rise 70 px) and leaves rising and fading; scenes overlap ~0.1 s, so there is no hard cut.",
27
+ "Slow camera push of 3 to 4 % across a scene.",
28
+ "Objects transform into the next object (pill becomes card, card becomes phone) instead of cutting.",
29
+ "Counters tick up to real numbers; typing in pills; connectors draw in."
30
+ ],
31
+ "captions": "Small or none. If used: one line of 2 to 4 words, sans bold ~50 px, ink colour on the light background, active word in the accent. Headline in serif italic, two-tone (ink + accent), only at key moments.",
32
+ "hook": "A serif headline of the claim with one object animating in under it (0 to 3 s). A real number works well.",
33
+ "cta": "The CTA word typed in a pill with the accent shape lighting up; one line of serif below.",
34
+ "music": "Continuous bed, calm (piano, ambient, soft electronic), around 0.2 of the voice level with fade in/out.",
35
+ "sfx": "Rare: a soft whoosh on the 2 or 3 biggest transformations, at most ~1 per 10 s. Light typing under one typed pill. Nothing on every scene.",
36
+ "dont": [
37
+ "Full-screen browser screen recordings (they can come out stretched); use real screenshots inside a phone card.",
38
+ "Giant outlined captions; they fight the editorial look.",
39
+ "A sound on every scene change; pops, dings and impacts in sequence."
40
+ ],
41
+ "template": "assets/remotion/editorial/"
42
+ },
43
+ "meme-rapido": {
44
+ "title": "Fast meme montage (Fireship, Filipe Deschamps)",
45
+ "needs": "A voice track and a stock of images: code, memes, stock clips, logos, article screenshots. Face optional.",
46
+ "fits": "Dev and tech news, explainers with humour, history of a technology, opinion pieces. Highest reach per dev channel in the set.",
47
+ "look": [
48
+ "Dark or saturated flat background (black, navy, electric blue).",
49
+ "Big display text, code on screen, stock footage, meme reaction clips, hand-drawn stick figures, logos stacking on a timeline.",
50
+ "Highlighter pills on key words (yellow/orange on BR channels)."
51
+ ],
52
+ "palette": "Black or navy base; 2 to 4 loud accents (yellow, cyan, lime, orange, purple). Official logo colours when logos appear.",
53
+ "type": "Heavy rounded or pixel display font for key words; mono for code; bold sans for pills.",
54
+ "motion": [
55
+ "Hard cuts every 1.5 to 3 s; text pops in; stills slide or scale briefly.",
56
+ "Memes and reaction clips as punchlines, usually 1 to 2 s.",
57
+ "Timeline variant: items accumulate on one canvas, almost no cuts."
58
+ ],
59
+ "captions": "Key words only, very large and coloured, centred; or a highlighter pill of 2 to 4 lowercase words lower-centre (BR variant).",
60
+ "hook": "A surprising fact or number in huge type in the first second.",
61
+ "cta": "Usually spoken; a final meme or the channel's signature card.",
62
+ "music": "Continuous bed in most (upbeat lo-fi / electronic), low under the voice.",
63
+ "sfx": "Whoosh on some cuts and a pop on text, but only on a minority of cuts (see the measured row).",
64
+ "dont": [
65
+ "A sound on every cut.",
66
+ "Memes longer than the joke (more than ~2 s).",
67
+ "Small text: this style lives on huge type."
68
+ ]
69
+ },
70
+ "explicador-animado": {
71
+ "title": "Animated explainer (Kurzgesagt, Jeff Nippard, Jeremy Ethier)",
72
+ "needs": "A voice track and animation (2D illustration, 3D anatomy, infographics, charts). Face optional, often as b-roll.",
73
+ "fits": "Science, health, fitness, nutrition, finance concepts, any 'how it works'. Among the highest median reach of every style measured.",
74
+ "look": [
75
+ "Flat saturated illustration (Kurzgesagt) or a dark gym / light neutral background with 3D anatomy and highlights.",
76
+ "Red or warm glow over the subject (the muscle, the organ, the number); dashed arrows; before/after comparisons; charts that build."
77
+ ],
78
+ "palette": "Saturated illustration palette, or grey/charcoal base with one red highlight and one green/neon secondary.",
79
+ "type": "Heavy italic sans for titles; plain sans for captions; thin serif or sans for data labels.",
80
+ "motion": [
81
+ "Scene change every 2 to 3 s; elements build in sequence; highlight pulses on the subject; charts draw.",
82
+ "Camera moves inside the illustration rather than cutting."
83
+ ],
84
+ "captions": "Small, white with outline, lower-centre, often no colour emphasis; titles big in a gradient or bold colour.",
85
+ "hook": "The claim plus the visual of the subject highlighted, or a data point ('19% body fat') in the first second.",
86
+ "cta": "A summary table or the full routine/sheet on screen; spoken follow/save.",
87
+ "music": "Continuous bed in almost every case; the richest scores of the set (Kurzgesagt's are composed by Epic Mountain).",
88
+ "sfx": "Whooshes on transitions are common here, still only on a minority of cuts; soft UI sounds on highlights.",
89
+ "dont": [
90
+ "Static slides with voice over.",
91
+ "More than one highlight colour fighting for attention."
92
+ ]
93
+ },
94
+ "talking-head-legenda": {
95
+ "title": "Talking head with highlighted captions",
96
+ "needs": "A person on camera talking (selfie, studio, stream, stage). Nothing else.",
97
+ "fits": "Opinion, news, advice, reaction, review, beauty talk; every niche in the set has it. Reach comes from the content, not the edit.",
98
+ "look": [
99
+ "One framing (selfie or studio), sometimes a second angle; jump cuts remove pauses.",
100
+ "A headline box (white or black) in the first seconds; captions word by word."
101
+ ],
102
+ "palette": "Whatever the room is; captions white with outline, one accent for the keyword (yellow is the BR default; red, green or purple elsewhere).",
103
+ "type": "Bold sans uppercase for captions; condensed bold for the headline box; some finance/BR channels use a white serif.",
104
+ "motion": [
105
+ "Few cuts (median ~1 per 10 s); punch-in zooms on emphasis; occasional reaction insert."
106
+ ],
107
+ "captions": "Word by word or 1 to 3 words, bold, lower-centre (above the platform UI), keyword in the accent colour.",
108
+ "hook": "The headline box with the claim or question in the first frame, spoken at the same time.",
109
+ "cta": "Spoken to camera; caption repeats the keyword.",
110
+ "music": "None or faint in most; the voice carries it.",
111
+ "sfx": "Rare; an occasional pop on a caption keyword.",
112
+ "dont": [
113
+ "Leaving pauses and 'uhs' in.",
114
+ "Captions under the like/comment buttons.",
115
+ "Music that competes with the voice."
116
+ ]
117
+ },
118
+ "talking-head-cards": {
119
+ "title": "Talking head with cards and b-roll",
120
+ "needs": "A person on camera plus things to show: news headlines, article screenshots, charts, product shots, stock b-roll.",
121
+ "fits": "News and commentary (finance, tech, science), explainers with evidence, any niche that needs proof on screen.",
122
+ "look": [
123
+ "Face in selfie or studio; cards slide over the frame: headline screenshots with highlighter, numbered section titles, charts, stickers.",
124
+ "Variants: split screen (archive images on top, presenter below), face in a bubble over full-screen b-roll."
125
+ ],
126
+ "palette": "Neutral room; white cards; highlighter yellow; one alert colour (red) for numbers and arrows.",
127
+ "type": "Condensed bold uppercase for section titles; medium sans for captions (yellow with outline on BR channels).",
128
+ "motion": [
129
+ "Cards enter over the face rather than cutting away; cuts mostly when the topic changes.",
130
+ "Face bubble stays on from after the hook to the CTA when b-roll is full screen."
131
+ ],
132
+ "captions": "Lower-centre, yellow or white with keyword emphasis; section number big at the top when the piece is a list.",
133
+ "hook": "A thumbnail-like card in the first frames ('THIS BANK WILL BE NEXT?') with a red arrow or the key number.",
134
+ "cta": "Back to the face full screen, no card on top.",
135
+ "music": "Faint bed in most; continuous in the faster ones.",
136
+ "sfx": "A soft whoosh or paper sound when a card enters, on a minority of cards.",
137
+ "dont": [
138
+ "Cards covering the face for long stretches.",
139
+ "Unreadable article screenshots (crop to the line that matters and highlight it)."
140
+ ]
141
+ },
142
+ "podcast-clip": {
143
+ "title": "Podcast or interview clip",
144
+ "needs": "A recorded conversation or talk with at least one good camera; a second angle helps.",
145
+ "fits": "Finance, health, business, mindset; any expert talking. Reuses long-form content.",
146
+ "look": [
147
+ "Two cameras alternating speakers in a dark studio; channel badge in a corner.",
148
+ "Variants: letterbox with a title bar on top; tier list or ranking being filled over the clip; reaction picture-in-picture; black background with the clip in a window and tools stacking (Starter Story)."
149
+ ],
150
+ "palette": "Studio darks; captions white with yellow/red keywords; title bar white with black text.",
151
+ "type": "Condensed bold uppercase captions; plain bold sans titles.",
152
+ "motion": [
153
+ "Cuts follow the speaker; inserts of the thing being discussed (product, card, chart) full frame for 1 to 2 s."
154
+ ],
155
+ "captions": "Word by word, large, uppercase, white with outline, keyword in yellow or red, lower-centre.",
156
+ "hook": "Start mid-sentence on the strongest line, or with the title/ranking on screen.",
157
+ "cta": "Spoken or a title card; often none (the clip ends on the punchline).",
158
+ "music": "None or faint.",
159
+ "sfx": "Almost none on cuts.",
160
+ "dont": [
161
+ "Starting with greetings or context.",
162
+ "Clips that need the long episode to make sense."
163
+ ]
164
+ },
165
+ "camera-no-setup": {
166
+ "title": "Camera filming the setup (Riley Brown, NetworkChuck, Theo)",
167
+ "needs": "A real camera (or phone) filming the screen, the phone in hand, the hardware or a prop. Face optional.",
168
+ "fits": "Tool demos, AI coding, hardware, 'look what I built'. Feels authentic, not produced.",
169
+ "look": [
170
+ "Physical camera shots of monitor and phone with hands in frame; close-ups of the product; cuts to clean screen captures when detail is needed.",
171
+ "Headline at the top in the first seconds."
172
+ ],
173
+ "palette": "Real room light, often warm or purple; captions white, keyword in a coloured box.",
174
+ "type": "Bold sans uppercase captions, 1 to 3 words.",
175
+ "motion": [
176
+ "Handheld moves; a cut every ~4 to 8 s between face, hands, screen (NetworkChuck is the fast variant, ~2.7 s); punch-in on the screen detail."
177
+ ],
178
+ "captions": "Short, uppercase, lower-centre, keyword in a coloured box (purple/yellow).",
179
+ "hook": "The product or the result physically in hand in the first second.",
180
+ "cta": "Spoken, sometimes 'link in bio' on screen.",
181
+ "music": "Mixed: none or a continuous bed.",
182
+ "sfx": "Almost none on cuts.",
183
+ "dont": [
184
+ "Screen recordings that look stretched or tiny; film the screen or use a crisp capture."
185
+ ]
186
+ },
187
+ "quadro-branco": {
188
+ "title": "Whiteboard or hand drawing",
189
+ "needs": "A board, a notebook or a drawing app, and someone explaining. Face optional.",
190
+ "fits": "Concepts, frameworks, health explanations, programming ideas. Long single takes are acceptable here.",
191
+ "look": [
192
+ "Hand drawing in a notebook with highlighters (Filipe Deschamps), a board in one take (Dayan Siebra), white lines drawn on black (ThePrimeagen), a flip chart behind the speaker (Codie Sanchez).",
193
+ "A fixed question or title box at the top for the whole video."
194
+ ],
195
+ "palette": "Paper white or board black; one neon highlighter; ink colours of the markers.",
196
+ "type": "Handwriting for the content; plain sans in a white box for the fixed title.",
197
+ "motion": [
198
+ "Drawing appears progressively; few cuts; long takes (a median scene of several seconds)."
199
+ ],
200
+ "captions": "Often none beyond the drawing; when present, small and plain.",
201
+ "hook": "The provocative question fixed on screen from frame one.",
202
+ "cta": "Spoken; sometimes the drawing ends on the CTA.",
203
+ "music": "Mixed; often none.",
204
+ "sfx": "None measured on cuts.",
205
+ "dont": [
206
+ "Drawing that the viewer cannot read on a phone (write big)."
207
+ ]
208
+ },
209
+ "desafio-numero": {
210
+ "title": "Challenge or comparison with a number on screen (Nick DiGiovanni, Mark Tilbury)",
211
+ "needs": "Something to film doing the challenge: food, a product, a street interaction. A presenter is optional.",
212
+ "fits": "Food, money, products, everyday economics. The highest single reach in the set (107M).",
213
+ "look": [
214
+ "A visible progress device fixed on screen: time icons (1 s / 1 min / 1 h) changing colour per stage, emoji checklist, price tags on each ingredient.",
215
+ "Close hands, real places (market, street), a reaction at the end."
216
+ ],
217
+ "palette": "Warm natural colours; tags in bright yellow with black outline; red/green icons for stages.",
218
+ "type": "Bold sans; price tags heavy with outline; often no captions at all.",
219
+ "motion": [
220
+ "A cut per stage of the challenge (median scene ~2.3 s); ingredients drop in; tag pops on each price."
221
+ ],
222
+ "captions": "Often none (the icons tell the story); when present, white bold word by word with the number bigger in yellow.",
223
+ "hook": "The first stage already happening plus the device on screen (icon '1s', price '$9.84').",
224
+ "cta": "The final reaction or the total; spoken follow.",
225
+ "music": "Faint bed in most.",
226
+ "sfx": "Rare on cuts; a pop or tick when a tag or icon appears.",
227
+ "dont": [
228
+ "Hiding the number; the number is the story."
229
+ ]
230
+ },
231
+ "macro-asmr": {
232
+ "title": "Close-up product or recipe (Niina Secrets, Receitas de Pai, Ana Maria Brogui)",
233
+ "needs": "A physical product or food filmed close (overhead or macro), hands in frame. Face optional.",
234
+ "fits": "Beauty, food, crafts, any physical product. Fast and tactile.",
235
+ "look": [
236
+ "Macro of texture (gloss, sauce, dough), overhead table with ingredients, hands working; the finished result shown in the first second.",
237
+ "Natural sound of the process (sizzle, pour, click) is part of the piece."
238
+ ],
239
+ "palette": "The product's own colours on a neutral surface (beige, wood, checked cloth).",
240
+ "type": "Little or no text; a watermark or logo; ingredient labels in bold if any.",
241
+ "motion": [
242
+ "Fast cutting: median ~3.9 cuts per 10 s (scene ~2.2 s), up to ~10 in product macros; each cut is a step."
243
+ ],
244
+ "captions": "Usually none; quantities in a box if it is a recipe.",
245
+ "hook": "The final result (bite, swatch, finished dish) in the first second.",
246
+ "cta": "Logo card or spoken; the recipe in the caption/description.",
247
+ "music": "Mixed; a beat in beauty, faint or none in recipes where the process sound matters.",
248
+ "sfx": "Measured hits here are partly the music's kick; treat the number as uncertain. Process sounds matter more than added SFX.",
249
+ "dont": [
250
+ "Covering the product with text.",
251
+ "Slow steps; every step is one shot."
252
+ ]
253
+ },
254
+ "pov-vlog": {
255
+ "title": "POV vlog (Drew Binsky)",
256
+ "needs": "Handheld footage of a place or experience, wide lens, the creator's voice.",
257
+ "fits": "Travel, experiences, behind the scenes, 'a day at'.",
258
+ "look": [
259
+ "Wide-angle phone footage, quick cuts, a selfie at the end; emphasis word in red."
260
+ ],
261
+ "palette": "The place; captions white with shadow; red emphasis.",
262
+ "type": "Bold sans with black outline.",
263
+ "motion": [
264
+ "Quick cuts (median ~2.7 per 10 s, up to ~6.4); question-mark stickers; movement in every shot."
265
+ ],
266
+ "captions": "1 to 3 words, white bold, lower-centre, emphasis in red.",
267
+ "hook": "The most striking shot of the place plus a curiosity title in 0 to 1 s.",
268
+ "cta": "Selfie to camera at the end.",
269
+ "music": "Continuous or faint bed.",
270
+ "sfx": "Almost none on cuts.",
271
+ "dont": [
272
+ "Static shots; this style is movement."
273
+ ]
274
+ },
275
+ "tour": {
276
+ "title": "Walkthrough or tour (Enes Yilmazer, Ryan Serhant)",
277
+ "needs": "A place to walk through (property, studio, store) and someone guiding.",
278
+ "fits": "Real estate, architecture, travel destinations, venues, clinics, stores; local services.",
279
+ "look": [
280
+ "Walking through the space facing the camera; a seated close; an insert of a phone/app when relevant; or one long take of the agent talking with a title box."
281
+ ],
282
+ "palette": "The space; captions white; brand red for logos.",
283
+ "type": "Plain or condensed sans; title in a white box at the start.",
284
+ "motion": [
285
+ "Walking tours cut every ~2 s (median scene 2.1 s) between rooms or spots; the single-take agent talk is the slow variant.",
286
+ "The walk itself is the motion; no graphic transitions."
287
+ ],
288
+ "captions": "1 or 2 words, white, centre or middle third.",
289
+ "hook": "The most impressive room first, or the quote of the claim in a title box.",
290
+ "cta": "Spoken; contact on screen.",
291
+ "music": "None measured.",
292
+ "sfx": "None measured on cuts.",
293
+ "dont": [
294
+ "Graphic transitions between rooms; cut on the walk.",
295
+ "Measured reach is modest (hundreds of thousands to ~1M), not tens of millions."
296
+ ]
297
+ },
298
+ "experimento": {
299
+ "title": "Experiment or demonstration (Veritasium)",
300
+ "needs": "A physical experiment or a demonstration you can film, optionally street questions.",
301
+ "fits": "Science, education, product proof ('watch what happens when').",
302
+ "look": [
303
+ "A clean bench or real location; macro of the mechanism; montage between street poll and explanation."
304
+ ],
305
+ "palette": "Natural; captions yellow with black outline or white with shadow.",
306
+ "type": "Bold sans with outline.",
307
+ "motion": [
308
+ "Cuts every ~2.5 s between the setup, the reaction and the explanation."
309
+ ],
310
+ "captions": "Lower-centre, yellow bold with outline, key words highlighted.",
311
+ "hook": "The question over the close-up of the experiment ('what if you cut the green rope?').",
312
+ "cta": "The reveal is the payoff; spoken follow.",
313
+ "music": "Faint or continuous, unobtrusive.",
314
+ "sfx": "None measured on cuts.",
315
+ "dont": [
316
+ "Revealing the answer before the question lands."
317
+ ]
318
+ },
319
+ "esquete": {
320
+ "title": "Sketch (Porta dos Fundos, Manual do Mundo)",
321
+ "needs": "Actors (or one person in two roles), a set, a script with a punchline.",
322
+ "fits": "Comedy, branded content (the sketch carries the ad), education with humour.",
323
+ "look": [
324
+ "Fixed medium shots, cuts between speakers, inserts of hands/props; costumes change roles."
325
+ ],
326
+ "palette": "Set colours; captions white bold with yellow/cyan keywords.",
327
+ "type": "Bold sans uppercase.",
328
+ "motion": [
329
+ "Fast dialogue cuts (median ~5.4 per 10 s, scene ~1.6 s)."
330
+ ],
331
+ "captions": "Lower-centre, white bold, keywords coloured.",
332
+ "hook": "The absurd situation in the first line of dialogue.",
333
+ "cta": "The punchline; brand at the end if sponsored.",
334
+ "music": "None or faint.",
335
+ "sfx": "Rare on cuts.",
336
+ "dont": [
337
+ "Setup longer than 3 s before the first joke."
338
+ ]
339
+ }
340
+ }
341
+ }