diff --git a/README.md b/README.md
index 83af1a95..ef4ee78a 100644
--- a/README.md
+++ b/README.md
@@ -35,6 +35,12 @@ Turn your AI coding assistant into a full video production studio. Describe what
> **"VOID — Neural Interface"** — a product ad produced with just one API key (OpenAI). 4 AI-generated images (gpt-image-1), TTS narration, auto-sourced royalty-free music, word-level subtitles via WhisperX, and Remotion data visualizations. Total cost: **$0.69**. Zero manual asset work.
+
+
+
+
+> **"LUMINA — Bioluminescent Terrarium"** — a product ad with zero narration, driven entirely by music, typography, and AI-generated imagery. 5 FLUX-generated images, cinematic ambient soundtrack from Pixabay, animated data visualizations (KPI grids, bar charts, comparison cards), and layered stat reveal overlays. Total cost: **$0.15**. No voiceover, no manual editing.
+
Works with **Claude Code, Cursor, Copilot, Windsurf, Codex** — any AI coding assistant that can read files and run code.
---
diff --git a/remotion-composer/public/demo-props/37-trillion.json b/remotion-composer/public/demo-props/37-trillion.json
new file mode 100644
index 00000000..160e6b70
--- /dev/null
+++ b/remotion-composer/public/demo-props/37-trillion.json
@@ -0,0 +1,789 @@
+{
+ "cuts": [
+ {
+ "id": "scene-1-hero",
+ "source": "",
+ "in_seconds": 0,
+ "out_seconds": 4,
+ "type": "hero_title",
+ "text": "37 TRILLION",
+ "heroSubtitle": "The cells that make you, you",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-2-dividing",
+ "source": "",
+ "in_seconds": 4,
+ "out_seconds": 9,
+ "type": "stat_card",
+ "stat": "25M",
+ "subtitle": "cells dividing inside you right now, every single second",
+ "accentColor": "#F59E0B",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-3-blood-cells",
+ "source": "37-trillion/red-blood-cells.png",
+ "in_seconds": 9,
+ "out_seconds": 14,
+ "type": "generated",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-4-kpi-overview",
+ "source": "",
+ "in_seconds": 14,
+ "out_seconds": 20,
+ "type": "kpi_grid",
+ "title": "Your Cellular Universe",
+ "columns": 4,
+ "chartAnimation": "cascade",
+ "backgroundColor": "#0F172A",
+ "chartData": [
+ {
+ "label": "Total Cells",
+ "value": 37.2,
+ "suffix": " Trillion",
+ "change": 0,
+ "icon": "\ud83e\udec0"
+ },
+ {
+ "label": "Red Blood Cells",
+ "value": 70,
+ "suffix": "%",
+ "change": 25,
+ "icon": "\u2764\ufe0f"
+ },
+ {
+ "label": "Vessel Length",
+ "value": 60,
+ "suffix": "K miles",
+ "change": 0,
+ "icon": "\ud83d\udea2"
+ },
+ {
+ "label": "Cell Types",
+ "value": 200,
+ "suffix": "+",
+ "change": 0,
+ "icon": "\ud83e\uddec"
+ }
+ ]
+ },
+ {
+ "id": "scene-5-mitochondria",
+ "source": "37-trillion/mitochondria.png",
+ "in_seconds": 20,
+ "out_seconds": 25,
+ "type": "generated",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-6-neurons",
+ "source": "37-trillion/neurons.png",
+ "in_seconds": 25,
+ "out_seconds": 30,
+ "type": "generated",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-7-cell-types",
+ "source": "",
+ "in_seconds": 30,
+ "out_seconds": 35,
+ "type": "bar_chart",
+ "title": "Cell Types by Count",
+ "chartAnimation": "grow-up",
+ "showValues": true,
+ "backgroundColor": "#0F172A",
+ "chartColors": [
+ "#F43F5E",
+ "#10B981",
+ "#F59E0B",
+ "#8B5CF6",
+ "#34D399",
+ "#FBBF24"
+ ],
+ "chartData": [
+ {
+ "label": "Red Blood",
+ "value": 70
+ },
+ {
+ "label": "Platelets",
+ "value": 4.9
+ },
+ {
+ "label": "Bone Marrow",
+ "value": 2.5
+ },
+ {
+ "label": "Endothelial",
+ "value": 2.0
+ },
+ {
+ "label": "Lymphocytes",
+ "value": 1.5
+ },
+ {
+ "label": "Muscle",
+ "value": 0.5
+ }
+ ]
+ },
+ {
+ "id": "scene-8-dna",
+ "source": "37-trillion/dna-replication.png",
+ "in_seconds": 35,
+ "out_seconds": 40,
+ "type": "generated",
+ "backgroundColor": "#0F172A"
+ },
+ {
+ "id": "scene-9-renewal",
+ "source": "",
+ "in_seconds": 40,
+ "out_seconds": 46,
+ "type": "pie_chart",
+ "title": "Cell Renewal Cycle",
+ "donut": true,
+ "centerLabel": "Lifespan",
+ "centerValue": "Varies",
+ "chartAnimation": "spin",
+ "backgroundColor": "#0F172A",
+ "chartData": [
+ {
+ "label": "Gut Lining (3-5 days)",
+ "value": 30
+ },
+ {
+ "label": "Skin (2-3 weeks)",
+ "value": 25
+ },
+ {
+ "label": "Red Blood (120 days)",
+ "value": 20
+ },
+ {
+ "label": "Liver (300 days)",
+ "value": 10
+ },
+ {
+ "label": "Bone (10 years)",
+ "value": 10
+ },
+ {
+ "label": "Neurons (lifetime)",
+ "value": 5
+ }
+ ]
+ },
+ {
+ "id": "scene-10-closing",
+ "source": "",
+ "in_seconds": 46,
+ "out_seconds": 50,
+ "type": "text_card",
+ "text": "Thirty-seven trillion cells.\nEach one alive. Each one working.\nAll of them, you.",
+ "fontSize": 36,
+ "color": "#F8FAFC",
+ "backgroundColor": "#0F172A"
+ }
+ ],
+ "overlays": [
+ {
+ "id": "overlay-origin-section",
+ "type": "section_title",
+ "in_seconds": 0,
+ "out_seconds": 9,
+ "text": "THE ORIGIN",
+ "subtitle": "What you are made of",
+ "accentColor": "#F59E0B",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-stat-dividing",
+ "type": "stat_reveal",
+ "in_seconds": 4,
+ "out_seconds": 9,
+ "text": "25M/sec",
+ "subtitle": "cells dividing right now",
+ "accentColor": "#FBBF24",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-transport-section",
+ "type": "section_title",
+ "in_seconds": 9,
+ "out_seconds": 20,
+ "text": "THE TRANSPORT",
+ "subtitle": "A river of life",
+ "accentColor": "#F43F5E",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-stat-vessels",
+ "type": "stat_reveal",
+ "in_seconds": 9,
+ "out_seconds": 14,
+ "text": "60K",
+ "subtitle": "miles of blood vessels",
+ "accentColor": "#F43F5E",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-engine-section",
+ "type": "section_title",
+ "in_seconds": 20,
+ "out_seconds": 35,
+ "text": "THE ENGINE",
+ "subtitle": "Power and intelligence",
+ "accentColor": "#10B981",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-stat-speed",
+ "type": "stat_reveal",
+ "in_seconds": 25,
+ "out_seconds": 30,
+ "text": "200mph",
+ "subtitle": "neural signal speed",
+ "accentColor": "#8B5CF6",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-blueprint-section",
+ "type": "section_title",
+ "in_seconds": 35,
+ "out_seconds": 46,
+ "text": "THE BLUEPRINT",
+ "subtitle": "Instructions for life",
+ "accentColor": "#34D399",
+ "position": "top-left"
+ }
+ ],
+ "captions": [
+ {
+ "word": "You",
+ "startMs": 0,
+ "endMs": 260
+ },
+ {
+ "word": "are",
+ "startMs": 260,
+ "endMs": 460
+ },
+ {
+ "word": "made",
+ "startMs": 460,
+ "endMs": 720
+ },
+ {
+ "word": "of",
+ "startMs": 720,
+ "endMs": 980
+ },
+ {
+ "word": "37",
+ "startMs": 980,
+ "endMs": 1580
+ },
+ {
+ "word": "trillion",
+ "startMs": 1580,
+ "endMs": 2300
+ },
+ {
+ "word": "cells.",
+ "startMs": 2300,
+ "endMs": 2700
+ },
+ {
+ "word": "Right",
+ "startMs": 3360,
+ "endMs": 3480
+ },
+ {
+ "word": "now,",
+ "startMs": 3480,
+ "endMs": 3780
+ },
+ {
+ "word": "25",
+ "startMs": 4120,
+ "endMs": 4620
+ },
+ {
+ "word": "million",
+ "startMs": 4620,
+ "endMs": 5040
+ },
+ {
+ "word": "are",
+ "startMs": 5040,
+ "endMs": 5300
+ },
+ {
+ "word": "dividing",
+ "startMs": 5300,
+ "endMs": 5740
+ },
+ {
+ "word": "inside",
+ "startMs": 5740,
+ "endMs": 6160
+ },
+ {
+ "word": "you.",
+ "startMs": 6160,
+ "endMs": 6500
+ },
+ {
+ "word": "Red",
+ "startMs": 7100,
+ "endMs": 7240
+ },
+ {
+ "word": "blood",
+ "startMs": 7240,
+ "endMs": 7460
+ },
+ {
+ "word": "cells",
+ "startMs": 7460,
+ "endMs": 7860
+ },
+ {
+ "word": "race",
+ "startMs": 7860,
+ "endMs": 8200
+ },
+ {
+ "word": "through",
+ "startMs": 8200,
+ "endMs": 8520
+ },
+ {
+ "word": "60",
+ "startMs": 8520,
+ "endMs": 8980
+ },
+ {
+ "word": ",000",
+ "startMs": 8980,
+ "endMs": 9440
+ },
+ {
+ "word": "miles",
+ "startMs": 9440,
+ "endMs": 9700
+ },
+ {
+ "word": "of",
+ "startMs": 9700,
+ "endMs": 9880
+ },
+ {
+ "word": "vessels,",
+ "startMs": 9880,
+ "endMs": 10280
+ },
+ {
+ "word": "delivering",
+ "startMs": 10700,
+ "endMs": 10920
+ },
+ {
+ "word": "oxygen",
+ "startMs": 10920,
+ "endMs": 11500
+ },
+ {
+ "word": "to",
+ "startMs": 11500,
+ "endMs": 11780
+ },
+ {
+ "word": "every",
+ "startMs": 11780,
+ "endMs": 12140
+ },
+ {
+ "word": "corner",
+ "startMs": 12140,
+ "endMs": 12540
+ },
+ {
+ "word": "of",
+ "startMs": 12540,
+ "endMs": 12760
+ },
+ {
+ "word": "your",
+ "startMs": 12760,
+ "endMs": 12840
+ },
+ {
+ "word": "body.",
+ "startMs": 12840,
+ "endMs": 13180
+ },
+ {
+ "word": "Deep",
+ "startMs": 13960,
+ "endMs": 14080
+ },
+ {
+ "word": "within",
+ "startMs": 14080,
+ "endMs": 14400
+ },
+ {
+ "word": "each",
+ "startMs": 14400,
+ "endMs": 14700
+ },
+ {
+ "word": "cell,",
+ "startMs": 14700,
+ "endMs": 15140
+ },
+ {
+ "word": "mitochondria",
+ "startMs": 15580,
+ "endMs": 16200
+ },
+ {
+ "word": "burn",
+ "startMs": 16200,
+ "endMs": 16480
+ },
+ {
+ "word": "fuel",
+ "startMs": 16480,
+ "endMs": 16920
+ },
+ {
+ "word": "into",
+ "startMs": 16920,
+ "endMs": 17280
+ },
+ {
+ "word": "energy,",
+ "startMs": 17280,
+ "endMs": 17720
+ },
+ {
+ "word": "powering",
+ "startMs": 18160,
+ "endMs": 18540
+ },
+ {
+ "word": "everything",
+ "startMs": 18540,
+ "endMs": 19020
+ },
+ {
+ "word": "you",
+ "startMs": 19020,
+ "endMs": 19260
+ },
+ {
+ "word": "do.",
+ "startMs": 19260,
+ "endMs": 19440
+ },
+ {
+ "word": "Your",
+ "startMs": 20220,
+ "endMs": 20480
+ },
+ {
+ "word": "neurons",
+ "startMs": 20480,
+ "endMs": 20900
+ },
+ {
+ "word": "fire",
+ "startMs": 20900,
+ "endMs": 21280
+ },
+ {
+ "word": "electrical",
+ "startMs": 21280,
+ "endMs": 21840
+ },
+ {
+ "word": "signals",
+ "startMs": 21840,
+ "endMs": 22300
+ },
+ {
+ "word": "at",
+ "startMs": 22300,
+ "endMs": 22540
+ },
+ {
+ "word": "200",
+ "startMs": 22540,
+ "endMs": 22980
+ },
+ {
+ "word": "miles",
+ "startMs": 22980,
+ "endMs": 23420
+ },
+ {
+ "word": "per",
+ "startMs": 23420,
+ "endMs": 23680
+ },
+ {
+ "word": "hour,",
+ "startMs": 23680,
+ "endMs": 23960
+ },
+ {
+ "word": "weaving",
+ "startMs": 24400,
+ "endMs": 24580
+ },
+ {
+ "word": "thought,",
+ "startMs": 24580,
+ "endMs": 24980
+ },
+ {
+ "word": "memory,",
+ "startMs": 25520,
+ "endMs": 25760
+ },
+ {
+ "word": "and",
+ "startMs": 26240,
+ "endMs": 26400
+ },
+ {
+ "word": "consciousness.",
+ "startMs": 26400,
+ "endMs": 26920
+ },
+ {
+ "word": "And",
+ "startMs": 27520,
+ "endMs": 27820
+ },
+ {
+ "word": "at",
+ "startMs": 27820,
+ "endMs": 27960
+ },
+ {
+ "word": "the",
+ "startMs": 27960,
+ "endMs": 28080
+ },
+ {
+ "word": "center",
+ "startMs": 28080,
+ "endMs": 28380
+ },
+ {
+ "word": "of",
+ "startMs": 28380,
+ "endMs": 28580
+ },
+ {
+ "word": "it",
+ "startMs": 28580,
+ "endMs": 28680
+ },
+ {
+ "word": "all,",
+ "startMs": 28680,
+ "endMs": 28920
+ },
+ {
+ "word": "DNA,",
+ "startMs": 29360,
+ "endMs": 29520
+ },
+ {
+ "word": "a",
+ "startMs": 30180,
+ "endMs": 30240
+ },
+ {
+ "word": "six",
+ "startMs": 30240,
+ "endMs": 30560
+ },
+ {
+ "word": "-foot",
+ "startMs": 30560,
+ "endMs": 30700
+ },
+ {
+ "word": "strand",
+ "startMs": 30700,
+ "endMs": 31080
+ },
+ {
+ "word": "folded",
+ "startMs": 31080,
+ "endMs": 31640
+ },
+ {
+ "word": "into",
+ "startMs": 31640,
+ "endMs": 31960
+ },
+ {
+ "word": "a",
+ "startMs": 31960,
+ "endMs": 32080
+ },
+ {
+ "word": "space",
+ "startMs": 32080,
+ "endMs": 32320
+ },
+ {
+ "word": "smaller",
+ "startMs": 32320,
+ "endMs": 32840
+ },
+ {
+ "word": "than",
+ "startMs": 32840,
+ "endMs": 33000
+ },
+ {
+ "word": "a",
+ "startMs": 33000,
+ "endMs": 33120
+ },
+ {
+ "word": "grain",
+ "startMs": 33120,
+ "endMs": 33340
+ },
+ {
+ "word": "of",
+ "startMs": 33340,
+ "endMs": 33500
+ },
+ {
+ "word": "sand,",
+ "startMs": 33500,
+ "endMs": 33900
+ },
+ {
+ "word": "carrying",
+ "startMs": 34400,
+ "endMs": 34680
+ },
+ {
+ "word": "the",
+ "startMs": 34680,
+ "endMs": 34900
+ },
+ {
+ "word": "complete",
+ "startMs": 34900,
+ "endMs": 35280
+ },
+ {
+ "word": "instructions",
+ "startMs": 35280,
+ "endMs": 35940
+ },
+ {
+ "word": "for",
+ "startMs": 35940,
+ "endMs": 36280
+ },
+ {
+ "word": "you.",
+ "startMs": 36280,
+ "endMs": 36480
+ },
+ {
+ "word": "37",
+ "startMs": 37040,
+ "endMs": 37640
+ },
+ {
+ "word": "trillion",
+ "startMs": 37640,
+ "endMs": 38140
+ },
+ {
+ "word": "cells,",
+ "startMs": 38140,
+ "endMs": 38580
+ },
+ {
+ "word": "each",
+ "startMs": 39080,
+ "endMs": 39340
+ },
+ {
+ "word": "one",
+ "startMs": 39340,
+ "endMs": 39560
+ },
+ {
+ "word": "alive,",
+ "startMs": 39560,
+ "endMs": 40000
+ },
+ {
+ "word": "each",
+ "startMs": 40580,
+ "endMs": 40780
+ },
+ {
+ "word": "one",
+ "startMs": 40780,
+ "endMs": 40960
+ },
+ {
+ "word": "working,",
+ "startMs": 40960,
+ "endMs": 41400
+ },
+ {
+ "word": "all",
+ "startMs": 41860,
+ "endMs": 42160
+ },
+ {
+ "word": "of",
+ "startMs": 42160,
+ "endMs": 42320
+ },
+ {
+ "word": "them,",
+ "startMs": 42320,
+ "endMs": 42540
+ },
+ {
+ "word": "you.",
+ "startMs": 42960,
+ "endMs": 43220
+ }
+ ],
+ "audio": {
+ "narration": {
+ "src": "37-trillion/narration.mp3",
+ "volume": 1
+ },
+ "music": {
+ "src": "37-trillion/music.mp3",
+ "volume": 0.08,
+ "fadeInSeconds": 2,
+ "fadeOutSeconds": 3
+ }
+ }
+}
\ No newline at end of file
diff --git a/remotion-composer/public/demo-props/lumina.json b/remotion-composer/public/demo-props/lumina.json
new file mode 100644
index 00000000..7da1ef99
--- /dev/null
+++ b/remotion-composer/public/demo-props/lumina.json
@@ -0,0 +1,238 @@
+{
+ "cuts": [
+ {
+ "id": "scene-1-dark-open",
+ "source": "",
+ "in_seconds": 0,
+ "out_seconds": 3,
+ "type": "text_card",
+ "text": "WHAT IF LIGHT...",
+ "fontSize": 56,
+ "color": "#22D3EE",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-2-bio-glow",
+ "source": "lumina/bio-glow.png",
+ "in_seconds": 3,
+ "out_seconds": 7,
+ "type": "generated",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-3-could-live",
+ "source": "",
+ "in_seconds": 7,
+ "out_seconds": 10,
+ "type": "text_card",
+ "text": "...COULD LIVE?",
+ "fontSize": 56,
+ "color": "#A78BFA",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-4-mushroom",
+ "source": "lumina/bio-mushroom.png",
+ "in_seconds": 10,
+ "out_seconds": 14,
+ "type": "generated",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-5-bio-data",
+ "source": "",
+ "in_seconds": 14,
+ "out_seconds": 19,
+ "type": "kpi_grid",
+ "title": "The Science of Living Light",
+ "columns": 3,
+ "chartAnimation": "cascade",
+ "backgroundColor": "#030712",
+ "chartData": [
+ {
+ "label": "Glow Duration",
+ "value": 200,
+ "prefix": "",
+ "suffix": "+ hrs",
+ "change": 100,
+ "icon": "✨"
+ },
+ {
+ "label": "Electricity",
+ "value": 0,
+ "prefix": "",
+ "suffix": " watts",
+ "change": 0,
+ "icon": "⚡"
+ },
+ {
+ "label": "Lifespan",
+ "value": 2,
+ "prefix": "",
+ "suffix": "+ years",
+ "change": 24,
+ "icon": "🌱"
+ }
+ ]
+ },
+ {
+ "id": "scene-6-terrarium-hero",
+ "source": "lumina/terrarium-hero.png",
+ "in_seconds": 19,
+ "out_seconds": 23,
+ "type": "generated",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-7-reveal-title",
+ "source": "",
+ "in_seconds": 23,
+ "out_seconds": 27,
+ "type": "hero_title",
+ "text": "LUMINA",
+ "heroSubtitle": "A living nightlight. Engineered from nature.",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-8-interior",
+ "source": "lumina/terrarium-interior.png",
+ "in_seconds": 27,
+ "out_seconds": 31,
+ "type": "generated",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-9-comparison",
+ "source": "",
+ "in_seconds": 31,
+ "out_seconds": 35,
+ "type": "comparison",
+ "title": "Rethink Your Nightlight",
+ "leftLabel": "Traditional Lamp",
+ "leftValue": "60W · $85/yr · Plastic",
+ "rightLabel": "LUMINA",
+ "rightValue": "0W · $0/yr · Living",
+ "backgroundColor": "#030712",
+ "color": "#F8FAFC"
+ },
+ {
+ "id": "scene-10-bar-chart",
+ "source": "",
+ "in_seconds": 35,
+ "out_seconds": 39,
+ "type": "bar_chart",
+ "title": "Glow Intensity by Species",
+ "chartAnimation": "grow-up",
+ "showValues": true,
+ "backgroundColor": "#030712",
+ "chartColors": ["#22D3EE", "#0D9488", "#3B82F6", "#A78BFA", "#F59E0B"],
+ "chartData": [
+ { "label": "Sea Spark", "value": 95 },
+ { "label": "Panellus", "value": 92 },
+ { "label": "Dinoflagellate", "value": 87 },
+ { "label": "Mycena", "value": 78 },
+ { "label": "Foxfire", "value": 65 }
+ ]
+ },
+ {
+ "id": "scene-11-lifestyle",
+ "source": "lumina/terrarium-lifestyle.png",
+ "in_seconds": 39,
+ "out_seconds": 43,
+ "type": "generated",
+ "backgroundColor": "#030712"
+ },
+ {
+ "id": "scene-12-cta",
+ "source": "",
+ "in_seconds": 43,
+ "out_seconds": 48,
+ "type": "stat_card",
+ "stat": "$249",
+ "subtitle": "Available Now · Free Worldwide Shipping · lumina.bio",
+ "accentColor": "#22D3EE",
+ "backgroundColor": "#030712"
+ }
+ ],
+ "overlays": [
+ {
+ "id": "overlay-mystery",
+ "type": "section_title",
+ "in_seconds": 0,
+ "out_seconds": 14,
+ "text": "MYSTERY",
+ "subtitle": "What glows in the dark?",
+ "accentColor": "#22D3EE",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-stat-ancient",
+ "type": "stat_reveal",
+ "in_seconds": 3,
+ "out_seconds": 7,
+ "text": "76%",
+ "subtitle": "of deep sea life glows",
+ "accentColor": "#3B82F6",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-stat-age",
+ "type": "stat_reveal",
+ "in_seconds": 10,
+ "out_seconds": 14,
+ "text": "4.5B yrs",
+ "subtitle": "nature's oldest light",
+ "accentColor": "#F59E0B",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-product",
+ "type": "section_title",
+ "in_seconds": 19,
+ "out_seconds": 35,
+ "text": "THE PRODUCT",
+ "subtitle": "Engineered bioluminescence",
+ "accentColor": "#0D9488",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-stat-zero",
+ "type": "stat_reveal",
+ "in_seconds": 27,
+ "out_seconds": 31,
+ "text": "0W",
+ "subtitle": "zero electricity forever",
+ "accentColor": "#22D3EE",
+ "position": "bottom-right"
+ },
+ {
+ "id": "overlay-proof",
+ "type": "section_title",
+ "in_seconds": 35,
+ "out_seconds": 43,
+ "text": "THE PROOF",
+ "subtitle": "Data-driven beauty",
+ "accentColor": "#A78BFA",
+ "position": "top-left"
+ },
+ {
+ "id": "overlay-close",
+ "type": "section_title",
+ "in_seconds": 43,
+ "out_seconds": 48,
+ "text": "AVAILABLE NOW",
+ "subtitle": "lumina.bio",
+ "accentColor": "#22D3EE",
+ "position": "top-left"
+ }
+ ],
+ "captions": [],
+ "audio": {
+ "music": {
+ "src": "lumina/music.mp3",
+ "volume": 0.3,
+ "fadeInSeconds": 2,
+ "fadeOutSeconds": 3
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/base_tool.py b/tools/base_tool.py
index a40c774e..88f7dddf 100644
--- a/tools/base_tool.py
+++ b/tools/base_tool.py
@@ -19,6 +19,31 @@ from pathlib import Path
from typing import Any, Callable, Optional
+def _load_dotenv() -> None:
+ """Load .env into os.environ once at import time.
+
+ This ensures API keys are available before any tool is instantiated,
+ even when tools are imported directly without going through the registry.
+ Only sets variables that are not already in the environment.
+ """
+ env_path = Path(__file__).resolve().parent.parent / ".env"
+ if not env_path.is_file():
+ return
+ with open(env_path, encoding="utf-8", errors="ignore") as f:
+ for line in f:
+ line = line.strip()
+ if not line or line.startswith("#") or "=" not in line:
+ continue
+ key, _, value = line.partition("=")
+ key = key.strip()
+ value = value.strip().strip("'\"")
+ if key and key not in os.environ:
+ os.environ[key] = value
+
+
+_load_dotenv()
+
+
class ToolTier(str, Enum):
CORE = "core"
VOICE = "voice"