@danhachuel/thunderbolt 0.4.24 → 0.4.26
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.
package/hermes_ui/storage.py
CHANGED
|
@@ -368,8 +368,17 @@ def seed_blueprints() -> None:
|
|
|
368
368
|
shutil.copy2(source, target)
|
|
369
369
|
pair_source = SEED_BLUEPRINTS / "thumbnail_blueprint_pairs.json"
|
|
370
370
|
pair_target = BLUEPRINTS / "thumbnail_blueprint_pairs.json"
|
|
371
|
-
if pair_source.exists()
|
|
372
|
-
|
|
371
|
+
if pair_source.exists():
|
|
372
|
+
try:
|
|
373
|
+
seeded_pairs = json.loads(pair_source.read_text(encoding="utf-8"))
|
|
374
|
+
current_pairs = json.loads(pair_target.read_text(encoding="utf-8")) if pair_target.exists() else {}
|
|
375
|
+
if isinstance(seeded_pairs, dict) and isinstance(current_pairs, dict):
|
|
376
|
+
merged_pairs = {**seeded_pairs, **current_pairs}
|
|
377
|
+
if merged_pairs != current_pairs:
|
|
378
|
+
atomic_write(pair_target, merged_pairs)
|
|
379
|
+
except (OSError, UnicodeError, json.JSONDecodeError):
|
|
380
|
+
if not pair_target.exists():
|
|
381
|
+
shutil.copy2(pair_source, pair_target)
|
|
373
382
|
|
|
374
383
|
|
|
375
384
|
def seed_prompt_masters() -> None:
|
|
@@ -17,7 +17,7 @@ The output must be a practical, locked visual system, not a script blueprint. In
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def _slug(value: Any) -> str:
|
|
20
|
-
text = re.sub(r"[^A-Za-z0-9]+", "_", str(value or "").strip()).strip("_")
|
|
20
|
+
text = re.sub(r"[^A-Za-z0-9À-ÿ]+", "_", str(value or "").strip(), flags=re.UNICODE).strip("_")
|
|
21
21
|
return text or "General"
|
|
22
22
|
|
|
23
23
|
|
|
@@ -120,7 +120,9 @@ def generate_thumbnail_blueprint(
|
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
def save_thumbnail_blueprint(document: Mapping[str, Any]) -> Path:
|
|
123
|
-
|
|
123
|
+
raw_name = str(document.get("niche") or document.get("name") or "General").strip()
|
|
124
|
+
raw_name = re.sub(r"_Thumbnail_Blueprint$", "", raw_name, flags=re.IGNORECASE)
|
|
125
|
+
name = _record_name(raw_name)
|
|
124
126
|
folder = BLUEPRINTS / "thumbnails"
|
|
125
127
|
folder.mkdir(parents=True, exist_ok=True)
|
|
126
128
|
target = folder / f"{name}.md"
|
package/package.json
CHANGED
package/scripts/install.mjs
CHANGED
|
@@ -143,7 +143,17 @@ function copySeedBlueprints(storageRoot) {
|
|
|
143
143
|
}
|
|
144
144
|
const pairSource = join(seedRoot, "thumbnail_blueprint_pairs.json");
|
|
145
145
|
const pairTarget = join(storageRoot, "blueprints", "thumbnail_blueprint_pairs.json");
|
|
146
|
-
if (existsSync(pairSource)
|
|
146
|
+
if (existsSync(pairSource)) {
|
|
147
|
+
try {
|
|
148
|
+
const seededPairs = JSON.parse(readFileSync(pairSource, "utf8"));
|
|
149
|
+
const currentPairs = existsSync(pairTarget) ? JSON.parse(readFileSync(pairTarget, "utf8")) : {};
|
|
150
|
+
if (seededPairs && currentPairs && typeof seededPairs === "object" && typeof currentPairs === "object") {
|
|
151
|
+
writeFileSync(pairTarget, JSON.stringify({ ...seededPairs, ...currentPairs }, null, 2) + "\n", "utf8");
|
|
152
|
+
}
|
|
153
|
+
} catch {
|
|
154
|
+
if (!existsSync(pairTarget)) copyFileSync(pairSource, pairTarget);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
147
157
|
}
|
|
148
158
|
|
|
149
159
|
function copySeedPromptMasters(storageRoot) {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"BLUEPRINTCANALMILITAR": "Militar_Thumbnail_Blueprint",
|
|
3
|
-
"MILITAR": "Militar_Thumbnail_Blueprint"
|
|
3
|
+
"MILITAR": "Militar_Thumbnail_Blueprint",
|
|
4
|
+
"blueprintcanalfinanças": "FINANCE_Thumbnail_Blueprint",
|
|
5
|
+
"blueprintcanalfinancas": "FINANCE_Thumbnail_Blueprint",
|
|
6
|
+
"BLUEPRINT CANAL FINANÇAS": "FINANCE_Thumbnail_Blueprint",
|
|
7
|
+
"FINANÇAS": "FINANCE_Thumbnail_Blueprint",
|
|
8
|
+
"FINANCAS": "FINANCE_Thumbnail_Blueprint"
|
|
4
9
|
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
🔒 STYLE LOCK — NON-NEGOTIABLE
|
|
2
|
+
|
|
3
|
+
Clean, educational whiteboard/animation-style thumbnails for personal finance content. The visual language is approachable, simplified, and focused on breaking down complex money topics into digestible visuals. Thumbnails feature a consistent animated character (Nick) as the host, surrounded by financial symbols, charts, and money-related iconography. The overall vibe is friendly, trustworthy, and educational — not aggressive, not overly polished/realistic, and never cluttered.
|
|
4
|
+
|
|
5
|
+
❌ Not allowed:
|
|
6
|
+
|
|
7
|
+
Photorealistic faces or live-action photography
|
|
8
|
+
|
|
9
|
+
Dark, moody, or dramatic lighting (keep it bright and clean)
|
|
10
|
+
|
|
11
|
+
Cluttered backgrounds with more than 3–4 distinct visual elements
|
|
12
|
+
|
|
13
|
+
Text that exceeds 5–6 words total on the thumbnail
|
|
14
|
+
|
|
15
|
+
Aggressive red "clickbait" arrows or excessive attention-grabbing graphics
|
|
16
|
+
|
|
17
|
+
Stock photo-style imagery (everything should match the whiteboard/animated aesthetic)
|
|
18
|
+
|
|
19
|
+
🧍♂️ FRAMING & POSE
|
|
20
|
+
|
|
21
|
+
Primary subject: A consistent animated character representing "Nick" — a friendly, approachable male figure with a neutral-to-enthusiastic expression. The character is drawn in a simple, flat 2D illustration style consistent with whiteboard animation aesthetics.
|
|
22
|
+
|
|
23
|
+
Framing: Medium shot (chest/head and shoulders) or full-body character positioned on the left or right side of the frame, leaving the opposite side for text and visual elements.
|
|
24
|
+
|
|
25
|
+
Angle: Straight-on, eye-level perspective — no dramatic low or high angles. The character faces the viewer or slightly angles toward the center of the frame.
|
|
26
|
+
|
|
27
|
+
Energy: Calm, confident, and informative. The character may point toward a chart, hold money, or gesture toward the text area. No extreme emotions (no shock, fear, or anger faces).
|
|
28
|
+
|
|
29
|
+
Cropping: Generous breathing room around the character — never cropped tightly against the edges.
|
|
30
|
+
|
|
31
|
+
🎨 BACKGROUND & LIGHTING
|
|
32
|
+
|
|
33
|
+
Environment: Clean, minimal background — typically a solid or subtly gradient color (light blue, soft green, warm yellow, or white) that suggests a "whiteboard" or educational setting. Sometimes features a simple grid pattern or subtle chalkboard texture.
|
|
34
|
+
|
|
35
|
+
Lighting: Flat, even, shadowless illumination — consistent with 2D animation. No dramatic shadows, no harsh highlights.
|
|
36
|
+
|
|
37
|
+
Depth: Minimal — the background and foreground are clearly separated but exist on the same visual plane. No complex 3D depth or parallax.
|
|
38
|
+
|
|
39
|
+
Visual noise: Extremely low. Background contains at most 1–2 supporting visual elements (e.g., a simple bar chart, a stack of coins, an upward arrow) placed behind or beside the character.
|
|
40
|
+
|
|
41
|
+
🧭 IDENTIFICADORES / SÍMBOLOS DO CANAL
|
|
42
|
+
|
|
43
|
+
Recurring visual symbols:
|
|
44
|
+
|
|
45
|
+
Money symbols: Dollar signs ($), stacks of coins, bundles of cash
|
|
46
|
+
|
|
47
|
+
Financial charts: Simple upward-trending line graphs or bar charts (green/blue)
|
|
48
|
+
|
|
49
|
+
Arrows: Clean, single-direction arrows (green for up, red for down) — minimal use
|
|
50
|
+
|
|
51
|
+
Icons: Piggy bank, calculator, calendar, clock (all in simple 2D icon style)
|
|
52
|
+
|
|
53
|
+
The host character: A consistent illustrated "Nick" figure — the channel's recognizable mascot/personality
|
|
54
|
+
|
|
55
|
+
Placement: Symbols are placed strategically around the character or integrated into the background — never overlapping the character's face or the main text.
|
|
56
|
+
|
|
57
|
+
🚨 VISUAL ATTENTION ELEMENT
|
|
58
|
+
|
|
59
|
+
Usage: Minimal and purposeful. The channel appears to avoid aggressive clickbait tactics.
|
|
60
|
+
|
|
61
|
+
If used:
|
|
62
|
+
|
|
63
|
+
A single, clean arrow (green or yellow) pointing toward the key visual or text
|
|
64
|
+
|
|
65
|
+
A subtle circle or highlight around a specific element (e.g., a number, a dollar amount)
|
|
66
|
+
|
|
67
|
+
No emojis, no multiple arrows, no neon glow effects
|
|
68
|
+
|
|
69
|
+
Rule: Less is more. If an attention element is used, it serves to guide the viewer's eye, not to shock or overwhelm.
|
|
70
|
+
|
|
71
|
+
📝 TEXT STYLE
|
|
72
|
+
|
|
73
|
+
Structure:
|
|
74
|
+
|
|
75
|
+
Maximum 2 lines of text
|
|
76
|
+
|
|
77
|
+
Positioned on the opposite side of the character (if character is left, text is right; if character is right, text is left)
|
|
78
|
+
|
|
79
|
+
Text occupies approximately 15–20% of the thumbnail area
|
|
80
|
+
|
|
81
|
+
Typography:
|
|
82
|
+
|
|
83
|
+
Bold, sans-serif font (e.g., Montserrat, Roboto, or similar clean geometric font)
|
|
84
|
+
|
|
85
|
+
Primary text: White or bright yellow, with a dark outline or subtle shadow for contrast
|
|
86
|
+
|
|
87
|
+
Secondary text (if used): Smaller, in a contrasting color (e.g., green or blue)
|
|
88
|
+
|
|
89
|
+
Hierarchy:
|
|
90
|
+
|
|
91
|
+
Line 1: Primary hook (largest, boldest) — 3–4 words max
|
|
92
|
+
|
|
93
|
+
Line 2: Supporting context (smaller) — 2–3 words max
|
|
94
|
+
|
|
95
|
+
Background for text: Optional — a semi-transparent pill-shaped or rectangular bar behind the text to ensure readability against any background.
|
|
96
|
+
|
|
97
|
+
🧠 TEXT PSYCHOLOGY
|
|
98
|
+
|
|
99
|
+
Tone: Curious, educational, slightly urgent but not alarmist. The text promises value and clarity — "Here's what you need to know" energy.
|
|
100
|
+
|
|
101
|
+
Common psychological triggers observed/inferred:
|
|
102
|
+
|
|
103
|
+
Curiosity gap: "What They Don't Tell You About..."
|
|
104
|
+
|
|
105
|
+
Number/List: "3 Ways to..." / "5 Mistakes..."
|
|
106
|
+
|
|
107
|
+
Direct address: "You're Doing This Wrong"
|
|
108
|
+
|
|
109
|
+
Benefit-driven: "How to Save $___"
|
|
110
|
+
|
|
111
|
+
Question: "Is This a Scam?"
|
|
112
|
+
|
|
113
|
+
Examples of likely headline patterns:
|
|
114
|
+
|
|
115
|
+
"3 Passive Income Ideas"
|
|
116
|
+
|
|
117
|
+
"This One Rule Changed Everything"
|
|
118
|
+
|
|
119
|
+
"Why 90% Lose Money"
|
|
120
|
+
|
|
121
|
+
"How to Retire Early"
|
|
122
|
+
|
|
123
|
+
"The Truth About Investing"
|
|
124
|
+
|
|
125
|
+
🎯 COMPOSITION RULES
|
|
126
|
+
|
|
127
|
+
Rule of thirds: Character placed on the left or right vertical third line. Text occupies the opposite side. Supporting visual elements (charts, icons) are placed in the remaining quadrants.
|
|
128
|
+
|
|
129
|
+
Focal hierarchy:
|
|
130
|
+
|
|
131
|
+
Primary: Character's face (human connection)
|
|
132
|
+
|
|
133
|
+
Secondary: Text (the promise/hook)
|
|
134
|
+
|
|
135
|
+
Tertiary: Supporting visuals (context/reinforcement)
|
|
136
|
+
|
|
137
|
+
Negative space: Generous use of empty space around the character and text — nothing feels cramped.
|
|
138
|
+
|
|
139
|
+
Distraction control: Maximum 3–4 distinct visual elements total (character, text, 1–2 symbols/charts).
|
|
140
|
+
|
|
141
|
+
Mobile-first: Text is large enough to read on a smartphone screen. Character's face is clearly visible even at small sizes.
|
|
142
|
+
|
|
143
|
+
📐 FORMAT & QUALITY
|
|
144
|
+
|
|
145
|
+
Aspect ratio:
|
|
146
|
+
16:9
|
|
147
|
+
|
|
148
|
+
Resolution:
|
|
149
|
+
1280 × 720 minimum
|
|
150
|
+
|
|
151
|
+
Image style: 2D illustration / whiteboard animation style — flat colors, clean lines, no gradients or 3D rendering. The aesthetic should match "explainer video" illustration quality.
|
|
152
|
+
|
|
153
|
+
Sharpness: Crisp and clear — no blur, no painterly effects.
|
|
154
|
+
|
|
155
|
+
Technical restrictions: No photographic elements. No live-action footage. All elements must be in a consistent illustration style. Colors should be bright and saturated but not neon.
|
|
156
|
+
|
|
157
|
+
🧠 FINAL OBJECTIVE
|
|
158
|
+
|
|
159
|
+
Primary goal:
|
|
160
|
+
Maximize YouTube CTR for personal finance / investing education content
|
|
161
|
+
|
|
162
|
+
Target emotional triggers:
|
|
163
|
+
|
|
164
|
+
Curiosity about money and investing
|
|
165
|
+
|
|
166
|
+
Desire for financial security and passive income
|
|
167
|
+
|
|
168
|
+
Fear of missing out on wealth-building opportunities
|
|
169
|
+
|
|
170
|
+
Trust in an expert/guide figure
|
|
171
|
+
|
|
172
|
+
Target audience: Beginners to intermediate investors — people looking to understand personal finance, build wealth, and manage debt in a simple, approachable way.
|
|
173
|
+
|
|
174
|
+
🧾 FINAL INPUT FORMAT
|
|
175
|
+
|
|
176
|
+
VIDEO TITLE:
|
|
177
|
+
"[placeholder — will be filled in the next step with the actual video title/script]"
|
|
178
|
+
|
|
179
|
+
⚙️ FINAL SYSTEM INSTRUCTION
|
|
180
|
+
|
|
181
|
+
You are a thumbnail designer for the Nick Invests YouTube channel. Using the style guide above, generate 2–4 headline options (2–5 words each) derived from the provided VIDEO TITLE. Then create a thumbnail image that follows all style rules above:
|
|
182
|
+
|
|
183
|
+
2D illustration / whiteboard animation style
|
|
184
|
+
|
|
185
|
+
Nick character (animated host) on one side
|
|
186
|
+
|
|
187
|
+
Clean, bright background with minimal visual noise
|
|
188
|
+
|
|
189
|
+
Text on the opposite side (max 2 lines, bold sans-serif)
|
|
190
|
+
|
|
191
|
+
1–2 supporting financial symbols (optional)
|
|
192
|
+
|
|
193
|
+
No photographic elements, no aggressive clickbait styling
|